【问题标题】:Update fragment from Activity from different thread从不同线程的 Activity 更新片段
【发布时间】:2016-06-21 13:15:15
【问题描述】:

我对 Androind 很陌生,试图弄清楚片段和活动应该如何协同工作。我有一个非常丑陋的布局。 1 个活动和 1 个“根”片段。当用户单击左侧菜单片段时,片段管理器将替换它。

expandableList.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() {
    @Override
    public boolean onGroupClick(ExpandableListView expandableListView, View view, int i, long l) {

        LeftMenuItem group = groups.get(i);
        String fragmentTag = group.getFragmentTag();
        if (fragmentTag.equals(Fragment1.TAG)) {
            Fragment1 fragment = (Fragment1) currentFragmentManager.findFragmentByTag(Fragment1.TAG);
            if (fragment == null) {
                fragment = new Fragment1();
            }
            FragmentTransaction ft = currentFragmentManager.beginTransaction();
            ft.replace(R.id.root_frame, fragment, Fragment1.TAG);
            ft.commitAllowingStateLoss();

        } else if (fragmentTag.equals(Fragment2.TAG)) { 

我假设上面的代码应该用新的片段替换当前片段。片段实际上总是空的。我不知道为什么。

在RootFragment的onCreateView中默认创建Fragment1。

    if (savedInstanceState == null) {
        Log.d(TAG, "savedInstanceState is null, creating Framgent1");

        Fragment1 fragment = new Fragment1();
        FragmentTransaction ft = currentFragmentManager.beginTransaction();
        ft.replace(R.id.root_frame, fragment, Fragment1.TAG);
        ft.commitAllowingStateLoss();
    }

在rootFragment的onCreateView中,rootFragment用另一个Fragment1替换了自己,这对我来说看起来很丑。它是众所周知的 Android 模式还是只是糟糕的设计?

假设使用 Volley 从 MyActivity 的 onCreateView 发送 httpRequest。收到响应后,我需要从回调中更新 Fragment1 UI。我该怎么做?

  1. 我应该尝试在我的活动中使用 findFragmentByTag 查找片段并直接更新 UI 吗? http volley 响应是否在同一个线程中?如果不是,可以从不同线程更新 UI 吗?

  2. 我应该使用 Handler 类将消息从 Activity 发送到 Fragment 吗?

【问题讨论】:

    标签: android android-fragments


    【解决方案1】:
    1. 我应该尝试在我的活动中使用 findFragmentByTag 查找片段并直接更新 UI 吗? http volley 响应是否在同一个线程中?如果否,是否可以从不同线程更新 UI?

    findFragmentByTag 将无用,因为一旦替换 调用,前一个片段被销毁。如果你只有少数 要切换的片段,可以使用以下解决方案:

    How can I switch between two fragments, without recreating the fragments each time?

    回答问题 1 的第二部分:

    Volley 响应总是在主线程上完美调用 可以在回调上更新 UI。你永远不应该更新 UI 元素 在 MAIN / UI 线程以外的任何线程上。

    1. 我应该使用 Handler 类将消息从 Activity 发送到 Fragment 吗?

    您可以选择通过处理程序发送消息,但如果通常 android 文档建议通过回调在活动和附加片段之间发送通信

    https://developer.android.com/training/basics/fragments/communicating.html

    【讨论】:

      猜你喜欢
      • 2021-07-27
      • 1970-01-01
      • 1970-01-01
      • 2017-03-30
      • 1970-01-01
      • 1970-01-01
      • 2010-10-18
      • 1970-01-01
      相关资源
      最近更新 更多