2016-10-22 2 views
0

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

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, если вы поймаете мой дрейф.

+0

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

+0

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

ответ

3

Создать геттер и сеттер для этой переменной в деятельности

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(), чтобы получить контекст деятельности, а затем вызвать геттер

public class FragmentExtender extends Fragment{ 


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

    } 
} 
0

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

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

С помощью этого кода, вы просто должны добавить его в декларации MainActivity и в конструкторе фрагмент

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"); 
     } 
    } 
} 

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

+0

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

+0

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

Смежные вопросы