Android UI:什么时候可以直接修改视图



我有一个包含两个活动的应用程序。从主活动开始,我使用startActivityForResult()开始一个辅助活动。次要活动将数据(以Intent对象的形式)返回给主要活动。在主要活动上,我有一个方法onActivityResult()来处理从次要活动返回的问题。

在这个onActivityResult()方法中,我需要更新主活动上的View(以反映新的数据值)。我没有明确生成任何线程。我的问题是:我可以直接从onActivityResult()方法中修改视图吗?还是需要在UI队列中放置一个事件来修改视图?更明确地说:我能确定onActivityResult()方法在UI线程上吗?在这种情况下,我能忘记UI队列吗?

尽管onActivityResult在Ui线程上,但在onActivityResult中修改时可能看不到更新的Ui。我怀疑原因是在onResume处重新绘制Ui元素,这通过在super.onResume()处调用ActivityTransitionStateresetViews()来强制重置Ui元素。

我在简单地更新onActivityResult中的EditText时遇到了这个问题。EditText未更新。

解决方法是将数据保存在onActivityResult中,并通过在onActivityResult中设置标志来更新onResume中的Ui。

  1. 可以,您可以在onActivityResult()中修改视图。在onCreate()中调用setContentView()后,只要在UI线程上运行,就可以随时修改Activity的视图。

  2. 是的,在UI线程上调用onActivityResult()。这适用于所有生命周期方法(onCreate()onResume()等)。

onActivityResult()在UI线程中执行,您可以修改此方法的视图。

当我试图在制作照片后返回的onActivityResult()上创建并显示AlertDialog时,我会收到一个"android.view.WindowLeaked"错误android.view.WindowLeaked:

Activity com…MainActivity泄露了最初添加到此处的window com.android.internal.policy.impl.PhoneWindow$DecorView{37ac7e30 V.E…..R….I,0-1272584}

只要我尝试显示对话框。

因此,我认为假设OnActivityResult()在主线程上运行并不总是可以的。

最新更新