导航抽屉碎片

时间:2015-04-09 15:13:47

标签: android android-fragments navigation-drawer

所以我的导航抽屉有5种不同的选择。他们都打开了我创建的新片段。第一个是Home,我试图找到一种方法将它带回导航抽屉下显示的第一个屏幕。它在main_activity.xml中具有“container”的id。我不想使用并打算再次调用整个类来加载。此外,我不希望能够使用其他意图的后退按钮。我很困惑如何实现这一目标。

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

3 个答案:

答案 0 :(得分:3)

使用方法addhideshow

Step1准备所有碎片

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

Step2显示/隐藏您的片段

@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 :(得分:0)

你可以这样做,

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

    的名称
    String name = getFragmentManager().findFragmentById(container id ).getClass().getName();
    
  2. 当您点击抽屉的主索引时,请检查天气当前名称ID是否等于家。

  3. 如果是在家,您不需要执行任何操作。

答案 2 :(得分:0)

我知道这是很久以前被问过和回答过的,但是,我想展示一下我对这个问题的看法,也许它会帮助其他人:

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

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只是一个简单的工厂:

公共最终类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;
    }
}

希望能帮助别人。