2012-05-02 44 views
7

我對Android很新,所以這可能有一個明顯的答案,但我似乎無法找到它。Android:爲活動添加片段

我在寫一個計算器應用程序的版本。我想這樣做是爲了當用戶點擊其中一個按鈕時,這會啓動一個片段(使用更多的按鈕,然後可以用於更多的輸入)。

片段代碼如下:

import android.app.Fragment; 
import android.os.Bundle; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 

public class VariableMenu extends Fragment { 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState);} 

    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 

    } 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 

     return inflater.inflate(R.layout.fragment, container, false); 
} 

} 

使用一個XML佈局如下:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" > 

<Button 
     android:id="@+id/Bx" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="X" 
     android:onClick="onButtonClicked"/> 
    <Button 
     android:id="@+id/By" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_toRightOf="@id/Bx" 
     android:layout_alignTop="@id/Bx" 
     android:text="Y" 
     android:onClick="onButtonClicked"/> 
    <Button 
     android:id="@+id/Bz" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_toRightOf="@id/By" 
     android:layout_alignTop="@id/By" 
     android:text="Z" 
     android:onClick="onButtonClicked"/> 

</RelativeLayout> 

(我知道我不應該使用硬編碼字符串中,但我會修復,一旦我得到的東西運行)

我試着讓它使用ontouch方法的激活按鈕,像這樣的fragmenttransaction添加:

public void onFragmentActivated(View v) { 
     FragmentManager fragmentManager = getFragmentManager(); 
     FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
     VariableMenu fragment = new VariableMenu(); 
     fragmentTransaction.add(R.layout.main, fragment); 
     fragmentTransaction.commit(); 
    } 

但是,這給出了一個錯誤,說有沒有找到ID:...的視圖(主)爲片段VariableMenu。「

於是我主要的XML文件中提出了看法吧:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 

(Irrelevant things) 

    <fragment 
     android:id="@+id/Fragment" 
     android:name="calculator.app.VariableMenu" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_below="@id/B1"/> 

(Irrelevant things) 

</RelativeLayout> 

,但是這導致在該片段中,一旦在那裏的活動創建(和的setContentView(R.layout.main) ;跑)。

有沒有一種簡單的方法來編程地添加和刪除一個UI的片段到一個活動?

回答

11

這裏的問題是,片段需要一個容器與視圖ID駐留在。給它一個佈局ID將導致你看到的錯誤。

您可以將片段添加到您的相對佈局中,但要正確執行此操作,您需要爲其分配合適的佈局參數以便放置它。在包裝其內容的相對佈局中創建一個FrameLayout會更容易,然後在那裏添加片段。

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 

    <FrameLayout 
     android:id="@+id/FragmentContainer" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_below="@id/B1"/> 

</RelativeLayout> 

然後

fragmentTransaction.add(R.id.FragmentContainer, fragment); 
+1

+1。 @Spencer還有,如果你的片段可以作爲一個單獨的活動,你可以改變它來擴展FragmentActivity,並像普通活動那樣對待它。 – Joe

+0

非常感謝你,這非常完美。我不認爲FragmentActivity在這種情況下會起作用,但我會在將來考慮這個選項。 – Spencer