2016-12-01 3 views
0

3つのフラグメントと1つのアクティビティがあります。それはこのように動作します:[SignUpFragment]が押し戻された場合2つの異なるフラグメントが置換された後、最初のフラグメントは、戻るボタンを押したときに再作成されます。

[activity]-> [MainFragment]->[MenuFragment]->[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; 

} 

} 

編集1:MainFragmentは、SignUpFragmentからMenuFragmentに戻るときにのみ再作成されます。私は非常に多くの断片を使って間違っていますか?私は活動を使用すべきでしょうか?

+0

コードを教えてください。実際の情報なしであなたを助ける方法はありません! –

+0

3つの異なるフラグメントをホストする1つのアクティビティがありますか? –

+0

はい、私は1つのアクティビティを使用しています。 –

答えて

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(); 
関連する問題