【问题标题】:Navigation Drawer Submenu导航抽屉子菜单
【发布时间】:2016-07-25 11:12:41
【问题描述】:

我已经在我的项目中实现了导航抽屉。一切都很好,项目已经全部设置好了。我的抽屉有问题。点击每个项目时,我都有子项目,但我不想以可扩展的形式显示它列表视图,我想在我的主导航抽屉旁边打开另一个包含子项目的子抽屉。我该怎么做。请帮忙。

上下文中的代码

主活动

public class MainActivity extends AppCompatActivity {

    Toolbar toolbar;
    private String[] mTitles;
    private DrawerLayout mDrawerLayout;
    private ListView mDrawerList;
    private ActionBarDrawerToggle mDrawerToggle;



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initToolbar();

        mTitles=getResources().getStringArray(R.array.drawer_titles);
        mDrawerLayout=(DrawerLayout)findViewById(R.id.drawer_layout);
        mDrawerList=(ListView)findViewById(R.id.left_drawer);

        mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START);

        mDrawerList.setAdapter(new ArrayAdapter<String>(this,
                R.layout.drawer_list_item, mTitles));

        mDrawerList.setOnItemClickListener(new DrawerItemClickListener());


        mDrawerToggle = new ActionBarDrawerToggle(
                this, mDrawerLayout, toolbar, R.string.drawer_open, R.string.drawer_close) {
        };
        mDrawerLayout.setDrawerListener(mDrawerToggle);

        if (savedInstanceState == null) {
            selectItem(0);
        }


    }
    private void initToolbar() {
        toolbar=(Toolbar)findViewById(R.id.toolbar);
        toolbar.setTitle(R.string.toolbar_title);
        setSupportActionBar(toolbar);
        toolbar.setNavigationIcon(R.drawable.ic_drawer);
    }

    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) {
        // update the main content

    }


}

main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.v7.widget.Toolbar
        android:layout_width="match_parent"
        android:id="@+id/toolbar"
        android:background="#efeaea"
        android:layout_height="50dp"/>

    <android.support.v4.widget.DrawerLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/drawer_layout"
        android:layout_below="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <!-- As the main content view, the view below consumes the entire
             space available using match_parent in both dimensions. -->
        <LinearLayout
            android:id="@+id/content_frame"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="horizontal" />

        <!-- android:layout_gravity="start" tells DrawerLayout to treat
             this as a sliding drawer on the left side for left-to-right
             languages and on the right side for right-to-left languages.
             The drawer is given a fixed width in dp and extends the full height of
             the container. A solid background is used for contrast
             with the content view. -->
        <ListView
            android:id="@+id/left_drawer"
            android:layout_width="240dp"
            android:layout_height="match_parent"
            android:layout_gravity="start"
            android:choiceMode="singleChoice"
            android:dividerHeight="2dp"
            android:background="#ffffff"/>

    </android.support.v4.widget.DrawerLayout>
</RelativeLayout>

