簡體   English   中英

如何在Android中的多個片段之間傳遞數據

[英]How to pass data between multiple Fragments in Android

在我的主Activity中,我有一個包含FragmentTabHost的DialogFragment。 我有兩個選項卡,一個是DialogFragment,另一個是ListFragment。 當在內部DialogFragment中按下'OK'按鈕或按下ListFragment中的元素時,我想傳遞兩個字符串(在內部DialogFragment中輸入兩個TextView並顯示在ListFragment中的每個元素中)回到Activity,但我不確定如何使用多個級別的Fragment來做到這一點。

任何幫助表示贊賞!

沒有魔力。

您可以通過兩種方法實現。

  1. 使用回調。

創建接口和類以將數據通過子Fragment傳遞給Activity。 您不需要修改橋接的TabHostFragment因為片段總是依賴於它的母語Context(Activity),無論片段包裹多少片段。

public class TwoStrings {
    public TwoStrings(String one, String two){
        this.one = one;
        this.two = two;
    }
    public String one;
    public String two;
}

首先,聲明接口。

public interface DataPassListener {
    void dataPassed(TwoStrings data);
}

並且,在Activity中實現接口。

public class MainActivity extends Activity implements DataPassListener {
    @Override
    public void dataPassed(TwoStrings data) {
        // do something with data.
        Log.d("string one", data.one);
        Log.d("string two", data.two);
    }
}

最后,讓子Fragment確認母Activity具有回調監聽器。

public class DialogFragment1 extends DialogFragment {
    DataPassListener listener;

    @Override
    public void onAttach(Activity activity) {
        if (activity instanceOf DataPassListener)
            listener = (DataPassListener) activity;
    }

    public void setDataPassListener(DataPassListener listener){
        listener = ((DataPassListener) listener);
    }    

    public void doSomeThing(){
        if(listener != null) // important to prevent NullPointerException
            listener.dataPassed("a", "b");
    }
}
  1. 使用EventBus。

我更喜歡使用Otto來發布和訂閱數據。

要在Activity中訂閱要收聽的事件,

public class MainActivity extends Activity {

    @Override
    public void onResume() {
        super.onResume();
        BusProvider.getInstance().register(this);
    }

    @Override
    public void onPause() {
        super.onPause();
        BusProvider.getInstance().unregister(this);
    }

    @Subscribe
    public void onUpdateTwoStrings(TwoStrings event) {
        // do something with data.
        Log.d("string one", data.one);
        Log.d("string two", data.two);
    }
}

並且,在Fragment的任何地方發布活動。

bus.post(new TwoStrings("a", "b"));

看一下setTargetFragment()getTargetFragment()方法。 您可以通過它連接片段,而無需任何額外的回調和庫。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM