#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, но тогда его будет не так просто повторно использовать в других фрагментах