FragmentManager findFragmentById第二次返回null

时间:2015-12-22 11:45:47

标签: android android-fragments

我在Activity的onCreate()方法中添加了一个Fragment。然后,我尝试使用findFragmentByTag()访问它。它第一次工作,但如果我回击关闭我的Activity并再次启动它,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()只能在第一次工作?

1 个答案:

答案 0 :(得分:0)

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

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

非常感谢!