Передача данных между вкладками

У меня есть MainActivity (FragmentActivity) с FragmentTabHost.

public class FragmentTabs extends FragmentActivity {
    private FragmentTabHost mTabHost;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.fragment_tabs);
        mTabHost = (FragmentTabHost)findViewById(android.R.id.tabhost);
        mTabHost.setup(this, getSupportFragmentManager(), R.id.realtabcontent);

        mTabHost.addTab(mTabHost.newTabSpec("classA").setIndicator("Class A"),
            ClassA.class, null);
        mTabHost.addTab(mTabHost.newTabSpec("classB").setIndicator("Class B"),
            ClassB.class, null);
        mTabHost.addTab(mTabHost.newTabSpec("classC").setIndicator("Class C"),
            ClassC.class, null);
    }
}

ClassA, ClassB и ClassC — все фрагменты (android.support.v4.app.Fragment).

Мне нужно передать данные (и методы вызова) во фрагментах. Как я могу получить ссылку на каждый из фрагментов, например:

ClassA mClassAFragment = ???;

Я пытался использовать getSupportFragmentManager().findFragmentByTag(), а также пытался изучить возможности mTabHost. Ничто не может их получить.

Можете ли вы предложить способ сделать это или предложить альтернативный подход?

И я пытался использовать это ...

Bundle arguments = new Bundle();
arguments.putString("some id string", "your data");
YourFragment fragment = new YourFragment();
fragment.setArguments(arguments);
getSupportFragmentManager().beginTransaction().add(R.id.fragmentid, fragment).commit();

но я не знаю, как использовать этот R.id.fragmentid, если мои вкладки добавления в порядке:

mTabHost.addTab(mTabHost.newTabSpec("classA").setIndicator("Class A"),
                ClassA.class, null);

Кто-нибудь поможет мне?


person Roldanhollow    schedule 30.07.2013    source источник


Ответы (1)


Определите фрагменты в своей деятельности как общедоступные. Затем в каждом фрагменте вы также ссылаетесь на Activity.

В вашей деятельности:

public ClassAFragment aFragment;
...
// during initialization:
aFragment = new ClassAFragment();
// or you get it from your TabHost
FragmentManager fm = getFragmentManager();
aFragment = fm.findFragmentByTag("ClassA");
aFragment.mActivity = this;
// same with B and C

В ваших фрагментах:

public MainActivity mActivity;
...
// in Fragment C
String newText = mActivity.aFragment.editText.getText().toString() + mActivity.bFragment.editText.getText().toString();
textView.setText(newText); 
person Christian    schedule 30.07.2013
comment
вы можете показать мне пример? предположим, что у нас есть 3 фрагмента. Вкладка 1 ==> FragmentTab1 Tab 2 ==> FragmentTab2 Tab 3 ==> FragmentTab3 В Tab1 у вас есть EditText «Номер 1» В Tab2 у вас есть EditText «Номер 2» В Tab3 должен отображаться сумма двух чисел Как вы это делаете? - person Roldanhollow; 31.07.2013
comment
Я обновил свой пример заполнения textView во фрагменте C объединенной строкой editText обоих других фрагментов. - person Christian; 31.07.2013
comment
Я пробовал использовать FragmentManager fm = getFragmentManager(); aFragment = fm.findFragmentByTag(ClassA); aFragment.mActivity = это; Но не работает .... aFragment равен нулю ... как его инициализировать? - person Roldanhollow; 01.08.2013
comment
Я решил проблему, добавив ссылку на активность внутри фрагментов. Не так: getSupportFragmentManager().findFragmentById(R.id.article_fragment); Что-то вроде: getChildFragmentManager().findFragmentByTab(MyTab); - person Roldanhollow; 02.08.2013