【问题标题】:FragmentManager findFragmentById returns null on second timeFragmentManager findFragmentById 第二次返回 null
【发布时间】:2015-12-22 11:45:47
【问题描述】:

我在我的 Activity 的 onCreate() 方法上添加了一个片段。然后,我尝试使用 findFragmentByTag() 访问它。它第一次工作,但如果我回击关闭我的活动并再次启动它,findFragmentByTag() 返回 null。

在这两种情况下,片段都在我的活动中直观地呈现。当我关闭 Activity 时,会调用片段的 onDestroy() 方法。

我使用 replace() 代替 add() 和使用 findFragmentById() 代替 findFragmentByTag() 的结果相同。

MyActivity.java

import android.support.v4.app.FragmentManager;
import android.support.v7.app.AppCompatActivity;

public class MyActivity extends AppCompatActivity {

    @Override
    protected void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_layout);

        final MyFragment fragment = new MyFragment();
        final FragmentManager fm = getSupportFragmentManager();
        // fm.getFragments() returns null
        fm.beginTransaction()
            .add(R.id.content_frame, fragment, "MyFragment")
            .commit();
    }

    private void onReceiveData() {
        final FragmentManager fm = getSupportFragmentManager();
        // fm.getFragments() returns an array with one null element (except on first try)
        final MyFragment fragment = (MyFragment) fm.findFragmentByTag("MyFragment");
        // Fragment is null except during the first launch of MyActivity
    }
}

MyFragment.java

import android.support.v4.app.Fragment;

public class MyFragment extends Fragment {
    ...
}

R.layout.activity_layout

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/content_frame"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

知道为什么 findFragmentByTag() 只能在第一次工作吗?

【问题讨论】:

  • 何时调用 onReceiveData ??
  • getSupportFragmentManager().executePendingTransactions()
  • @AshishAgrawal 当我从网络接收数据时调用它。我在 onResume() 上调用请求。
  • 您是否尝试用 addToBackStack 替换添加片段
  • @AshishAgrawal 是的,正如我在帖子中所说的那样。

标签: android android-fragments


【解决方案1】:

我找到了问题的原因。它实际上很简单,与上面发布的代码无关。

它是由 EventBus 引起的,我在接收来自网络的数据时调用 onReceiveData 方法。我忘记在 MyActivity onDestroy 方法上取消订阅 EventBus,这导致了这种奇怪的行为。

还是谢谢!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-14
    • 2013-06-27
    • 2023-03-03
    • 1970-01-01
    • 2012-06-05
    • 1970-01-01
    相关资源
    最近更新 更多