【问题标题】:How to change fragments using Android navigation drawer如何使用 Android 导航抽屉更改片段
【发布时间】:2013-12-17 16:04:56
【问题描述】:

我知道这些类型的问题已经出现在这里,但我仍然没有找到我对这个问题的答案:

  • 我创建了一个应用程序并使用了由应用程序 (AndroidStudio) 自动创建的导航抽屉

这是我所拥有的:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mNavigationDrawerFragment = (NavigationDrawerFragment)
            getFragmentManager().findFragmentById(R.id.navigation_drawer);
    mTitle = getTitle();

    // Set up the drawer.
    mNavigationDrawerFragment.setUp(
            R.id.navigation_drawer,
            (DrawerLayout) findViewById(R.id.drawer_layout));
}

@Override
public void onNavigationDrawerItemSelected(int position) {
    // update the main content by replacing fragments
    FragmentManager fragmentManager = getFragmentManager();
    fragmentManager.beginTransaction()
            .replace(R.id.container, PlaceholderFragment.newInstance(position + 1))
            .commit();
}

public void onSectionAttached(int number) {
    switch (number) {
        case 1:

            break;
        case 2:

            break;
        case 3:

            break;
    }
}

这里还有更多:

    public static PlaceholderFragment newInstance(int sectionNumber) {
        PlaceholderFragment fragment = new PlaceholderFragment();
        Bundle args = new Bundle();
        args.putInt(ARG_SECTION_NUMBER, sectionNumber);
        fragment.setArguments(args);
        return fragment;
    }

    public PlaceholderFragment() {
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_main, container, false);
        return rootView;
    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        ((MainActivity) activity).onSectionAttached(
                getArguments().getInt(ARG_SECTION_NUMBER));
    }
}

我想使用导航抽屉中的按钮显示另一个片段。我想使用此代码,所以请不要向我发送任何制作自己的抽屉的指南或教程..

问题是,如果我想打开另一个片段,我应该在 case 1: case 2:case 3: 中输入什么? 谢谢。

还有一个问题:

  • 如何添加更多片段和事务? 这不起作用-

    Fragment fragment = new MyFragment1();
    Fragment frag = new MyFragment2();
    FragmentManager fragmentManager = getFragmentManager();
    switch(position) {
        case 0:
            fragment = new MyFragment1();
            break;
        case 1:
            frag = new MyFragment2();
    
            break;
    }
    fragmentManager.beginTransaction()
            .replace(R.id.container, fragment).commit();
    

