导航抽屉碎片

Navigation Drawer Fragments

所以我的导航抽屉有 5 个不同的选项。他们都打开了一个我创建的新片段。第一个是主页,我正试图找到一种方法将其带回显示在导航抽屉下方的第一个屏幕。它在 main_activity.xml 中具有 "container" 的 ID。我不想使用和意图调用整个 class 再次加载。此外,我不希望能够使用另一个意图的后退按钮。我对如何实现这一点感到困惑。

 @Override
public void onNavigationDrawerItemSelected(int position) {

    FragmentHowItWorks fragmentHow;
    FragmentSettings fragmentSettings;
    FragmentTransaction transaction = getFragmentManager().beginTransaction();

    switch(position){
        case 0:

                // should I call the layout?
                // this is the "Home" option

            break;
        case 1:
            fragmentHow = new FragmentHowItWorks();
            transaction.replace(R.id.container, fragmentHow);
            transaction.addToBackStack(null);
            transaction.commit();
            break;
        case 2:
            fragmentSettings = new FragmentSettings();
            transaction.replace(R.id.container, fragmentSettings);
            transaction.addToBackStack(null);
            transaction.commit();
            break
        case 3:
            fragment = new FragmentHowItWorks();
            transaction.replace(R.id.container, fragment);
            transaction.addToBackStack(null);
            transaction.commit();
              break;
        case 4:
              fragment = new FragmentHowItWorks();
              transaction.replace(R.id.container, fragment);
              transaction.addToBackStack(null);
              transaction.commit();
              break;
    }
}

使用方法 addhideshow

Step1 准备所有片段

Fragment fragment1 = new FragmentOne();
Fragment fragment2 = new FragmentTwo();
Fragment fragment3 = new FragmentThree();
Fragment mCurrentFragment = null;

Step2 Show/hide你的片段

@Override
public void onNavigationDrawerItemSelected(int position) {
    Fragment fragment;
    switch (position) {
    case 1:
        fragment = fragment1;
        break;
    case 2:
        fragment = fragment2;
        break;
    case 3:
        fragment = fragment3;
        break;
    }
    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    if(mCurrentFragment == null) {
        ft.add(R.id.container, fragment).commit();
        mCurrentFragment = fragment;
    } else if(fragment.isAdded()) {
        ft.hide(mCurrentFragment).show(fragment).commit();
    } else {
        ft.hide(mCurrentFragment).add(R.id.container, fragment).commit();
    }
    mCurrentFragment = fragment;
}

你可以做到,

  1. 您可以获得容器中当前片段的名称。这将 return 名称包括包 + 片段名称

    String name = getFragmentManager().findFragmentById(container id ).getClass().getName();
    
  2. 当你点击抽屉的home索引时,查看当前的nameid等于home

  3. 如果在家,则无需执行任何操作。

我知道很久以前有人问过这个问题并回答过这个问题,但是,我想展示一下我解决这个问题的方法,也许它会对其他人有所帮助:

我在我使用的每个片段上添加了一个片段名称,例如:

public class MainFragment extends BaseFragment {
    public static final String FRAGMENT_TAG = "main";
    // ... all your fragment
}

在抽屉布局上:

public void methodThatSetsTheUi() {
     mDrawerView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            getFragmentManager().findFragmentByTag("main");
            String tag = getFragmentTag(position);
            replaceFragment(getOrCreateFragment(tag), tag);
            mDrawerLayout.closeDrawer(mDrawerView);
        }
    });
}

@NonNull
private String getFragmentTag(int position) {
    String tag;
    switch (position) {
        case MAIN_FRAGMENT_DRAWER_POSITION:
            tag = MainFragment.FRAGMENT_TAG;
            break;
        case FAVORITE_FRAGMENT_DRAWER_POSITION:
            tag = FavoriteFragment.FRAGMENT_TAG;
            break;
        default:
            throw new AssertionError("That selection is wrong");
    }
    return tag;
}

private BaseFragment getOrCreateFragment(String fragmentName) {
    BaseFragment fragment = (BaseFragment) getFragmentManager().findFragmentByTag(fragmentName);
    if(fragment == null) {
        fragment = FragmentFactory.createFragment(fragmentName);
    }
    return  fragment;
}

好吧,FragmentFactory 只是一个简单的工厂:

public 最终 class FragmentFactory {

public static BaseFragment createFragment(String fragmentName) {
    switch(fragmentName) {
        case MainFragment.FRAGMENT_TAG:
            return MainFragment.newInstance();
        case FavoriteFragment.FRAGMENT_TAG:
            return FavoriteFragment.newInstance();
        // ... all fragments here.
        default:
            return null;
    }
}

希望能帮到别人。