Доступ к переменной из MainActivity в другом расширенном классе

#java #android

#java #Android

Вопрос:

Итак, мне нужно иметь доступ к переменной из MainActivty из другого класса. каков наилучший способ сделать это. Ниже приведен сценарий, но я не могу вызвать frag.receiveInt(give_this_int_to_fragment);

MainActivity.java:

     import com.me.fragments.FragmentExtender

    public class MainActivity{
        int give_this_int_to_fragment;

        protected void onCreate(...){
            Fragment frag = new FragmentExtender();
            give_this_int_to_frag = new int();
            frag.receiveInt(give_this_int_to_frag);
        }
    }
  

FragmentExtender.java:

     public class FragmentExtender extends Fragment{
         int receive_int_from_main;

         public View onCreateView(...){...}

         receiveInt(int_from_main){
              receive_int_from_main = int_from_main;
         }
    }
  

Я не пытаюсь создать дублирующуюся переменную, просто указатель на эту переменную в MainActivity, если вы уловили мой намек.

Комментарии:

1. Итак, вы в основном хотите передать значение из Activity во Fragment?

2. ДА. Для тех, кто ответил, я попробую обе версии и посмотрю, какая лучше всего подходит для моего рабочего процесса. Я вернусь к upvote.

Ответ №1:

Создайте средство получения и установки для этой переменной в Activity

 public class MainActivity{
    int give_this_int_to_fragment;

    protected void onCreate(...){
        Fragment frag = new FragmentExtender();

    }
}

public int getgive_this_int_to_fragment(){
     return give_this_int_to_fragment;
}
public void getgive_this_int_to_fragment(int var){
     give_this_int_to_fragment = var;
}
  

Теперь во фрагменте вы можете использовать getActivity() для получения контекста действия, а затем вызвать getter

 public class FragmentExtender extends Fragment{


     public View onCreateView(...){
         //....
         int var = ((MainActivity) getActivity()).getgive_this_int_to_fragment();

     }
}
  

Ответ №2:

Более элегантным способом будет реализовать интерфейс во фрагменте и заставить приложение наследовать от него. Таким образом, вы можете обмениваться данными таким образом.

 interface FragmentInterface{
    Object getMainValue();
    void passValueToMain(Object obj);
}
  

С помощью этого кода вам просто нужно добавить его в объявление MainActivity и в конструктор fragment

 public class MainActivity implements FragmentInterface{
    int give_this_int_to_fragment;

    protected void onCreate(...){
        Fragment frag = new FragmentExtender();
        ....
    }
}
  

А затем во фрагменте

 public class FragmentExtender extends Fragment{
    private FragmentInterface mInterface;
    int receive_int_from_main;

    public View onCreateView(...){...}

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

    //This is for pre Marshmallow versions
    @SuppressWarnings("deprecation")
    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);

        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
            setListeners(activity);
        }
    }

    private void setListeners(Object object) {
        if (object instanceof FragmentInterface) {
            mListener = (FragmentInterface) object;
        } else {
            throw new RuntimeException(object.toString()
                  " must implement FragmentInterface");
        }
    }
}
  

Это будет работать для любого фрагмента и любого действия, которое их реализует

Комментарии:

1. Есть ли способ без редактирования файла класса фрагмента? Я хочу сохранить все в двух файлах MainActivity и FragmentExtender

2. Вы можете создать FragmentListener в том же классе FragmentExtender, но тогда его будет не так просто повторно использовать в других фрагментах