10

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

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

4

5 回答 5

13

虽然onActivityResult在 Ui 线程上,但在onActivityResult. 我怀疑原因是重绘 Ui 元素,通过调用atonResume强制 ui 元素重置。resetViews()ActivityTransitionStatesuper.onResume()

EditText我在简单地更新inside时遇到了这个问题onActivityResultEditText没有更新。

解决方法是onActivityResult通过onResumeonActivityResult.

于 2015-09-13T15:11:17.850 回答
11
  1. 是的,您可以在onActivityResult(). 只要您在 UI 线程上运行,您就可以在调用 后随时修改Activity视图。setContentView()onCreate()

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

于 2013-07-21T16:31:46.060 回答
2

onActivityResult() 在 UI 线程中执行,你可以在这个方法上修改视图。

于 2013-07-21T16:10:44.840 回答
0

当我尝试在拍摄照片后返回的 onActivityResult() 上创建并显示 AlertDialog 时,我收到“android.view.WindowLeaked”错误 android.view.WindowLeaked:

Activity com...MainActivity 已泄露窗口 com.android.internal.policy.impl.PhoneWindow$DecorView{37ac7e30 VE.... R....I. 0,0-1272,584} 最初添加在这里

一旦我尝试显示对话框。

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

于 2015-07-06T06:20:31.313 回答
0

在当前片段 中 AddNewAccountFragment

 public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
      if (resultCode == RESULT_OK) {
          if (requestCode == Constants.CHOOSE_BANK_REQUEST_CODE) {
              bankName = data.getStringExtra("BANK_NAME");
                if (!TextUtils.isEmpty(bankName)) {
                   mChooseBankEdittext.setText(bankName);
                   mReceivedBankName = bankName;
                }
            }
        }
    }

// if sending data from next fragment to previous fragment using OnActivityResult.

在 OnResume 中的Edittext上的 setText 。

  @Override
  public void onResume() {
    super.onResume();
    mChooseBankEdittext.setText(bankName);
  }

在目标片段 中选择银行名称片段

在 Fragment 中的 onClick() 下面执行

Intent intent = new Intent(getActivity(), AddNewAccountFragment.class);
 intent.putExtra("BANK_NAME", bankName);
 if (getFragmentManager().findFragmentByTag("AddNewAccountFragment") != null)
           getFragmentManager().findFragmentByTag("AddNewAccountFragment").onActivityResult(Constants.CHOOSE_BANK_REQUEST_CODE, RESULT_OK, intent);
 getActivity().getSupportFragmentManager().popBackStack();
于 2017-05-03T05:28:53.453 回答