it-swarm.com.ru

Обмен данными между фрагментами и активностью в Android

Я задавал подобный вопрос раньше и не получил ответа, и, похоже, многие другие люди ищут ответ. Поэтому я публикую этот вопрос, чтобы, надеюсь, получить четкий ответ, от которого каждый может извлечь выгоду.

У меня есть деятельность с 2 фрагментами в нем. Я хочу, чтобы frag2 установил логическую переменную в Activity, когда флажок установлен, чтобы фрагмент1 мог знать, был ли установлен флажок.

Это мой код:

Деятельность:

public class modestab extends Activity{
    public static Context appContext;

    public boolean lf=false;

    public void onCreate(Bundle savedInstanceState){
        appContext=this;
super.onCreate(savedInstanceState);
ActionBar tabbar= getActionBar();
        tabbar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
        ActionBar.Tab ModesTab =tabbar.newTab().setText("Modes");
        ActionBar.Tab CatTab =tabbar.newTab().setText("Categories");

        Fragment ModesFragment =new modes();
        Fragment CatFragment =new cats();

        ModesTab.setTabListener(new MyTabsListener(ModesFragment));
        CattTab.setTabListener(new MyTabsListener(CatFragment));

        tabbar.addTab(ModesTab);
        tabbar.addTab(CatTab);


    }

Фрагмент 1: (Где я хочу прочитать булево значение lf, заданное в разделе «Чувствительность» выше:

@TargetApi(11)
public class tabmodes extends Fragment{
@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
View V=inflater.inflate(R.layout.tab_modes, container, false);
button1.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                if(lf==false) //lf here is the lf in Activity which I want to get

Фрагмент 2: где я хочу установить lf в Activity

.....
lifecheck.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener(){
              @Override
                public void onCheckedChanged(CompoundButton buttonView,
                        boolean isChecked) {
                  if(lifecheck.isChecked())
                      getActivity().lf=true;//Where I want to set the lf flag in Activity
                  ;
              }
          });

Код не компилируется, и я не знаю, как установить lf в Activity или как его прочитать. Кто-то предложил мне сделать getActivity (), но я не могу увидеть переменную.

Я пытался создать функцию setlf (boolean jk), но также я не могу ее увидеть ...

Любая помощь приветствуется :)

31
Syntax_Error

Много способов :

1) Деятельность -> Фрагмент

  • В вашей деятельности: создайте комплект и используйте фрагмент . setArguments (комплект) 
  • в вашем фрагменте: используйте Bundle bundle = getArguments ()

2) Деятельность -> Фрагмент

  • В вашем фрагменте: создайте публичный метод

  • В вашей активности: вызов открытого метода фрагмента active:

    getSupportFragmentManager () . findFragmentById (R.id.your_fragment) .publicMethod (args)

3) Фрагмент -> Деятельность

  • В вашем фрагменте: создать интерфейс un с методами получения и установки ( методы обратного вызова )
  • В вашей деятельности: реализовать интерфейс

4) Fragment -> Activity

  • В вашей деятельности: создание общедоступных методов получения и установки или других методов
  • В вашем фрагменте: вызывается метод получения, установки или другие методы публичной активности с использованием:

    getActivity () . getSomething (), getActivity () . setSomething (args) или getActivity () . someMethod (args)

110
Alain Beauvois

Вы можете передавать данные между фрагментами двумя способами, 

Во-первых, вы можете сделать это с помощью setArguments (...) и getArguments (....)

Во-вторых, вы можете сделать это с помощью перезвонить

2
RajeshVijayakumar

Также вы можете использовать EventBus. Это действительно просто. https://github.com/greenrobot/EventBus

Определенно не используйте статические методы, как мой старый ответ :)

1
Mete