2013-12-13 17 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