2014-11-12 3 views
1

Я знаю, что об этом было много, но я просто не могу понять, как его прибить. То, что я в основном пытаюсь сделать, - это нажать кнопку в фрагменте B Я хочу вернуться к фрагменту A вместе с значением id.
Итак, в моем BackStack вы перейдете к фрагменту A, который приведет вас к фрагменту B, и при нажатии кнопки я хочу вернуться к фрагменту A со значением, чтобы показать , Это мой OnClick слушатель в Фрагменте B:Вернитесь к фрагменту A из фрагмента B со значением

//Fragment B which i called from Fragment A 
addButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      if(value.getText().toString().trim().length() != 0) { 
       String order = value.getText().toString(); //The value i want in Fragment B 
       //return to Fragment A 
      } 
} 

В моей MainActivity я протектор моего фрагмента так:

//fragmentManager is initialized in onCreate() 
... 
private void selectItem(int position) { 

    Fragment fragment = null; 
    String fTag = null; 

    switch (position) { 
     case 0: 
      fragment = new FragmentA(); 
      fTag = "fragmentA"; 
      break; 
     case 1: 
      fragment = new FragmentC(); 
      fTag = "fragmentC"; 
      break; 
     case 2: 
      fragment = new FragmentD(); 
      fTag = "fragmentD"; 
      break; 

     default: 
      break; 
    } 

    if (fragment != null) { 
     if(replaceFragments(fragment, fTag)) { 
      mDrawerList.setItemChecked(position, true); 
      mDrawerList.setSelection(position); 
      setTitle(mNavigationDrawerItemTitles[position]); 
      mDrawerLayout.closeDrawer(mDrawerList); 
     } 
    } else { 
     Log.e(LOGTAG, "Error in creating fragment"); 
    } 
} 

public boolean replaceFragments(Fragment fragment, String fTag) { 
    fragmentManager.beginTransaction().replace(R.id.content_frame, fragment, fTag).addToBackStack(fTag).commit(); 
    return true; 
} 

@Override 
public void onBackPressed() { 
    int count = fragmentManager.getBackStackEntryCount(); 
    if (count == 0) { 
     super.onBackPressed(); 
    } else { 
     getSupportFragmentManager().popBackStack(); 
     //TODO: add app title on count == 1 
    } 
} 

ответ

1

Ваш метод OnClick должен выглядеть следующим образом:

@Override 
    public void onClick(View view) { 
     if(value.getText().toString().trim().length() != 0) { 
      String order = value.getText().toString(); //The value i want in Fragment B 
      //return to Fragment A 

      FragmentA fragment = new FragmentA(); 
      Bundle args=new Bundle(); 
      args.putString(order); 
      fragment.setArguments(args); 
      getFragmentManager().beginTransaction().replace((R.id.content_frame,fragment).commit(); 


     } 

, а затем из вашего Fragmenta вы можете восстановить значение с помощью:

getArguments(); 
+0

Ага конечно! Не знаю, почему я не думал об этом. Почему метод интерфейса настолько распространен, когда вы можете установить такие аргументы? –

+0

С помощью интерфейса вы можете отправить значение своей активности. Если это не то, что вы ищете, то вы можете отправить свои значения прямо на другой фрагмент, используя вышеуказанный способ. –

+0

Так как фрагментатор живет внутри действия, я думаю, что я так иду? Но я действительно видел где-то, что не рекомендуется отправлять напрямую между фрагментами? –

2

Создать интерфейс ValueChangeListener.java

public interface ValueChangeListener { 

    public void onValueChanged(String value); 
} 

Pass значения через интерфейс :

public class FragmentB extends Fragment { 

    private ValueChangeListener valueChangeListener; 

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

    //your code 
    addButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      if(value.getText().toString().trim().length() != 0) { 
       String order = value.getText().toString(); 
       //now the value is in the Activity and you can pass it anywhere you want from there 
       valueChangeListener.onValueChanged(order); 
      } 
    } 

} 

Реализовать интерфейс деятельности:

public class YourActivity extends FragmentActivity implements ValueChangeListener{ 

    @Override 
    public void onValueChanged(String value) { 
    //your value is here 
    } 
} 
+0

большое спасибо , В этом есть смысл. Можете ли вы рассказать мне, как я бы назвал Fragment A правильным способом, когда я получу значение в Activity? Я имею в виду, что было бы лучше назвать его из BackStack/получить его из тега? –

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