2016-12-01 2 views
0

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

[activity]-> [MainFragment]->[MenuFragment]->[SignUpFragment] 

Когда [SignUpFragment] вернулся нажатии [MainFragment] создается дважды.

Я пробовал setRetaInInstance(true) и я проверил savedInstanceState, но я не могу предотвратить [MainFragment] воссоздания.

Это мой MainActivity:

public class MainActivity extends AppCompatActivity { 

public Bundle mSavedInstanceState; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 

    mSavedInstanceState = savedInstanceState; 

    setContentView(R.layout.activity_main); 

    } 

    @Override 
    protected void onResume() { 

    super.onResume(); 

    callMainFragment(); 

    } 

    private void callMainFragment() { 

    if (mSavedInstanceState == null) { 

     FragmentManager manager = getSupportFragmentManager(); 

     FragmentTransaction transaction = manager.beginTransaction(); 

     transaction.replace(R.id.container_category, new MainFragment(), MainFragment.class.getSimpleName()); 

     transaction.addToBackStack(null); 

     transaction.commit(); 

    } 

} 

public ActionBar getMainActionBar(){ 

    ActionBar actionBar = getSupportActionBar(); 

    if (actionBar != null) { 

     // Action Bar Display settings 

     actionBar.setDisplayShowCustomEnabled(true); 

     actionBar.setDisplayShowTitleEnabled(false); 

     // Custom view inflater 

     LayoutInflater inflater = (LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

     // Custom layout view 

     View viewActionBar = inflater.inflate(R.layout.action_bar, null); 

     // Set custom view 

     actionBar.setCustomView(viewActionBar); 

     actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM); 

    } 

    return actionBar; 

} 

Это мой MainFragment:

public class MainFragment extends BaseFragment implements AdapterView.OnItemClickListener, BuyersGuideCategoriesDelegate, View.OnClickListener { 

private Bundle mSavedInstanceState; 

private BuyersGuideCategoriesFragment mCategoriesFragment; 

@Override 
public void onCreate(@Nullable Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 

    this.setRetainInstance(true); 

} 

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

    mSavedInstanceState = savedInstanceState; 

     if (mSavedInstanceState == null) { 

      mView = inflater.inflate(R.layout.fragment_main, container, false); 

      // Call Grid View Buyers Guide Fragment 

      mCategoriesFragment = new BuyersGuideCategoriesFragment(); 

      mCategoriesFragment.mGridViewDelegate = this; 

      setIcons(); 

      setTitles(); 

      setTexts(); 

      initListView(); 

     } 

    return mView; 

} 

@Override 
public void onResume() { 

    super.onResume(); 

    ImageView menu = (ImageView) ((MainActivity) getActivity()).getMainActionBar().getCustomView().findViewById(R.id.action_bar_menu_icon); 

    menu.setOnClickListener(this); 

} 

@Override 
public void onClick(View v) { 

    if (mSavedInstanceState == null) { 

     MainActivity activity = (MainActivity) getActivity(); 

     FragmentManager manager = activity.getSupportFragmentManager(); 

     FragmentTransaction transaction = manager.beginTransaction(); 

     transaction.replace(R.id.container_category, new MenuFragment(),MenuFragment.class.getSimpleName()); 

     transaction.addToBackStack(null); 

     transaction.commit(); 

    } 

} 

} 

Это мой MenuFragment:

public class MenuFragment extends BaseFragment implements AdapterView.OnItemClickListener, View.OnClickListener { 

private Bundle mSavedInstanceState; 

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

    mSavedInstanceState = savedInstanceState; 

    if (savedInstanceState == null) { 

     mView = inflater.inflate(R.layout.fragment_menu, container, false); 

     setMenuItemsListViewAdapter(); 

    } 

    return mView; 

} 

    private void setMenuItemsListViewAdapter() { 

    ListView menuItems = (ListView) mView.findViewById(R.id.list_menu_items); 

    ListMenuItemsListViewAdapter adapter = new ListMenuItemsListViewAdapter(getContext(),getMenuItemNames()); 

    menuItems.setAdapter(adapter); 

    menuItems.setOnItemClickListener(this); 
} 

@Override 
public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 

    switch ((String) parent.getAdapter().getItem(position)){ 

     case SIGN_UP: 

      replaceFragment(R.id.container_category,new SignUpFragment(),SignUpFragment.class.getSimpleName()); 

      break; 

    } 

} 

private void replaceFragment(int containerId,Fragment fragment, String fragmentTag){ 

    if (mSavedInstanceState == null){ 

     MainActivity activity = (MainActivity) getActivity(); 

     FragmentManager manager = activity.getSupportFragmentManager(); 

     FragmentTransaction transaction = manager.beginTransaction(); 

     transaction.replace(containerId,fragment,fragmentTag); 

     transaction.addToBackStack(null); 

     transaction.commit(); 

    } 

} 

@Override 
public void onClick(View v) { 

    switch (v.getId()){ 

     case R.id.menu_back_icon: 

       replaceFragment(R.id.container_category, new MainFragment(),MainFragment.class.getSimpleName()); 

      break; 

    } 

} 

} 

И это мой SignUpFragment:

public class SignUpFragment extends BaseFragment implements View.OnClickListener{ 

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

    if (savedInstanceState == null) { 

     mView = inflater.inflate(R.layout.fragment_sign_up, container, false); 
    } 

    return mView; 

} 

} 

EDIT 1: MainFragment воссоздается только тогда, когда я возвращаюсь из SignUpFragment в MenuFragment. Я ошибаюсь, используя так много фрагментов? Должен ли я использовать активность?

+0

Покажите нам код, пожалуйста. Невозможно помочь вам без какой-либо реальной информации! –

+0

У вас есть одно действие, в котором размещаются три разных фрагмента? –

+0

Да, я использую одно действие. –

ответ

1

Когда вы шаг между фрагментами, называют addToBackStack():

FragmentTransaction ft = fragmentManager.beginTransation(); 
ft.replace(R.id.fragment, new MyFragment()).addToBackStack("ftransaction").commit(); 
+0

Не работает –

0

Создание первого фрагмента:

FragmentTransaction ft = fragmentManager.beginTransation(); 
ft.add(R.id.container, new FirstFragment()).addToBackStack(null).commit(); 

Второе:

FragmentTransaction ft = fragmentManager.beginTransation(); 
ft.replace(R.id.container, new SecondFragment()).addToBackStack(null).commit(); 

и Третье:

FragmentTransaction ft = fragmentManager.beginTransation(); 
ft.replace(R.id.container, new ThirdFragment()).commit();