Android 如何从导航抽屉中打开新片段?

Android 如何从导航抽屉中打开新片段?,android,android-fragments,navigation-drawer,Android,Android Fragments,Navigation Drawer,我正在使用developer.android.com指南构建一个应用程序。当我在Android Studio中创建一个新项目时,我选择了“导航:导航抽屉”。我在互联网上搜索了我的问题的答案,但我找不到任何有效的答案。很抱歉,我是编程新手 在导航抽屉中单击时,如何使我的应用程序在主视图中打开新片段 在导航抽屉中单击时,是否可以使用选项卡打开多个可切换片段 如何使“标题”可展开/折叠 这就是我想要的布局: 标题(章节*而非章节(标题;) 导航抽屉是当今一种新的时尚设计。在为导航抽屉活动设计xm

我正在使用developer.android.com指南构建一个应用程序。当我在Android Studio中创建一个新项目时,我选择了“导航:导航抽屉”。我在互联网上搜索了我的问题的答案,但我找不到任何有效的答案。很抱歉,我是编程新手

  • 在导航抽屉中单击时,如何使我的应用程序在主视图中打开新片段
  • 在导航抽屉中单击时,是否可以使用选项卡打开多个可切换片段
  • 如何使“标题”可展开/折叠
  • 这就是我想要的布局:


    标题(章节*而非章节(标题;)

    导航抽屉是当今一种新的时尚设计。在为导航抽屉活动设计xml.layout(layout)时,我们使用两种布局:主内容布局和抽屉列表布局。我在这里回答你所有愚蠢的问题

    我如何使我的应用程序在主视图中打开一个新片段 在导航抽屉中单击

    只需在抽屉列表项上添加clicklistener,并根据单击的列表项的位置替换主要内容中的片段

    示例代码:

        // The click listener for ListView in the navigation drawer
        @SuppressWarnings("unused")
        private class DrawerItemClickListener implements ListView.OnItemClickListener {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                selectItem(position);
            }
        }
    
        private void selectItem(int position) {
    
            Fragment newFragment;
            FragmentTransaction transaction = getFragmentManager().beginTransaction();
    
            switch (position) {
            case 0:
                newFragment = new f1();
                transaction.replace(R.id.content_frame, newFragment);
                transaction.addToBackStack(null);
                transaction.commit();
                break;
    
            case 1:
                newFragment = new f2();
                transaction.replace(R.id.content_frame, newFragment);
                transaction.addToBackStack(null);
                transaction.commit();
                break;
    
            case 2:
                newFragment = new f3();
                transaction.replace(R.id.content_frame, newFragment);
                transaction.addToBackStack(null);
                transaction.commit();
                break;
    
            case 3:
                newFragment = new f4();
                transaction.replace(R.id.content_frame, newFragment);
                transaction.addToBackStack(null);
                transaction.commit();
                break;  
    
    
            }
            //DrawerList.setItemChecked(position, true);
            setTitle(ListTitles[position]);
            DrawerLayout.closeDrawer(DrawerList);   
        }
    
    另一个片段的代码。i、 e F_tab2.java

    import android.os.Bundle;
    import android.support.v4.app.Fragment;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    
    public class F_tab2 extends Fragment {
    
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
    
            View view=inflater.inflate(R.layout.friends_list, container,false);
    
    
            return view;
        }
    
    }
    
    现在,只需在抽屉列表中使用前面提到的clicklistener,即可在项目上加载F_main,单击抽屉列表,这将进一步在主内容视图中加载F_main fragmnet中的选项卡

    如何使“标题”可展开/折叠

    我不知道NV抽屉是否提供此功能。但它提供了一个功能,可以根据选定的抽屉项目或加载的主要内容片段切换操作栏标题

    如《导航抽屉设计指南》中所述,当抽屉可见时,应修改操作栏的内容,例如更改标题并删除与主要内容相关的操作项。下面的代码显示了如何通过使用ActionBarDrawerToggle类的实例重写DrawerLayout.DrawerListener回调方法来实现这一点,如下所示

     public class MainActivity extends Activity {
        private DrawerLayout mDrawerLayout;
        private ActionBarDrawerToggle mDrawerToggle;
        private CharSequence mDrawerTitle;
        private CharSequence mTitle;
        ...
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            ...
    
            mTitle = mDrawerTitle = getTitle();
            mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
            mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
                    R.drawable.ic_drawer, R.string.drawer_open, R.string.drawer_close) {
    
                /** Called when a drawer has settled in a completely closed state. */
                public void onDrawerClosed(View view) {
                    getActionBar().setTitle(mTitle);
                    invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
                }
    
                /** Called when a drawer has settled in a completely open state. */
                public void onDrawerOpened(View drawerView) {
                    getActionBar().setTitle(mDrawerTitle);
                    invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
                }
            };
    
            // Set the drawer toggle as the DrawerListener
            mDrawerLayout.setDrawerListener(mDrawerToggle);
        }
    
        /* Called whenever we call invalidateOptionsMenu() */
        @Override
        public boolean onPrepareOptionsMenu(Menu menu) {
            // If the nav drawer is open, hide action items related to the content view
            boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerList);
            menu.findItem(R.id.action_websearch).setVisible(!drawerOpen);
            return super.onPrepareOptionsMenu(menu);
        }
        }
    

    +1为伟大的油漆使用技能…真棒!这是一个很好的答案!非常感谢这是一个非常详细的答案,太棒了!通过这种方式,如果您在同一导航抽屉项目上单击两次,那么您将获得相同的片段,并将其添加到后堆栈中两次(即,如果您按下“后退”按钮,您将看到相同的片段,而不是上一个片段)。@Aman_devy,以及如何通过另一个活动打开抽屉中的特定片段?每次您只是通过“newFragment=new f1();”创建一个新片段,这是一个好的做法吗?您认为将所有片段作为成员变量保存会更好吗?因此,每次用户单击菜单项时,只需使用“transaction.replace(R.id.content_frame,MFFragment1)”,无需创建新的片段。
    import android.os.Bundle;
    import android.support.v4.app.Fragment;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    
    public class F_tab1 extends Fragment {
    
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
    
            View view=inflater.inflate(R.layout.friends_list, container,false);
    
    
            return view;
        }
    
    }
    
    import android.os.Bundle;
    import android.support.v4.app.Fragment;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    
    public class F_tab2 extends Fragment {
    
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
    
            View view=inflater.inflate(R.layout.friends_list, container,false);
    
    
            return view;
        }
    
    }
    
     public class MainActivity extends Activity {
        private DrawerLayout mDrawerLayout;
        private ActionBarDrawerToggle mDrawerToggle;
        private CharSequence mDrawerTitle;
        private CharSequence mTitle;
        ...
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            ...
    
            mTitle = mDrawerTitle = getTitle();
            mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
            mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
                    R.drawable.ic_drawer, R.string.drawer_open, R.string.drawer_close) {
    
                /** Called when a drawer has settled in a completely closed state. */
                public void onDrawerClosed(View view) {
                    getActionBar().setTitle(mTitle);
                    invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
                }
    
                /** Called when a drawer has settled in a completely open state. */
                public void onDrawerOpened(View drawerView) {
                    getActionBar().setTitle(mDrawerTitle);
                    invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
                }
            };
    
            // Set the drawer toggle as the DrawerListener
            mDrawerLayout.setDrawerListener(mDrawerToggle);
        }
    
        /* Called whenever we call invalidateOptionsMenu() */
        @Override
        public boolean onPrepareOptionsMenu(Menu menu) {
            // If the nav drawer is open, hide action items related to the content view
            boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerList);
            menu.findItem(R.id.action_websearch).setVisible(!drawerOpen);
            return super.onPrepareOptionsMenu(menu);
        }
        }