2011-09-06 80 views
19

這是一個設計問題,而不是技術問題。Android:在片段之間跳躍的正確方法

一般情況下:我想在一個片段的UI事件進行整個活動的變化。

具體案例:我有兩個片段,託管在同一活動中。當用戶點擊其中一個片段的按鈕時,我希望它被另一個替換。

不想要,但是,我的碎片觸及我的活動。我可能想稍後改變行爲(也許,在更大的屏幕上,顯示兩個片段而不是替換第一個片段),並且我不希望我的Fragment代碼具有該邏輯。

我所做的是在我的片段中實現Listener類,該類將事件報告回Activity。這樣,如果我想使用具有不同顯示行爲的另一個Activity類,則可以更改偵聽器並保持Fragment代碼不變。

這是一個好方法嗎?是否有標準的良好實踐或更好的設計模式?

回答

12

使用監聽器是Fragment與您的活動之間進行通信的推薦方式。

查看此Android documentatin section的infromation。長話短說,他們只是通過Activity類實現一個監聽器接口,並將getActivity()結果轉換爲一個監聽器的片段。

從我個人的經驗,這是非常方便,因爲可以讓你:

  1. Easilly切換基本活動(例如你的主機的兼容性在包裝活動的全片段預3.0,並與他人一起舉辦這個片段在11+中)
  2. 如果包裝器活動支持回調或不支持,輕鬆控制。只是檢查它是否實現了監聽器,如果沒有,則執行特定於您的應用程序的操作。
2

你對使用監聽器是正確的。這是我在工作中還必須處理的一個項目。處理這個問題的最好方法是讓碎片本身獨立。任何希望與Fragment交互的人都應該使用其公共API和/或爲特定事件設置監聽器。如果您熟悉Design Patterns,這是Observer pattern。事件可以是一般的或特定的,也可以包含數據或不包含數據。

作爲我的項目的一個例子,我有兩個片段。一個ListFragment和一個顯示所選ListItem的InfoFragment。 ListFragment已經有一個Listener接口供我的Activity掛鉤,但InfoFragment並沒有包含你的基本片段。我向InfoFragment添加了一個Listener接口,當Fragment想要關閉時會收到通知。對於片段,這可以通過按下按鈕或發生特定操作,但就我的活動而言,當觸發事件時,它會關閉片段視圖。

不要害怕爲片段使用大量的監聽器,還會嘗試通過使用數據參數的特定操作對它們進行分組以將其個性化。希望這可以幫助!

+1

我遇到類似的問題。我有一個通過tabhost 4 listfragments管理的FragmentActivity,每個ListFragment可以基於用戶交互啓動其他片段(所有片段在顯示其內容時共享相同的佈局)。回調模式仍然有效嗎?謝謝 – Blackbelt

+1

是的,回調模式對此很完美。讓活動通過傾聽所有片段來啓動 – Spidy

0

的技術答案:

我有兩個片段,在同一個活動的主持。當用戶點擊其中一個片段的按鈕時,我希望它被另一個替換。

FragmentTransaction ft = this.getFragmentManager().beginTransaction(); 
    Fragment mFragment = Fragment.instantiate(this.Activity(), Fragment2.class.getName()); 
    ft.replace(android.R.id.content, mFragment); 
    ft.commit(); 
0
public class Example_3_Mainfile extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState);   
     setContentView(R.layout.example_3_mainfile); 

       Fragment fr ;//make class that extend to thefragment 
       fr = new Act_2_1();     
        FragmentManager fm = getFragmentManager(); 
        FragmentTransaction fragmentTransaction = fm.beginTransaction(); 
        fragmentTransaction.replace(R.id.fragment_place, fr); 
        //id get of fragment tag from xml file there decelar 
        fragmentTransaction.commit(); 
        } 
    }