【问题标题】:Android UI: when can I directly modify a view?Android UI:什么时候可以直接修改视图?
【发布时间】:2013-07-21 16:00:05
【问题描述】:

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

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

【问题讨论】:

    标签: android ui-thread


    【解决方案1】:

    虽然onActivityResult 在 Ui 线程上,但在 onActivityResult 中修改时,您可能看不到 UI 更新。我怀疑原因是在onResume 处重绘Ui 元素,这会通过在super.onResume() 处调用resetViews()ActivityTransitionState 来强制重置ui 元素。

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

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

    【讨论】:

    • 我刚刚度过了一个美好的地狱时光。谢谢!
    • 非常感谢我试图在 onActivityResult 中更新我的观点,但这个答案真的帮助了我很多
    【解决方案2】:
    1. 是的,您可以修改onActivityResult() 中的视图。你可以在onCreate()中调用setContentView()之后随时修改Activity的视图,只要你在UI线程上运行。

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 谢谢!并且修改视图后,需要调用invalidate()吗?我对何时需要调用 invalidate() 感到有点困惑
      【解决方案4】:

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

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

      当我尝试显示对话框时。

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

      【讨论】:

        【解决方案5】:

        在当前片段中 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上设置Text。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-02-24
          • 1970-01-01
          • 2012-08-16
          • 2023-04-09
          • 1970-01-01
          • 1970-01-01
          • 2011-05-25
          相关资源
          最近更新 更多