最近在做一個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!