Подтвердить что ты не робот

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

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

У меня есть активность с двумя фрагментами. Я хочу, чтобы фрагмент2 устанавливал логическую переменную в 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: (Где я хочу прочитать boolean lf, установленный в Acitivity выше:

@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), но также не могу ее увидеть...

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

4b9b3361

Ответ 1

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

1) Активность → Фрагмент

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

2) Активность → Фрагмент

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

  • В вашей деятельности: вызовите общедоступный метод active:

    getSupportFragmentManager(). findFragmentById (R.id.your_fragment).publicMethod(арг)

3) Фрагмент → Активность

  • В вашем фрагменте: создайте un-интерфейс с методами getter и setter (методы обратного вызова)
  • В вашей деятельности: реализовать интерфейс

4) Фрагмент → Активность

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

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

Ответ 2

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

Сначала вы можете сделать это, используя setArguments (...) и getArguments (....)

Во-вторых, вы можете сделать это, используя Обратный звонок

Ответ 3

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

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

Ответ 4

//In fragment;
String user = MainActivity.getUserName();

Статические методы - это мое старое решение, но, безусловно, плохое решение. Не используйте их так.