2015-01-06 3 views
2

В моем приложении для Android у меня есть два фрагмента. Один фрагмент имеет onClickListener, и по существу то, что я пытаюсь сделать, это создать счетчик/журнал сортировок. Каждый раз, когда нажимается кнопка, я хочу обновить целое число, а затем передать String.valueOf (integer) в TextView в другом фрагменте.Передача данных из фрагмента в фрагмент через кнопку Нажмите

Вот первый фрагмент, с onClickListener:

public class StartingFragment extends Fragment implements View.OnClickListener { 

     public static final String TEA_TYPE_POS = "tea_navdrawer_position"; 
     public static int COUNT = 0; 
     private TeaCounterFragment mTeaCounterFragment; 

     // onCreateView method - Returning the layout file 
     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, 
           Bundle savedInstanceState) { 
      // Inflating the layout 
      View v = inflater.inflate(R.layout.starting_fragment, container, false); 


      /* From this point, you do everything in regards to the "v" object */ 
      Button tea_type1 = (Button) v.findViewById(R.id.tea_type1); 
      Button tea_type2 = (Button) v.findViewById(R.id.tea_type2); 
      Button tea_type3 = (Button) v.findViewById(R.id.tea_type3); 
      Button tea_type4 = (Button) v.findViewById(R.id.tea_type4); 
      Button tea_type5 = (Button) v.findViewById(R.id.tea_type5); 
      Button tea_type6 = (Button) v.findViewById(R.id.tea_type6); 
      Button tea_type7 = (Button) v.findViewById(R.id.tea_type7); 
      Button set_timer = (Button) v.findViewById(R.id.set_your_own_timer); 




      tea_type1.setText("Oolong"); 
      tea_type1.setOnClickListener(this); 

      tea_type2.setText("White"); 
      tea_type2.setOnClickListener(this); 

      tea_type3.setText("Blooming"); 
      tea_type3.setOnClickListener(this); 

      tea_type4.setText("Black"); 
      tea_type4.setOnClickListener(this); 

      tea_type5.setText("Herbal"); 
      tea_type5.setOnClickListener(this); 

      tea_type6.setText("Green"); 
      tea_type6.setOnClickListener(this); 

      tea_type7.setText("Mate"); 
      tea_type7.setOnClickListener(this); 

      set_timer.setText("Set Your Own Timer"); 
      set_timer.setOnClickListener(this); 

      /* Do your manipulation to your views here, onClick listeners and such */ 

      // Return the "v" object 
      return v; 
     } 

     @Override 
     public void onClick(View view) { 
      switch (view.getId()) { 
      /* 
      * Use the View interface with OnClickListener to get the Button ID's 
      * Then you can run a switch on the Buttons (because normally switches 
      * cannot be run on buttons 
      */ 

       case R.id.tea_type1: 
        Builder oolongBuilder = new AlertDialog.Builder(StartingFragment.this.getActivity(), 
          AlertDialog.THEME_HOLO_LIGHT); 

        oolongBuilder.setPositiveButton("Hot", 
          //Starts OolongTeaActivity for hot tea when clicked 
          new DialogInterface.OnClickListener() { 

           @Override 
           public void onClick(DialogInterface arg0, int arg1) { 
            Intent i = new Intent(StartingFragment.this.getActivity(), 
              OolongTeaActivity.class); 
            StartingFragment.this.getActivity().startActivity(i); 
           } 
          }); 

        oolongBuilder.setNeutralButton("Iced", 

          new DialogInterface.OnClickListener() { 

           @Override 
           public void onClick(DialogInterface dialog, int which) { 
            Intent i = new Intent(StartingFragment.this.getActivity(), 
              ColdOolongTeaActivity.class); 
            StartingFragment.this.getActivity().startActivity(i); 

           } 
          }); 

        oolongBuilder.setTitle("Oolong Tea"); 
        oolongBuilder.setMessage("How Do You Like Your Tea?"); 

        AlertDialog oolongDialog = oolongBuilder.create(); 
        oolongDialog.show(); 

        COUNT++; 
        Fragment fragment = new Fragment(); 
        final Bundle bundle = new Bundle(); 
        bundle.putString("id_User", String.valueOf(COUNT)); 
        Log.i("BUNDLE", bundle.toString()); 
        fragment.setArguments(bundle); 

        break; 

и фрагмент, к которому я хочу valueOf (целое число), чтобы пойти.

public class TeaCounterFragment extends Fragment { 

    public TeaCounterFragment() { 

    } 

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

     View rootView = inflater.inflate(R.layout.fragment_tea_counter, container, false); 

     TextView oolongCounterText = (TextView) rootView.findViewById(R.id.counter_tv); 

     Bundle args = getArguments(); 
     if (args != null && args.containsKey("id_User")){ 
      String userId = args.getString("id_User"); 
      oolongCounterText.setText(userId); 
     } 

     return rootView; 
    } 

Я понял, что TextView будет установлен обратно в исходное состояние, но если я могу по крайней мере, получить его обновить после нажатия кнопки, то я могу понять, как сохранить его навсегда в более позднее время.

Я просмотрел документацию разработчика Android, и он говорит, что два фрагмента не должны связываться напрямую, но я не понимаю, почему метод, который я использую прямо сейчас, не должен работать.

EDIT: Попытался другой способ решить эту проблему, но я получаю исключение NullPointerException. Я решил создать интерфейс в одном фрагменте, а через класс NavDrawer (MainActivity) я попытался обновить TextView.

pastebin.com/1dx5rEVv (MainActivity) --- pastebin.com/7wKW1zq1 (StartingFragment)

На данный момент, я просто хочу, чтобы обновить TextView (и держать его даже после того, как приложение будет полностью закрыто) с использованием любого подхода или подхода, еще не используется.

ответ

3

Вы можете легко передать данные с помощью переменной в родительской активности фрагментов.Сделать эту переменную в качестве статического

public static Bundle myBundle = new Bundle(); 

Теперь обновить его из первого фрагмента, как

YourParentActivityName.myBundle.putString("id_User", String.valueOf(COUNT)); 

Теперь во Второй фрагмент вы можете получить эту величину

String myValue = YourParentActivityName.myBundle.get("id_User"); 
0

Вы создаете объект класса фрагментов. Вам необходимо создать класс TeaCounterFragment.

 TeaCounterFragment fragment = new TeaCounterFragment(); 
     final Bundle bundle = new Bundle(); 
     bundle.putString("id_User", String.valueOf(COUNT)); 
     Log.i("BUNDLE", bundle.toString()); 
     fragment.setArguments(bundle); 

Другая ошибка, возможно, в том, что вы не используете этот созданный объект фрагмента для представления своего вида. Убедитесь, что вы используете один и тот же экземпляр для представления представления.

+0

Как бы использовать тот же экземпляр, если он создается в другом фрагменте? Если я создаю новый объект TeaCounterFragment, в другом фрагменте под названием StartingFragment, как использовать тот же экземпляр из класса TeaCounterFragment. – freddiev4

+0

Используйте FragmentManager, Лучше сначала пройдите через любой учебник, чтобы понять Фрагменты. –

+0

Oooh. ОК. Я понимаю Фрагменты, просто я не совсем уверен, как подойти к нему (+ ментальный блок) – freddiev4

1

Я думаю, проблема в том, что ваш «TextView вернется в исходное состояние» - это то, что нажатие кнопки «сверхурочно» вы создаете новый TeaCounterFragment.

На своем первом фрагменте создайте TeaCounterFragment и создайте его на своей функции onCreate.

public class YourFirstFragment extends Fragment { 

    private TeaCounterFragment mTeaCounterFragment; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     if (savedInstanceState == null) { 
      mTeaCounterFragment = new TeaCounterFragment(); 
      getFragmentManager().beginTransaction() 
        .add(R.id.container, mTeaCounterFragment) 
        .commit(); 
     } 
    } 
} 

А на OnClick первого фрагмента, просто добавьте это на нужное обновление на TeaCounterFragment.

@Override 
public void onClick(View view) { 
    ... 
    COUNT++; 
    mTeaCounterFragment.UpdateCount(COUNT); 
    ... 
} 

На TeaCounterFragment, создать публичную функцию для обновления пользовательского интерфейса и изменить свой onCreateView с этим.

public class TeaCounterFragment extends Fragment { 

    private TextView mTeaCounterText; 

    public TeaCounterFragment() { 

    } 

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

     View rootView = inflater.inflate(R.layout.fragment_tea_counter, container, false); 
     mTeaCounterText = (TextView) rootView.findViewById(R.id.counter_tv); 
     return rootView; 
    } 

    public void UpdateCount(int count) 
    { 
     mTeaCounterText.setText(String.valueOf(count)); 
    } 
} 