【问题讨论】:

    标签: android navigation navigation-drawer navigationbar


    【解决方案1】:

    您可以实现自定义可扩展适配器

    list_item.xml //组内的子视图

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="55dip"
        android:orientation="vertical"
        android:divider="@color/black">
    
        <TextView
            android:id="@+id/lblListItem"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:textSize="@dimen/textSize14"
            android:typeface="sans"
            android:paddingTop="5dp"
            android:paddingBottom="5dp"
            android:layout_marginLeft="80dp"/>
    
    </LinearLayout>
    

    list_group.xml //父视图

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="100dp"
        android:orientation="horizontal"
        android:padding="3dp"
        android:dividerPadding="10dp">
    
    
        <ImageView
            android:layout_width="40dp"
            android:layout_height="40dp"
            android:id="@+id/navImage"
            android:layout_margin="@dimen/padding_10dp"
            android:layout_gravity="center"/>
    
        <TextView
            android:id="@+id/lblListHeader"
            android:layout_width="200dp"
            android:layout_height="match_parent"
            android:layout_marginLeft="10dp"
            android:gravity="left|center"
            android:layout_weight=".5"
            android:textSize="@dimen/textSize20"/>
    
        <TextView
            android:layout_width="50dp"
            android:layout_height="match_parent"
            android:id="@+id/Collapser"
            android:textSize="@dimen/textSize20"
            android:textAllCaps="true"
            android:text="+"
            android:layout_gravity="center_vertical"
            android:gravity="center"
            android:layout_weight=".5"
            android:textStyle="normal"/>
    
    
    
    </LinearLayout>
    

    可扩展列表适配器

    public class ExpandableListAdapter extends BaseExpandableListAdapter {
    
        private Context _context;
        private List<String> _listDataHeader; // header titles
        // child data in format of header title, child title
        private HashMap<String, List<String>> _listDataChild;
        private int[] headerIcons;
    
    
    
        public ExpandableListAdapter(Context context,int[] headerIcons, List<String> listDataHeader,
                                     HashMap<String, List<String>> listChildData) {
            this._context = context;
            this.headerIcons = headerIcons;
            this._listDataHeader = listDataHeader;
            this._listDataChild = listChildData;
    
        }
    
        @Override
        public Object getChild(int groupPosition, int childPosititon) {
            return this._listDataChild.get(this._listDataHeader.get(groupPosition))
                    .get(childPosititon);
        }
    
        @Override
        public long getChildId(int groupPosition, int childPosition) {
            return childPosition;
        }
    
        @Override
        public View getChildView(int groupPosition, final int childPosition,
                                 boolean isLastChild, View convertView, ViewGroup parent) {
    
            final String childText = (String) getChild(groupPosition, childPosition);
    
            if (convertView == null) {
                LayoutInflater infalInflater = (LayoutInflater) this._context
                        .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                convertView = infalInflater.inflate(R.layout.list_item, null);
            }
    
    
            TextView txtListChild = (TextView) convertView
                    .findViewById(R.id.lblListItem);
    
            txtListChild.setText(childText);
            return convertView;
        }
    
        @Override
        public int getChildrenCount(int groupPosition) {
            return this._listDataChild.get(this._listDataHeader.get(groupPosition))
                    .size();
        }
    
        @Override
        public Object getGroup(int groupPosition) {
            return this._listDataHeader.get(groupPosition);
        }
    
        @Override
        public int getGroupCount() {
            return this._listDataHeader.size();
        }
    
        @Override
        public long getGroupId(int groupPosition) {
            return groupPosition;
        }
    
        @Override
        public View getGroupView(int groupPosition, boolean isExpanded,
                                 View convertView, ViewGroup parent) {
            String headerTitle = (String) getGroup(groupPosition);
    
            if (convertView == null) {
                LayoutInflater infalInflater = (LayoutInflater) this._context
                        .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                convertView = infalInflater.inflate(R.layout.list_group, null);
            }
    
            ImageView headerImage = (ImageView)convertView.findViewById(R.id.navImage);
    
            TextView lblListHeader = (TextView) convertView
                    .findViewById(R.id.lblListHeader);
            lblListHeader.setText(headerTitle);
            TextView lvlPlusMinus=(TextView)convertView.findViewById(R.id.Collapser);
            if(getChildrenCount(groupPosition)!=0)
            {
    
                lvlPlusMinus.setTypeface(null, Typeface.NORMAL);
    
                lvlPlusMinus.setText("+");
    
                if(isExpanded)
                {
                    lvlPlusMinus.setTypeface(null, Typeface.NORMAL);
                    lvlPlusMinus.setText("-");
    
                }
            }
            else
            {
                lvlPlusMinus.setText("");
            }
    
            headerImage.setImageResource(headerIcons[groupPosition]);
            return convertView;
        }
    
        @Override
        public boolean hasStableIds() {
            return false;
        }
    
        @Override
        public boolean isChildSelectable(int groupPosition, int childPosition) {
            return true;
        }
    
    }
    

    在您的导航抽屉中

    public class NavigationDrawerFragment extends Fragment {
    
        /**
         * Remember the position of the selected item.
         */
        private static final String STATE_SELECTED_POSITION = "selected_navigation_drawer_position";
    
        /**
         * Per the design guidelines, you should show the drawer on launch until the user manually
         * expands it. This shared preference tracks this.
         */
        private static final String PREF_USER_LEARNED_DRAWER = "navigation_drawer_learned";
    
        /**
         * A pointer to the current callbacks instance (the Activity).
         */
        private NavigationDrawerCallbacks mCallbacks;
    
        /**
         * Helper component that ties the action bar to the navigation drawer.
         */
        private ActionBarDrawerToggle mDrawerToggle;
    
        private DrawerLayout mDrawerLayout;
       // private ListView mDrawerListView;
        private View mFragmentContainerView;
    
        ExpandableListAdapter listAdapter;
        ExpandableListView mDrawerListView;
        private int mCurrentSelectedPosition = 0;
        private boolean mFromSavedInstanceState;
        private boolean mUserLearnedDrawer;
        private int lastExpandedPosition = -1;
        List<String> listDataHeader;
        HashMap<String, List<String>> listDataChild;
        Map<String, String> params;
        HashMap<String, String> userDetails;
        public Fragment fragment = null;
        String  tag,URL ;
        android.support.v4.app.FragmentManager fragmentManager;
        FragmentTransaction transaction;
        Handler handler;
        Runnable runnable;
        private final Handler mDrawerHandler = new Handler();
    
    
        /**
         * AppointmentRequest ♠♠
         */
        ProgressDialog bar ;
        public static  final NavigationDrawerFragment NavUtils = new NavigationDrawerFragment();
        public static NavigationDrawerFragment getInstance() {
            return NavUtils;
        }
        public NavigationDrawerFragment() {
        }
    
    
        View contentView;
        SessionManager session;
        TextView doctorName;
        ImageView docImage;
    
        int[] headerIcons;
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            fragmentManager = getFragmentManager();
            transaction = fragmentManager.beginTransaction();
            session = new SessionManager(getActivity());
    
            // Read in the flag indicating whether or not the user has demonstrated awareness of the
            // drawer. See PREF_USER_LEARNED_DRAWER for details.
            SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getActivity());
            mUserLearnedDrawer = sp.getBoolean(PREF_USER_LEARNED_DRAWER, false);
    
            if (savedInstanceState != null) {
                mCurrentSelectedPosition = savedInstanceState.getInt(STATE_SELECTED_POSITION);
                mFromSavedInstanceState = true;
            }
            headerIcons = new int[]{
                    R.drawable.home,
                    R.drawable.profile,
                    R.drawable.logout
            };
    
            selectItem(mCurrentSelectedPosition);
    
        }
    
    
    
    
        @Override
        public void onActivityCreated(Bundle savedInstanceState) {
            super.onActivityCreated(savedInstanceState);
            // Indicate that this fragment would like to influence the set of actions in the action bar.
            setHasOptionsMenu(true);
        }
    
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            contentView = inflater.inflate(
                    R.layout.fragment_navigation_drawer_with_topheader, container, false);
    
            mDrawerListView = (ExpandableListView) contentView.findViewById(R.id.expList);
            doctorName = (TextView)contentView.findViewById(R.id.docName);
            mDrawerListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, final int position, long id) {
                    selectItem(position);
                }
            });
    
            // preparing list data
            prepareListData();
    
            listAdapter = new ExpandableListAdapter(getActivity(), headerIcons, listDataHeader, listDataChild);
            mDrawerListView.setAdapter(listAdapter);
            mDrawerListView.setOnGroupExpandListener(new ExpandableListView.OnGroupExpandListener() {
    
                @Override
                public void onGroupExpand(int groupPosition) {
                    if (lastExpandedPosition != -1
                            && groupPosition != lastExpandedPosition) {
                        mDrawerListView.smoothScrollToPosition(groupPosition);
                        mDrawerListView.collapseGroup(lastExpandedPosition);
    
                    }
                    lastExpandedPosition = groupPosition;
                }
            });
    
            mDrawerListView.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() {
                @Override
                public boolean onGroupClick(ExpandableListView parent, View v, final int groupPosition, long id) {
    
                    final String selected = (String) listDataHeader.get(groupPosition);
                    mDrawerListView.smoothScrollToPosition(groupPosition);
    
                    mDrawerHandler.removeCallbacksAndMessages(null);
                    mDrawerHandler.postDelayed(new Runnable() {
                        @Override
                        public void run() {
                            //Toast.makeText(getActivity(), selected, Toast.LENGTH_SHORT).show();
                        }
                    }, 250);
    
                    if (groupPosition == 0 ||)//close drawer if no child
                        mDrawerLayout.closeDrawers();
    
                    return false;
                }
            });
    
    
            /**
             * Expandable list child on click listener
             */
            mDrawerListView.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {
    
                @Override
                public boolean onChildClick(ExpandableListView parent, View v, final int groupPosition, final int childPosition, long id) {
                    final String selected = (String) listAdapter.getChild(
                            groupPosition, childPosition);
                    mDrawerListView.smoothScrollToPosition(groupPosition);
                    mDrawerHandler.removeCallbacksAndMessages(null);
                    mDrawerHandler.postDelayed(new Runnable() {
                        @Override
                        public void run() {
                           // Toast.makeText(getActivity(), selected, Toast.LENGTH_SHORT).show();
                        }
                    }, 250);
                    mDrawerLayout.closeDrawers();
    
                    return true;
                }
            });
    
    
            mDrawerListView.setItemChecked(mCurrentSelectedPosition, true);
    
    
            return contentView;
        }
        /*
            * Preparing the list data
            */
        private void prepareListData() {
            listDataHeader = new ArrayList<String>();
            listDataChild = new HashMap<String, List<String>>();
    
            // Adding Child in Parent 
            listDataHeader.add("Home");//0
            listDataHeader.add("Profile");//1
            listDataHeader.add("Sign out");//2
    
    
            List<String> Profile = new ArrayList<String>();
            Casefile.add("Child 1");
            Casefile.add("Child 2");
    
    
            listDataChild.put(listDataHeader.get(0), new ArrayList<String>());// Header, Child data
            listDataChild.put(listDataHeader.get(1), Profile);
            listDataChild.put(listDataHeader.get(2), new ArrayList<String>());//if no child
        }
        public boolean isDrawerOpen() {
            return mDrawerLayout != null && mDrawerLayout.isDrawerOpen(mFragmentContainerView);
        }
    
        /**
         * Users of this fragment must call this method to set up the navigation drawer interactions.
         *
         * @param fragmentId   The android:id of this fragment in its activity's layout.
         * @param drawerLayout The DrawerLayout containing this fragment's UI.
         */
        public void setUp(int fragmentId, DrawerLayout drawerLayout) {
            mFragmentContainerView = getActivity().findViewById(fragmentId);
            mDrawerLayout = drawerLayout;
    
            // set a custom shadow that overlays the  content when the drawer opens
            mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START);
            // set up the drawer's list view with items and click listener
            ActionBar actionBar = getActionBar();
            actionBar.setDisplayHomeAsUpEnabled(true);
            actionBar.setHomeButtonEnabled(true);
            actionBar.setHomeAsUpIndicator(R.drawable.dehaze);
            // ActionBarDrawerToggle ties together the the proper interactions
            // between the navigation drawer and the action bar app icon.
            mDrawerToggle = new ActionBarDrawerToggle(
                    getActivity(),                    /* host Activity */
                    mDrawerLayout,                    /* DrawerLayout object */
                    R.drawable.dehaze,             /* nav drawer image to replace 'Up' caret */
                    R.string.navigation_drawer_open,  /* "open drawer" description for accessibility */
                    R.string.navigation_drawer_close  /* "close drawer" description for accessibility */
    
            )
            {
                @Override
                public void onDrawerClosed(View drawerView) {
                    super.onDrawerClosed(drawerView);
                    if (!isAdded()) {
                        return;
                    }
    
                    getActivity().supportInvalidateOptionsMenu(); // calls onPrepareOptionsMenu()
                }
    
                @Override
                public void onDrawerOpened(View drawerView) {
                    super.onDrawerOpened(drawerView);
                    if (!isAdded()) {
                        return;
                    }
    
                    if (!mUserLearnedDrawer) {
                        // The user manually opened the drawer; store this flag to prevent auto-showing
                        // the navigation drawer automatically in the future.
                        mUserLearnedDrawer = true;
                        SharedPreferences sp = PreferenceManager
                                .getDefaultSharedPreferences(getActivity());
                        sp.edit().putBoolean(PREF_USER_LEARNED_DRAWER, true).apply();
                    }
    
                    getActivity().supportInvalidateOptionsMenu(); // calls onPrepareOptionsMenu()
                }
            };
    
            // If the user hasn't 'learned' about the drawer, open it to introduce them to the drawer,
            // per the navigation drawer design guidelines.
            if (!mUserLearnedDrawer && !mFromSavedInstanceState) {
                mDrawerLayout.openDrawer(mFragmentContainerView);
            }
    
            // Defer code dependent on restoration of previous instance state.
            mDrawerLayout.post(new Runnable() {
                @Override
                public void run() {
                    mDrawerToggle.syncState();
                }
            });
    
    
    
            mDrawerLayout.setDrawerListener(mDrawerToggle);
    
        }
    
    
    
    
    
        private void selectItem(int position) {
            mCurrentSelectedPosition = position;
            if (mDrawerListView != null) {
                mDrawerListView.setItemChecked(position, true);
            }
            if (mDrawerLayout != null) {
                mDrawerLayout.closeDrawer(mFragmentContainerView);
            }
            if (mCallbacks != null) {
                mCallbacks.onNavigationDrawerItemSelected(position);
            }
        }
    
        @Override
        public void onAttach(Activity activity) {
            super.onAttach(activity);
            try {
                mCallbacks = (NavigationDrawerCallbacks) activity;
            } catch (ClassCastException e) {
                throw new ClassCastException("Activity must implement NavigationDrawerCallbacks.");
            }
        }
    
        @Override
        public void onDetach() {
            super.onDetach();
            mCallbacks = null;
        }
    
        @Override
        public void onSaveInstanceState(Bundle outState) {
            outState.putString("WORKAROUND_FOR_BUG_19917_KEY", "WORKAROUND_FOR_BUG_19917_VALUE");
            super.onSaveInstanceState(outState);
            outState.putInt(STATE_SELECTED_POSITION, mCurrentSelectedPosition);
        }
    
    
        @Override
        public void onConfigurationChanged(Configuration newConfig) {
            super.onConfigurationChanged(newConfig);
            // Forward the new configuration the drawer toggle component.
            mDrawerToggle.onConfigurationChanged(newConfig);
        }
    
        @Override
        public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
            // If the drawer is open, show the global app actions in the action bar. See also
            // showGlobalContextActionBar, which controls the top-left area of the action bar.
            /*if (mDrawerLayout != null && isDrawerOpen()) {
                inflater.inflate(R.menu.global, menu);
                showGlobalContextActionBar();
            }*/
            super.onCreateOptionsMenu(menu, inflater);
        }
    
        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            if (mDrawerToggle.onOptionsItemSelected(item)) {
                return true;
            }
    
    
    
            return super.onOptionsItemSelected(item);
        }
    
    
    
        /**
         * Per the navigation drawer design guidelines, updates the action bar to show the global app
         * 'context', rather than just what's in the current screen.
         */
        private void showGlobalContextActionBar() {
            ActionBar actionBar = getActionBar();
            actionBar.setDisplayShowTitleEnabled(true);
            actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
            actionBar.setTitle(R.string.app_name);
        }
    
        private ActionBar getActionBar() {
            return ((ActionBarActivity) getActivity()).getSupportActionBar();
        }
    
        /**
         * Callbacks interface that all activities using this fragment must implement.
         */
        public static interface NavigationDrawerCallbacks {
            /**
             * Called when an item in the navigation drawer is selected.
             */
            void onNavigationDrawerItemSelected(int position);
        }
    
    
    
        /**
         * Diplaying view for selected nav drawer list item
         * */
    
        private void displayView(final int position) {
            // update the  content by replacing fragments
    
            switch (position) {
                case 0:
                        mDrawerLayout.closeDrawers();
                        tag = "HomeFragment";
                        fragment = new HomeFragment();
    
    
                    break;
                case 1:
                        mDrawerLayout.closeDrawers();
                        tag = "ProfileFragment";
                        fragment = new ProfileFragment();
    
    
                    break;
                case 2:
                        mDrawerLayout.closeDrawers();
                        tag = "Signout";
                        fragment= null;
                        //Signout
                    break;
    
                default:
                    break;
            }
            if (fragment != null) {
                // update selected item and title, then close the drawer
                mDrawerListView.setItemChecked(position, true);
                mDrawerListView.setSelection(position);
                mDrawerListView.smoothScrollToPosition(position);
                android.support.v4.app.FragmentManager fragmentManager = getFragmentManager();
                FragmentTransaction transaction = fragmentManager.beginTransaction();
                transaction.replace(R.id.container, fragment, tag);
                transaction.commit();
    
    
    
            } else {
                // error in creating fragment
                Log.e("MainActivity", "Error in creating fragment");
            }
    
        }
    

    【讨论】:

    • 请帮我解决主要活动的变化。
    • 编辑了我的答案,请检查,我建议您使用带有菜单的导航抽屉的新实现,它比上述方法更简单
    猜你喜欢
    • 2015-09-26
    • 1970-01-01
    • 2014-08-20
    • 1970-01-01
    • 2013-06-13
    • 1970-01-01
    • 2015-11-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多