Передача присвоенного значения счетчика от фрагмента к фрагменту в Viewpager NullPointerException

Я сделал его более простым и обновил на основе ответов в моем предыдущем сообщении: Добавление Присвоенные значения в Spinner NullPointerException

У меня есть MainAcitivty, использующий ViewPager. У меня есть 2 фрагмента в моей MainActivity (FragA и FragB)

В моем FragA есть счетчик. В FragB у меня есть TextView и Button.

Теперь, что я пытаюсь сделать, это когда я выбираю «Hello» в моем счетчике, мой int a будет иметь значение 5. И когда я нажимаю кнопку, 5 будет отображаться в TextView.

Вот мой код:

FragA

public class FragA extends Fragment {

    Spinner spinner1;
    String s1;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.fraga, container, false); 

        spinner1 = (Spinner) view.findViewById(R.id.spinner1);  
        ArrayAdapter<CharSequence>  adapter_a = ArrayAdapter.createFromResource(getActivity(), R.array.spinner1,android.R.layout.simple_spinner_item );
        spinner1.setAdapter(adapter_a);

        s1 = spinner1.getSelectedItem().toString();

        return view;
    }

    public int getInt() {

        int a = 0;

        if(s1.equals("Hello")) {
            a = 5;
        }

        return a;    
    }

}

MainActivity

public class MainActivity extends FragmentActivity {

    ViewPager viewPager = null; 

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        viewPager = (ViewPager)findViewById(R.id.pager);    
        FragmentManager fragmentManager = getSupportFragmentManager();
        viewPager.setAdapter(new MyAdapter(fragmentManager));
    }

    public class MyAdapter extends FragmentStatePagerAdapter {  

            public MyAdapter (FragmentManager fm) {
                super(fm);
            }

            @Override
            public Fragment getItem(int i) {
                Fragment fragment = null;

                if (i == 0)
                {
                    fragment = new FragA();
                }
                if (i == 1)
                {
                    fragment = new FragB();
                }
                return fragment;
            }

            @Override
            public int getCount() {
                return 2;
            }   
        }

    public String get() {

        FragA FragA = new FragA();

        return Integer.toString(FragA.getInt());
    }
}

FragB

public class FragB extends Fragment{

    TextView textView;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.fragb, container, false); 

        textView = (TextView) view.findViewById(R.id.textview);
        Button button = (Button) view.findViewById(R.id.button);
        button.setOnClickListener(Click);

        return view;
    }

    OnClickListener Click = new OnClickListener() { 

        @Override
        public void onClick(View v) {

            textView.setText(((MainActivity)getActivity()).get());          
        }
    };

}

Кстати, у меня нет проблем с передачей значения a из FragA в FragB, когда это мой код:

public int getInt() {

        int a = 5;

        return a;    
    }

Но это не касается моего спиннера, и я не хочу этого делать.


person general_bearbrand    schedule 18.12.2013    source источник


Ответы (1)


Вот простой способ связи между фрагментами.

В MainActivity сохраните статические экземпляры фрагментов.

public static FragA fragmentA;
public static FragB fragmentB;

Теперь, если вы хотите получить доступ к FragB из FragA, напишите что-нибудь подобное:

((MainActivity) getActivity()).fragmentB.setSomething();

И вот лучший / правильный способ связи между фрагментами:

http://developer.android.com/training/basics/fragments/communicating.html

person StarDust    schedule 18.12.2013
comment
У меня нет проблем с общением с моими фрагментами. Моя проблема в том, что значение, которое я установил через счетчик, получает NPE, когда я пытаюсь его передать. - person general_bearbrand; 19.12.2013
comment
какая строка дает вам NPE? Можете ли вы куда-нибудь загрузить свой полный проект? - person StarDust; 19.12.2013
comment
здесь s1 = spinner1.getSelectedItem (). toString (); Я не знаю, где я могу его загрузить .. ты собираешься сделать это за меня? хе-хе - person general_bearbrand; 19.12.2013
comment
@ user2942600 какой получает NPE? spinner1 или getSelectedItem? - person StarDust; 20.12.2013
comment
Теперь все в порядке. Строка s1 получает NPE. Я обнаружил, что проблема в ViewPager. ViewPager кэширует только текущие слева и справа. Если вы выйдете за рамки этого, фрагмент будет уничтожен, поэтому я получаю NPE. - person general_bearbrand; 20.12.2013
comment
А также я использую активность хостинга, чтобы установить строку TextView во FragB - person general_bearbrand; 20.12.2013