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

时间:2013-07-21 16:00:05

标签: android ui-thread

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

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

4 个答案:

答案 0 :(得分:11)

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

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

答案 1 :(得分:2)

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

答案 2 :(得分:0)

当我尝试在onActivityResult()上创建并显示AlertDialog时,我会收到一个“android.view.WindowLeaked”错误 android.view.WindowLeaked:

活动com ... MainActivity泄露了窗口com.android.internal.policy.impl.PhoneWindow $ DecorView {37ac7e30 V.E ..... R ..... I。最初添加的0,01272,584}

一旦我尝试显示对话框。

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

答案 3 :(得分: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);
  }

在目标片段中 ChooseBankNameFragment

  

在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();