替换两个不同的片段后,按下后的按钮将重新创建第一个片段



我有三个片段和一个活动。它这样工作:

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

[SignUpFragment]返回时,将创建[MainFragment]两次。

我尝试了setRetaInInstance(true),然后检查了savedInstanceState,但无法阻止[MainFragment]重新创建。

这是我的主要目的:

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;
}

这是我的主流:

    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();
    }
}
}

这是我的菜单范围:

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;
    }
}
}

这是我的注册:

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:仅当我从注册范围返回菜单范围时才会重新创建主侵犯。我使用这么多碎片做错了吗?我应该使用活动吗?

当您在片段之间移动时,请致电AddToBackStack():

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

创建第一个片段:

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();

相关内容

  • 没有找到相关文章

最新更新