Отправить данные между фрагментами - PullRequest
0 голосов
/ 18 ноября 2018

Я использовал этот учебник, чтобы научиться передавать данные между фрагментами:

https://www.journaldev.com/14207/android-passing-data-between-fragments

И это прекрасно работает, если у меня есть два фрагмента. Но моему приложению нужно больше (7) фрагментов. Фрагменты - это вкладки на вкладке. Когда я переключаюсь между двумя вкладками рядом друг с другом, это хорошо. Но как только я переключаюсь с tab0 на вкладку еще дальше (tab5), отправляю сообщение, затем проверяю его на tab0, EditText возвращает его первоначальное значение.

Когда я изменяю значение EditText, я меняю значение заголовка вкладки. И он обновляется правильно. (Я перехожу с tab0 на tab5, отправляю сообщение, заголовок tab0 изменяется, поэтому сообщение принимается.) Но когда я возвращаюсь к tab0, оно возвращает свое первоначальное значение (а также заголовок вкладки, но это работает правильно) ,

Это похоже на то, что желаемые изменения происходят, но когда я переключаюсь обратно, он возвращает первоначальное значение. Это как-то связано с уничтожением и сохранением экземпляров? Как от этого избавиться?

В STab.java (код вкладки):

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

    try {
        SD = (SendData) getActivity();
    } catch (ClassCastException e) {
        throw new ClassCastException("Error in retrieving data. Please try again");
    }
}
interface SendData {
    void setStructureBonusTileSpinner(int position, int currentTabNumber);
}

protected void setStructureBonusTileSpinner(int position){
    spinnerStructureBonusTile.setSelection(position);
}

Также в STab.java, в методе onViewCreated:

spinnerStructureBonusTile.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) {
            SD.setStructureBonusTileSpinner(spinnerStructureBonusTile.getSelectedItemPosition(), tabNumber);
        }
    });

В MainActivity.java, который реализует STab.SendData:

@Override
public void setStructureBonusTileSpinner(int position, int currentTabNumber) {

    for(int i = 0; i < mSectionsPagerAdapter.getCount(); i++){

        if(i != currentTabNumber) {
            String tag = "android:switcher:" + R.id.container + ":" + i;
            STab f = (STab) getSupportFragmentManager().findFragmentByTag(tag);
            if(f != null){
                f.setStructureBonusTileSpinner(position);
            }
        }

    }

}

Ответы [ 2 ]

0 голосов
/ 18 ноября 2018

По умолчанию экранное ограничение страницы равно 1, поэтому те фрагменты, которые, как вы говорите, работают рядом с двумя, находятся рядом друг с другом, воссоздаются из адаптера.

Если вы не собираетесьвыполнять тяжелые задачи, было бы достаточно просто изменить этот предел.

mViewPager.setOffScreenPageLimit(fragmentCount - 1)

PD: В качестве подсказки, вы никогда не должны иметь более 3 вкладок, было бы лучше, если бы вы могли думать о лучшем подходевместо этого.

PD2: Вы также должны опубликовать соответствующий код

0 голосов
/ 18 ноября 2018

Если вы переносите данные из фрагмента А в Б, выполните следующие действия.

1.Фрагмент A -> Базовая активность -> Фрагмент B (не рекомендуется) Вы можете передавать данные с помощью родительского действия. 2. Использование объекта Bundle.

public static Fragment newInstance(String param1, String param2) {
    BlankFragment fragment = new BlankFragment();
    Bundle args = new Bundle();
    args.putString(ARG_PARAM1, param1);
    args.putString(ARG_PARAM2, param2);
    fragment.setArguments(args);
    return fragment;
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (getArguments() != null) {
        mParam1 = getArguments().getString(ARG_PARAM1);
        mParam2 = getArguments().getString(ARG_PARAM2);
    }
}
...