2013-12-13 16 views
2

我从来没有使用Fragments,但现在我有一个PlayerStatus片段,我想在两个不同的活动中使用它。它显示播放器状态:getFragmentById返回null

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; 
} 

}

碎片的布局是这样的:

<?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> 

我得到它的活动是这样的:

@Override 
protected void onResume() { 
    super.onResume(); 
    setContentView(R.layout.game); 
    fPlayerStatus = (PlayerStatus)  getFragmentManager().findFragmentById(R.id.fPlayerStatus); 

fPlayerStatus总是返回null 。 我在做什么错?

回答

1

阅读关于如何启动片段,连接/从活动分离,这是什么的commit()做的,还有,你应该使用片段

http://developer.android.com/guide/components/fragments.html

Fragment Basics Tutorial

当知道几个基本功能

通过这些网站,你会很容易地通过片段。

为了让您的片段在这里工作,你有以下操作: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(); 

__ _ __ _ __ _ __ _END ----------------------------------

T这里有很多来自FragmentTransaction的API中的其他有用的方法,通过上面的链接阅读它们,你会很容易地使用它们。

Lemme知道它是否有帮助。

+0

谢谢!它帮助 - 现在我有IllegalArgumentException,而不是NPE :)我已经多次阅读这些文章,我想通过xml layout =>静态添加片段(如developer.android.com/guide/components/fragments.html中所述)添加)“当系统创建这个活动布局时,它会实例化布局中指定的每个片段并为每个片段调用onCreateView()方法来检索每个片段的布局。系统直接插入片段返回的View来代替元素“。 –

+0

所以我认为我不必使用fragmentTransactions(和framelayout)。但现在 - 使用fragmentTransactions - 我应该使用frameLayout,是吗? –

+0

您的意思是您的XML文件中定义碎片的主布局。不管你是否可以使用任何布局 – Khay

1

您的片段尚未被添加到您的活动中的FragmentManager。 首先在getFragmentManager()上做一个FragmentTransactionbeginTransaction().add(...)。 而且别忘了commit()吧。

+0

但我认为(因为这个:http://developer.android.com/guide/components/fragments.html#Adding),因为我在xml中添加片段它肩膀d被系统实例化了吗? –

0

我不认为你可以使用一个片段进行两项活动。 因为我认为你的做法应该是

步骤1

在Activity_main创建两个片段布局

步骤2

然后利用片段经理在活动像下面

FragmentManager fragmentManager = getFragmentManager(); 

FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 

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

fragmentTransaction.commit(); 
+2

nop这是碎片的最好的部分,它们被用于因为它们是可重用的,所以你可以非常好地在两个不同的活动中使用片段而没有任何问题,因为你创建两个不同的对象并将这两个对象传递给两个不同的活动。 – Khay