FragmentManager findFragmentById返回null

sin*_*ory 5 android android-fragments

activity_fragment.xml的代码:

<?xml version="1.0" encoding="utf-8" ?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/fragmentContainer"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
/>
Run Code Online (Sandbox Code Playgroud)

CrimeListActivity.java的代码

package com.sinory.criminalintent;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.util.Log;

public class CrimeListActivity extends SingleFragmentActivity {

    @Override
    protected Fragment createFragment() {
        return new CrimeListFragment();
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Log.d("CrimeListActivity", "create");
    }

}
Run Code Online (Sandbox Code Playgroud)

SingleFragmentActivity.java的代码

package com.sinory.criminalintent;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;

public abstract class SingleFragmentActivity extends FragmentActivity {

    protected abstract Fragment createFragment();

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_fragment);

        FragmentManager fm = getSupportFragmentManager();
        Fragment fragment = fm.findFragmentById(R.id.fragmentContainer);

        if (null == fragment) {
            fragment = new CrimeListFragment();
            fm.beginTransaction().add(R.id.fragmentContainer, fragment).commit();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

刚开始学习Android.为什么Fragment fragment = fm.findFragmentById(R.id.fragmentContainer)为空?请帮我.

Rez*_*adi 11

首先,您不需要检查片段是否为空,因为当一个活动销毁所有片段时也将被销毁.因此在活动onCreate中将没有片段,您需要在每次重新创建活动时添加它.
其次不要使用findFragmentById.在xml文件中定义片段时,只能使用此方法.既然您动态添加了片段,则需要指定字符串标记,然后使用该标记来查找片段.

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_fragment);

    FragmentManager fm = getSupportFragmentManager();
    fm.beginTransaction().add(R.id.fragmentContainer, fragment,"TagName").commit();
}
Run Code Online (Sandbox Code Playgroud)

如果您需要找到您的片段,只需使用此代码即可

Fragment fragment = fm.findFragmentByTag("TagName");
Run Code Online (Sandbox Code Playgroud)


2019年1月9日更新
自2018年起,您只需使用Google导航库在应用程序中的页面(片段)之间导航即可.它将处理所有事务,并使导航更容易和更清洁.在这里查看 https://developer.android.com/topic/libraries/architecture/navigation/

  • “只有在 xml 文件中定义片段时才使用此方法。” 这并不完全正确。您可以在 activity.xml 中将片段添加到指定的 ViewGroup: getFragmentManager() .beginTransaction() .add(R.id.someFrameLayoutForExample, new MainFragment()) .commit(); 然后检索它 getFragmentManager().findFragmentById(R.id.someFrameLayoutForExample); 这里的关键点和使用 findFragmentByTag() 是在查找之前必须先添加。无论如何完成 - 通过 xml 或代码。 (2认同)