2012-03-19 62 views
14

我正在轉換我的一些項目使用碎片。我們如何與片段對話進行交流?我想創建一個片段對話框來獲取用戶的一些文本輸入。當對話框被解散時,我想將輸入的文本傳回給「父」片段(啓動它的那個片段)。例如:從片段對話框中獲取數據 - 最佳實踐?

public class MyFragment extends Fragment { 

    public void onBtnClick() { 
     // What's a good way to get data back from this dialog 
     // once it's dismissed? 
     DialogFragment dlgFrag = MyFragmentDialog.newInstance(); 
     dlgFrag.show(getFragmentManager(), "dialog"); 
    } 
} 

感謝

回答

14

一個偉大的方式來傳遞這種事件是一個回調接口一樣descripted在Android開發人員指南

你的片段定義一個回調接口像

public class MyFragment extends Fragment { 
    ... 
    // Container Activity must implement this interface 
    public interface OnArticleSelectedListener { 
     public void onArticleSelected(Uri articleUri); 
    } 
    ... 
} 

然後你檢查你的onAttach方法,如果父實現了回調接口並保存實例。

@Override 
public void onAttach(Activity activity) { 
    super.onAttach(activity); 
    try { 
     mListener = (OnArticleSelectedListener) activity; 
    } catch (ClassCastException e) { 
     throw new ClassCastException(activity.toString() + " must implement OnArticleSelectedListener"); 
    } 
} 

當片段內的事件發生了,你只需調用回調處理

mListener.onArticleSelected(...); 

希望幫助,進一步的相關信息here

+21

這不回答OP的問題。他希望回傳到片段「MyFragment」,這將允許他回傳到開始「MyFragment」的活動。 – eternalmatt 2012-12-05 21:27:46

+3

這是如何在活動和片段之間進行通信的方式。要在片段之間進行通信,請使用'setTargetFragment()'和'getTargetFragment()'。 – 2013-06-05 05:56:11

+2

我想添加到這個答案:__DO沒有通過任何通過構造函數___必須構造函數可以被調用沒有參數(默認構造以C++術語),使用'onAttach',因爲這個答案 – 2014-02-07 22:19:25

30

由於eternalmatt表示,給出解決方案並沒有真正回答這個問題。溝通與該片對話的方式呼籲:

dialog.setTargetFragment(myCallingFragment, requestCode); 

我做的方法即是通過與在那裏監聽器實例化一個然後執行setFragmentTarget()東西的靜態方法創建FragmentDialog:

public mySuperFragmentDialog extends DialogFragment { 
    public interface SuperListener{ 
    void onSomethingHappened(); 
    } 

    public static mySuperFragmentDialog newInstance(SuperListener listener){ 
    MySuperFagmentDialog f = new MySuperFragmentDialog(); 
    f.setTargetFragment((Fragment) listener, /*requestCode*/ 1234); 
    return f; 
    } 
} 
然後

Dialog dialog = MySuperFragmentDialog.newInstance(parentFragment); 
dialog.show(); 

當你想用哪個只是調用對話框中的片段comunicate:

若要從片段中的對話只是做像往常一樣

Fragment parentFragment = getTargetFragment(); 
((SuperListener) parentFragment).onSomethingHappened(); 

此解決方案僅適用時,會從碎片活動,而不是創建對話框,但你可以結合兩種方法('setFragmentTarget()''onAttach()' 1)加一些班檢查,以提供一個完整的解決方案。

+0

爲什麼它是公共靜態mySuperFragmentDialog newInstance而不是public static void newInstance。我在這裏看不到任何回報聲明。 – 2013-11-07 21:35:16

+0

退貨遺失,已編輯。 – juanmeanwhile 2013-11-08 23:30:55

+0

@juanmeanwhile謝謝你的信息!但從我們需要偵聽器的實例化SuperListener偵聽器? – 2013-11-11 07:37:29

0

我曾經遇到過這個問題,當我解決它之後,我創建了一個項目,它會提醒我我是如何做到的。我把項目放在github上,這樣任何人都可以看到解決方案。這裏是鏈接:https://github.com/mumasaba/FragmentFragmentBoss

在這個項目中,我們有一個簡單的應用程序與TextView顯示單詞'你好世界'。此文本視圖位於主應用程序活動託管的片段中。這個片段需要顯示一個新的單詞,用戶可以在點擊添加選項菜單圖標後進入。點擊後,選項菜單項會調出一個對話框,允許用戶鍵入他們的新單詞。用戶完成後,他們可以單擊確定關閉對話框並在片段的文本視圖中顯示其新輸入。因此,說明了片段到對話片段通信。