Android getFragmentById返回null

Android getFragmentById返回null,android,android-fragments,null,Android,Android Fragments,Null,我以前从未使用过片段,但现在我有一个PlayerStatus片段,我想在两种不同的活动中使用它。它显示玩家状态: public class PlayerStatus extends Fragment { Player player; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflat

我以前从未使用过片段,但现在我有一个PlayerStatus片段,我想在两种不同的活动中使用它。它显示玩家状态:

public class PlayerStatus extends Fragment {
Player player;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.player_status, container, false);
    return view;
}

public void setPlayer(Player player) {
    this.player = player;
}  
}

Fragment的布局如下所示:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:orientation="vertical"
android:paddingTop="0dp" >

<include
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginLeft="5dp"
    layout="@layout/money" />

<include
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginLeft="5dp"
    layout="@layout/wins" />

<include
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginLeft="5dp"
    layout="@layout/level" />

</LinearLayout>
fPlayerStatus始终返回null。
我做错了什么

您的片段尚未添加到活动中的
FragmentManager
。 首先使用
beginTransaction()执行
FragmentTransaction
。在
getFragmentManager()上添加(…)

不要忘了
commit()
it.

阅读有关如何启动片段、从活动附加/分离、commit()的作用以及使用片段时应该知道的基本函数

浏览这些网站,你肯定会很容易地找到这些片段

要使片段在此处工作,您必须执行以下操作: 1.将片段添加到活动中 写下

FragmentManager fragmentManager = getFragmentManager()
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

fragmentTransaction.add(R.id.YOUR_FRAGMENT_ID_AS_DEFINED_IN_XML , object of your fragment class)

fragmentTransaction.commit();
结束----------------------------------

在FragmentTransaction的API中还有许多其他有用的方法,通过上面的链接阅读它们,您将很容易使用它们


让我知道它是否有用。

我认为你不能用一个片段来完成两个活动。 我认为你的方法应该是

第一步

在活动\u主目录中创建两个片段布局

步骤2

然后在下面的活动中使用片段管理器

FragmentManager fragmentManager = getFragmentManager();

FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();  

fragmentTransaction.add(R.id.frame,fragment) 

fragmentTransaction.commit();

但我认为(因为这个:)当我在xml中添加片段时,它应该由系统实例化?不,这是片段最好的部分,它们之所以被使用是因为它们是可重用的,您可以在两个不同的活动中很好地使用片段,不会出现任何问题,因为您创建了两个不同的对象,并将这两个对象传递给两个不同的活动。谢谢!这很有帮助-现在我有了IllegalArgumentException,而不是NPE:)我已经阅读了好几次这些文章,我想通过XMLLayout=>(如developer.android.com/guide/components/fragments.html中所述)静态添加片段“当系统创建此活动布局时,它实例化布局中指定的每个片段,并为每个片段调用onCreateView()方法,以检索每个片段的布局。系统直接插入片段返回的视图来代替元素。”所以我认为我不必使用fragmentTransactions(和framelayout)但是现在-使用fragmentTransactions-我应该使用frameLayout,是吗?你是指xml文件中定义片段的主布局。不,你可以使用任何布局,不管是12-13 16:12:46.919:E/AndroidRuntime(12501):java.lang.RuntimeException:无法恢复活动{app.lws/app.lws.ui.game.GameActivity}:java.lang.IllegalArgumentException:fragment PlayerStatus的id 0x7f040065(app.lws:id/fPlayerStatus)找不到任何视图fragment PlayerStatus fragment{42ed1c48#0 id=0x7f040065 fPlayerStatus}我对您的代码做了一些更改,fragment具有唯一的id和唯一的标记。我在onCreate和onResume中设置了contentview,但是……请帮助我,出了什么问题?
FragmentManager fragmentManager = getFragmentManager();

FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();  

fragmentTransaction.add(R.id.frame,fragment) 

fragmentTransaction.commit();