Надеется, что это решит вашу проблему.

+0

Я немного запутался здесь, потому что то, что я есть два фрагмента, поэтому нет метода onCreate(), только onCreateView() – freddiev4

+0

В первом фрагменте нет onCreate(): http://pastebin.com/z6Xm2Rc2 – freddiev4

+0

По умолчанию нет onCreate() on созданных фрагментов. Вы можете просто переопределить функцию. – noahutz

0

После определения интерфейса в фрагменте класса, вам также необходимо убедиться, что интерфейс реализован в результате действия с использованием метода onAttach в вашем фрагменте следующим образом:

@Override 
public void onAttach(Activity activity) { 
    super.onAttach(activity); 
    try { 
     listener = (updateFragment) activity; 
    } catch (ClassCastException e) { 
     throw new ClassCastException(activity.toString() 
       + " must implement the interface"); 
    } 
} 

Затем, чтобы обновить фрагмент из вашей деятельности, сделать это:

@Override 
public void onButtonClick(String message) { 

TeaCounterFragment fragment = new TeaCounterFragment(); 
final Bundle bundle = new Bundle(); 
bundle.putString("id_User", String.valueOf(COUNT)); 
Log.i("BUNDLE", bundle.toString()); 
fragment.setArguments(bundle); 

FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); 
transaction.replace(R.id.fragment_replace, fragment); 
transaction.addToBackStack(null); 
transaction.commit(); 
} 
Смежные вопросы