【问题讨论】:

    标签: java android android-fragments


    【解决方案1】:

    你应该在onNavigationDrawerItemSelected方法中加入一个switch语句。

    这样的事情应该可以工作:

    public void onNavigationDrawerItemSelected(int position) {
        // update the main content by replacing fragments
        Fragment fragment;
        FragmentManager fragmentManager = getFragmentManager(); // For AppCompat use getSupportFragmentManager
        switch(position) {
            default:
            case 0:
                fragment = new MyFragment1();
                break;
            case 1:
                fragment = new MyFragment2();
                break;
        }
        fragmentManager.beginTransaction()
            .replace(R.id.container, fragment)
            .commit();
    }
    

    这很快就完成了,但我认为它应该可以工作

    【讨论】:

    • 太棒了!请再问一个问题 - 如何定义 MyFragment1() 或 MyFragment2() ?非常感谢。
    • 你必须创建自己的片段,这很像创建一个Activity。这是应该很容易理解的android开发示例developer.android.com/training/basics/fragments/creating.html
    • 是的。我之前已经完成了所有这些..问题是,我不知道如何实际定义 MyFragment1() - 我得到了“无法解析符号..”错误..¨
    • 只需创建另一个名为 MyFragment2 的片段,就像您对 MyFragment1 所做的那样,我的答案中的代码将起作用。 (我将更新它以修复未初始化的变量)。您不需要创建另一个片段变量,因为我们创建的第一个片段变量会根据您单击的导航项而改变
    • R.id.container 到底指的是什么?是相对布局还是什么?
    【解决方案2】:

    我通过inflater解决了这个问题:

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            View rootView;
            switch(getArguments().getInt(ARG_SECTION_NUMBER)) {
                case 1:
                    rootView = inflater.inflate(R.layout.fragment_obj_detail, container, false);
                    break;
                case 2:
                    rootView = inflater.inflate(R.layout.fragment_obj_list, container, false);
                    break;
                case 3:
                    rootView = inflater.inflate(R.layout.fragment_obj_list, container, false);
                    break;
                case 4:
                    rootView = inflater.inflate(R.layout.fragment_about, container, false);
                    break;
                default:
                    rootView = inflater.inflate(R.layout.fragment_obj_list, container, false);
            }
            return rootView;
        }
    

    【讨论】:

    • 正如下面所指出的,这不只是增加了布局,而没有增加功能吗? fragment_obj_detail、fragment_obj_list等的代码我相信不是用这种方法运行的。
    • 将所有内容写入一个文件的坏主意
    【解决方案3】:

    您需要在onNavigationDrawerItemSelected() 内创建一个switch 块,并使用每个case 已经存在的代码,但使用相应的Fragment 而不是PlaceholderFragment。现在它包含一段通用代码,用于将PlaceholderFragment 添加到布局中,并为您的目的重复使用它。

    【讨论】:

    • @user3053246,对不起,我认为给定一个位置,很明显你必须切换。请不要依赖这里的人为您编写代码。
    【解决方案4】:

    DenisGl 的回应,是正确的方式!!!使用默认创建的类成员,您可以在导航抽屉的各个组件之间切换! 您必须使用类成员 PlaceholderFragment 中的 onCreateView 方法。 这个类会在方法onNavigationDrawerItemSelected中自动调用

    下面是代码示例: /这个方法可以保持原样!它会自动调用 PlaceholderFragment 类!/

    @Override
    public void onNavigationDrawerItemSelected(int position) {
        // update the main content by replacing fragments
        FragmentManager fragmentManager = getSupportFragmentManager();
        fragmentManager.beginTransaction()
                .replace(R.id.container, PlaceholderFragment.newInstance(position + 1))
                .commit();
    }
    

    此方法改为,您输入 Switch Case

    @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            View rootView = null;
            rootView = inflater.inflate(R.layout.fragment_home, container, false);
            switch(getArguments().getInt(ARG_SECTION_NUMBER)) {
                case 1:
                    rootView = inflater.inflate(R.layout.fragment_home, container, false);
                    break;
                case 2:
                    //rootView = inflater.inflate(R.layout.fragment_obj_list, container, false);
                    break;
                case 3:
                    //rootView = inflater.inflate(R.layout.fragment_obj_list, container, false);
                    break;
                case 4:
                    rootView = inflater.inflate(R.layout.fragment_info, container, false);
                    break;
            }
            return rootView;
        }
    

    显然,您必须为我们感兴趣的每个片段调用布局!

    这 100% 有效,测试验证!

    【讨论】:

    • 这只是用布局膨胀占位符片段,但选择的片段仍然是占位符片段。片段的布局将被显示,但它的代码不会运行,除非它在占位符片段中。 Dreagens 的答案是正确的。
    【解决方案5】:

    它确实在 Eclipse IDE 中工作

       switch(getArguments().getInt(ARG_SECTION_NUMBER)) {
            case 1:
                rootView = inflater.inflate(R.layout.fragment_home, container, false);
                break;
            case 2:
                //rootView = inflater.inflate(R.layout.fragment_obj_list, container, false);
                break;
            case 3:
                //rootView = inflater.inflate(R.layout.fragment_obj_list, container, false);
                break;
            case 4:
                rootView = inflater.inflate(R.layout.fragment_info, container, false);
                break;
        }
    

    在函数中

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View rootView = null;
        rootView = inflater.inflate(R.layout.fragment_home, container, false);
        return rootView;
    }
    

    【讨论】:

      【解决方案6】:

      功能中:

         Bundle bundle = new Bundle();
         bundle.putInt("id", 10);//sending data to the second fragment                      
         NavHostFragment.findNavController(HomeFragment.this)//your fragment
         .navigate(R.id.action_nav_home_to_products_related_for_home_category,bundle);
      

      在 mobile_navigation.xml 中:

       <fragment
              android:id="@+id/nav_home"
              android:name="com.example.myapplication.ui.home.HomeFragment"
              android:label="@string/menu_home"
              tools:layout="@layout/fragment_home" >
              <action
                  android:id="@+id/action_nav_home_to_products_related_for_home_category"
                  app:destination="@id/products_related_for_home_category"
                  app:enterAnim="@anim/nav_default_enter_anim"
                  app:exitAnim="@anim/nav_default_exit_anim"
                  app:popEnterAnim="@anim/nav_default_pop_enter_anim"
                  app:popExitAnim="@anim/nav_default_pop_exit_anim"
                  >
                  <argument
                      android:name="myArg"
                      app:argType="integer"
                      android:defaultValue="1" />
              </action>
          </fragment>
      

      在第二个片段中:

      int id=getArguments().getInt("id");
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-07-23
        • 1970-01-01
        • 1970-01-01
        • 2016-01-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多