在同一個Activity下實現兩個Fragment之間的通訊

varenyzc發表於1970-01-01

最近在做一個app,介面的架構為:一個Activity裡面巢狀若干個Fragment,通過側滑導航欄切換Activity中的Fragment。

為什麼要把這篇文章單獨拿出來而不放在開發筆記中呢,因為感覺這個比較難實現,其實也不是難實現,而是我在寫的過程中嘗試了幾種方法,最終實現了我想要的功能,故在此記下,以免忘記。

那麼我想實現的功能是什麼?

我做的是一個翻譯app(即將上線),其中想實現通訊的是TranslateFragment和WordbookFragment,即翻譯Fragment和單詞本Fragment,實現的功能是在單詞本中長按某個單詞然後檢視該單詞的具體釋義,然後跳轉到翻譯介面實現翻譯然後獲取具體釋義。

單詞本
長按檢視具體釋義
在翻譯介面檢視該詞具體含義

實現方法其實挺簡單,分三個步驟:

1、在WordbookFragment中定義一個介面:

public interface sendWord{ 
void sendWord(String word);

}複製程式碼

2、在MainActivity中實現這個介面:

public class MainActivity extends AppCompatActivity implements BookFragment.sendWord{ 
public static TranslateFragment translateFragment;
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
translateFragment = new TranslateFragment();

} ..... ..... @Override public void sendWord(String word) {
translateFragment.setWord(word);

} 複製程式碼

在這裡我把一開始create的TranslateFragment設為static,即確保只有一個這個例項。然後在實現介面的方法裡呼叫translateFragment裡面的set方法把想要的String變數傳到translateFragment裡面去。

3、在translateFragment裡面接收這個變數:

從單詞本回到翻譯中,translateFragment會觸發onResume這個生命週期,即可以重寫onResume方法來實現接收變數。首先在TranslateFragment中定義一個變數,接著定義getter方法,然後在onResume中接收這個變數。

public class TranslateFragment extends Fragment{ 
private static EditText input;
private ImageButton IB_tran;
public static String word = "";
...... ...... public static void setWord(String word) {
TranslateFragment.word = word;

} @Override public void onResume() {
super.onResume();
if (word != "") {
//Toast.makeText(getContext(),word,Toast.LENGTH_SHORT).show();
input.setText(word);
IB_tran.performClick();
word = "";

}
}
}複製程式碼

隨後在WordbookFragment中呼叫這個方法,就可以實現兩個Fragment之間的通訊。

核心程式碼:

MainActivity mainActivity = (MainActivity)getActivity();
mainActivity.getResult().setSelection(1);
//該行程式碼是在MaterialDrawer中選中第一個Item,使之跳轉到TranslateFragmentmainActivity.sendWord(wordbook.getQuereText());
複製程式碼

至此可以實現從單詞本到翻譯的跳轉。

不知道這個是不是最好的方法,如果有大神有更好的方法可以在評論區中評論,thanks!

來源:https://juejin.im/post/5c4d4ac75188253a317b75cb#comment

相關文章