【问题标题】:Navigation Drawer Fragments导航抽屉片段
【发布时间】:2016-05-26 08:57:10
【问题描述】:

所以我的导航抽屉有 5 个不同的选项。它们都打开了我创建的新片段。第一个是主页,我正在尝试找到一种方法将其带回显示在导航抽屉下方的第一个屏幕。它在 main_activity.xml 中具有“容器”的 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;
    }
}

【问题讨论】:

    标签: android android-fragments navigation-drawer


    【解决方案1】:

    使用方法add,hideshow,

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

    【讨论】:

    • 那行得通。不确定我是否完全理解如何,但我会尝试弄清楚。非常感谢,非常感谢您的快速帮助。
    【解决方案2】:

    你可以这样做,

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

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

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

    【讨论】:

    • 我确实让它工作以提出不同的片段。这是碎片一旦出现的事实。当我点击家时,我无法让碎片消失。我对它的工作原理有点困惑。
    • 现在你已经解决了 yummy 的 anwser 的问题,所以试着弄清楚它是如何工作的 :)
    【解决方案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 只是一个简单的工厂:

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

    希望对某人有所帮助。

    【讨论】:

      猜你喜欢
      • 2018-01-16
      • 2016-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多