2016-03-01 28 views
1

我有這樣它可以強制onActivityResult片段?

enter image description here

FragmentB的應用我有TextView和一個Button。 該按鈕的功能是用一個新的片段(FragmentB1)替換FragmentB。在FragmentB1中,我用Strings顯示了ListView。 在listView的onItemClickListener中,我必須返回String並將其放在FragmentB的TextView上。問題是我不能使用Fragment.startActivityForResult(),因爲我只有一個Activity(它管理屏幕右側的交易,並且還顯示FragmentA)。是否有可能從這個獨特的Activity打電話給FragmentB的onActivityResult

注:我不能FragmentB類寫一個方法setText(String text),因爲可能我會放一個FragmentCFragmentD代替FragmentB

回答

0

達尼,

當片段處理,你最好的傳播手段片段之間是通過活動。例如。讓我們考慮具有碎片B,C和D的活動A. 將新片段設置爲通過FragmentManager放置並加載後,您可以調用其上的getActivity()以獲取對其的引用。一個好主意是實現一個接口,使您可以使用它在實現它的任何活動,並調用回調方法:

// creating the fragment here from the mainActivity 
FragB fragB = new FragB(); 
    getSupportFragmentManager().beginTransaction() 
      .replace(R.id.imager, fragB).commit(); 


// This is because my example activity implements FragBListener which is defined in the FragB class 
@Override 
public void onCallFromFragB() { 

} 

FragB

public class FragB extends Fragment { 
private FragBListener activity; 

.... 

    public interface FragBListener{ 
    void onCallFromFragB(); 

} 
} 

現在,您可以通過調用引用父活動getActivity上onAttach()

public void onAttach(Context context) { 
    super.onAttach(context); 
.... 

    activity = (FragBListener) getActivity(); 
} 

現在你已經對這個活動的參考,你甚至可以從界面的實現方法。只要你不把它轉換給聽衆,你真的可以從父活動中調用任何公共方法,我只是更喜歡這種方式。

現在從活動中調用片段內部的方法更容易。像這樣:

FragB fragB= (FragB) getSupportFragmentManager().findFragmentById(R.id.imager); 
    if(fragB != null){ 
     // FragB is in view 
     // call it's methods 
    } 

這樣你的片段將是自包含的,並通過活動完成溝通,所以你不必擔心場景。你只是想確保你在片段上調用公共方法,只要它們不是null(在佈局中)。

僅供參考,你可以看到this.

好了,所以一切我已經提到,到目前爲止,這裏是你可以做什麼。

  1. 從活動中加載片段B.
  2. 單擊片段B的按鈕時。調用活動的方法,用片段B1替換片段B.
  3. B1則可以調用該活動的方法傳遞字符串,這樣的活動可以爲B設置爲您剛剛傳遞的字符串TextView的替代B1的onItemClickListener。

如果您不希望爲了解決界面問題,您也可以僅僅對活動進行類型化。例如,如果活動爲MainActivity,則從其片段之一調用時也可以使用

((MainActivity) getActivity()).[any public method] 

也是可能的。

+0

非常感謝你! –

+0

隨時待命。祝你好運。 – Khanal