首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何为Android导航抽屉添加标题旁边的图标

如何为Android导航抽屉添加标题旁边的图标
EN

Stack Overflow用户
提问于 2013-06-02 00:35:47
回答 3查看 30.9K关注 0票数 16

我目前正在开发一个4.2.2版本的安卓应用,它使用了新的NavigationDrawer。除了添加图标之外,它就像一个护身符。

我发现了一些示例代码,其中列表视图成为相对布局,其中两个并行数组嵌套在一起,并由基于菜单模型的Array Adapter呈现,我认为这是一种同步的方式。

下面是MainActivity:

代码语言:javascript
复制
package com.sorin.medisynced.main;

import android.app.Activity;
import android.app.SearchManager;
import android.content.Intent;
import android.content.res.Configuration;
import android.os.Bundle;
import android.support.v4.app.ActionBarDrawerToggle;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;

import com.sorin.medisynced.R;
import com.sorin.medisynced.filepickerio.FilepickerSaver;
import com.sorin.medisynced.filepickerio.FilepickerViewer;
import com.sorin.medisynced.qr.IntentIntegrator;

public class MediSyncedMainActivity extends Activity {

    private ListView mDrawerList;
    private DrawerLayout mDrawerLayout;

    private String[] menuItemsData;
    private String[] menuItemsTools;
    private ActionBarDrawerToggle mDrawerToggle;
    private String[] menuItemsEmergency;
    private CharSequence mDrawerTitle;
    private CharSequence mTitle;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main_drawer);
        mTitle = mDrawerTitle = getTitle();
        // set click listener for list drawer
        // mDrawerList.setOnItemClickListener(new DrawerItemClickListener());
        // enable ActionBar app icon to behave as action to toggle nav drawer
        getActionBar().setDisplayHomeAsUpEnabled(true);
        getActionBar().setHomeButtonEnabled(true);

        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
        mDrawerList = (ListView) findViewById(R.id.drawer);

        // set a custom shadow that overlays the main content when the drawer
        // opens
        mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow,
                GravityCompat.START);

        _initMenu();

        // ActionBarDrawerToggle ties together the the proper interactions
        // between the sliding drawer and the action bar app icon
        mDrawerToggle = new ActionBarDrawerToggle(this, /* host Activity */
        mDrawerLayout, /* DrawerLayout object */
        R.drawable.ic_drawer, /* nav drawer image to replace 'Up' caret */
        R.string.drawer_open, /* "open drawer" description for accessibility */
        R.string.drawer_close /* "close drawer" description for accessibility */
        ) {
            public void onDrawerClosed(View view) {
                getActionBar().setTitle(getString(R.string.drawer_close));
                invalidateOptionsMenu(); // creates call to
                                            // onPrepareOptionsMenu()
            }

            @Override
            public void onDrawerOpened(View drawerView) {
                getActionBar().setTitle(getString(R.string.drawer_open));
                invalidateOptionsMenu(); // creates call to
                                            // onPrepareOptionsMenu()
            }
        };
        mDrawerLayout.setDrawerListener(mDrawerToggle);

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

    private void _initMenu() {
        NsMenuAdapter mAdapter = new NsMenuAdapter(this);

        // Add First Header
        mAdapter.addHeader(R.string.menu_data);

        // Add first block

        menuItemsData = getResources().getStringArray(R.array.menu_data);
        String[] menuDataIcons = getResources().getStringArray(
                R.array.data_menu_icons);

        int dataIcons = 0;
        for (String item : menuItemsData) {

            int id_data_title = getResources().getIdentifier(item, "string",
                    this.getPackageName());
            int id_data_icon = getResources()
                    .getIdentifier(menuDataIcons[dataIcons], "drawable",
                            this.getPackageName());

            NsMenuItemModel mItem = new NsMenuItemModel(id_data_title,
                    id_data_icon);
            mAdapter.addItem(mItem);
            dataIcons++;
        }
        // Add second header

        mAdapter.addHeader(R.string.menu_tools);
        // Add second block
        menuItemsTools = getResources().getStringArray(R.array.menu_tools);
        String[] menuToolsIcons = getResources().getStringArray(
                R.array.tools_menu_icons);

        int toolsIcons = 0;
        for (String item : menuItemsTools) {

            int id_tools_title = getResources().getIdentifier(item, "string",
                    this.getPackageName());
            int id_tools_icon = getResources().getIdentifier(
                    menuToolsIcons[toolsIcons], "drawable",
                    this.getPackageName());
            // creating drawer menu model
            NsMenuItemModel mItem = new NsMenuItemModel(id_tools_title,
                    id_tools_icon);
            mAdapter.addItem(mItem);
            toolsIcons++;
        }
        // Add third header

        mAdapter.addHeader(R.string.menu_emergency);
        // Add third block
        menuItemsEmergency = getResources().getStringArray(
                R.array.menu_emergency);
        String[] menuEmerIcons = getResources().getStringArray(
                R.array.emergency_menu_icons);

        int emerIcons = 0;

        for (String item : menuItemsEmergency) {

            int id_emer_title = getResources().getIdentifier(item, "string",
                    this.getPackageName());
            int id_emer_icon = getResources()
                    .getIdentifier(menuEmerIcons[emerIcons], "drawable",
                            this.getPackageName());

            // creating drawer menu model
            NsMenuItemModel mItem = new NsMenuItemModel(id_emer_title,
                    id_emer_icon);
            mAdapter.addItem(mItem);
            emerIcons++;
        }

        mDrawerList = (ListView) findViewById(R.id.drawer);
        if (mDrawerList != null)
            mDrawerList.setAdapter(mAdapter);

        mDrawerList.setOnItemClickListener(new DrawerItemClickListener());

    }

    @Override
    protected void onPostCreate(Bundle savedInstanceState) {
        super.onPostCreate(savedInstanceState);
        // Sync the toggle state after onRestoreInstanceState has occurred.
        mDrawerToggle.syncState();
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        mDrawerToggle.onConfigurationChanged(newConfig);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.main, menu);
        return super.onCreateOptionsMenu(menu);
    }

    /* 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_save).setVisible(!drawerOpen);
        return super.onPrepareOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        /*
         * The action bar home/up should open or close the drawer.
         * ActionBarDrawerToggle will take care of this.
         */
        if (mDrawerToggle.onOptionsItemSelected(item)) {
            return true;
        }
        // Handle action buttons
        switch (item.getItemId()) {
        case R.id.action_qrscan:

            IntentIntegrator integrator = new IntentIntegrator(
                    MediSyncedMainActivity.this);
            integrator.initiateScan();

            Toast.makeText(this, "Scan Qr Code", Toast.LENGTH_SHORT).show();
            return true;
        case R.id.action_filepicker_save:

            startActivity(new Intent(this, FilepickerSaver.class));

            Toast.makeText(this, "Save data on cloud", Toast.LENGTH_SHORT)
                    .show();
            return true;
        case R.id.action_filepicker_view:

            startActivity(new Intent(this, FilepickerViewer.class));

            Toast.makeText(this, "View data from cloud", Toast.LENGTH_SHORT)
                    .show();
            return true;
        case R.id.action_websearch:
            // create intent to perform web search for this planet
            Intent intent = new Intent(Intent.ACTION_SEARCH);
            intent.putExtra(SearchManager.QUERY, getApplicationContext()
                    .getDatabasePath(DROPBOX_SERVICE));
            // catch event that there's no activity to handle intent
            if (intent.resolveActivity(getPackageManager()) != null) {
                startActivity(intent);
            } else {
                Toast.makeText(this, R.string.search_database,
                        Toast.LENGTH_LONG).show();
            }
            return true;
        default:
            // Handle your other action bar items...
            return super.onOptionsItemSelected(item);
        }
    }

    private class DrawerItemClickListener implements
            ListView.OnItemClickListener {

        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position,
                long id) {
            // Highlight the selected item, update the title, and close the
            // drawer
            // update selected item and title, then close the drawer
            mDrawerList.getCount();
            mDrawerList.setItemChecked(position, true);
            String text = "menu click... should be implemented";
            Toast.makeText(MediSyncedMainActivity.this, text, Toast.LENGTH_LONG)
                    .show();
            mDrawerLayout.closeDrawer(mDrawerList);

        }

    }

    @Override
    public void setTitle(CharSequence title) {
        mTitle = title;
        getActionBar().setTitle(mTitle);
    }
}

以下是菜单模型:

代码语言:javascript
复制
package com.sorin.medisynced.main;


public class NsMenuItemModel {

    public int title;
    public int iconRes;
    public boolean isHeader;

    public NsMenuItemModel(int title, int iconRes,boolean header) {
        this.title = title;
        this.iconRes = iconRes;
        this.isHeader=header;
    }

    public NsMenuItemModel(int title, int iconRes) {
        this(title,iconRes,false);
    }

}

下面是ArrayAdapter的实现:

代码语言:javascript
复制
package com.sorin.medisynced.main;


import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import com.sorin.medisynced.R;

public class NsMenuAdapter extends ArrayAdapter<NsMenuItemModel> {

    /*
     * public NsMenuAdapter(Context context, int resource, int
     * textViewResourceId, String[] objects) { super(context,
     * R.layout.ns_menu_row, textViewResourceId, objects); }
     */

    public NsMenuAdapter(Context context) {
        super(context, 0);
    }

    public void addHeader(int title) {
        add(new NsMenuItemModel(title, -1, true));
    }

    public void addItem(int title, int icon) {
        add(new NsMenuItemModel(title, icon, false));
    }

    public void addItem(NsMenuItemModel itemModel) {
        add(itemModel);
    }

    @Override
    public int getViewTypeCount() {
        return 2;
    }

    @Override
    public int getItemViewType(int position) {
        return getItem(position).isHeader ? 0 : 1;
    }

    @Override
    public boolean isEnabled(int position) {
        return !getItem(position).isHeader;
    }

    public static class ViewHolder {
        public final TextView textHolder;
        public final ImageView imageHolder;

        public ViewHolder(TextView text1, ImageView image1) {
            this.textHolder = text1;
            this.imageHolder = image1;
        }
    }

    public View getView(int position, View convertView, ViewGroup parent) {

        NsMenuItemModel item = getItem(position);
        ViewHolder holder = null;
        View view = convertView;

        if (view == null) {
            int layout = R.layout.ns_menu_row;
            if (item.isHeader)
                layout = R.layout.ns_menu_row_header;

            view = LayoutInflater.from(getContext()).inflate(layout, null);

            TextView text1 = (TextView) view.findViewById(R.id.menurow_title);
            ImageView image1 = (ImageView) view.findViewById(R.id.menurow_icon);
            view.setTag(new ViewHolder(text1, image1));
        }

        if (holder == null && view != null) {
            Object tag = view.getTag();
            if (tag instanceof ViewHolder) {
                holder = (ViewHolder) tag;
            }
        }


        if(item != null && holder != null)
        {
            if (holder.textHolder != null)
                holder.textHolder.setText(item.title);

            if (holder.imageHolder != null) {
                if (item.iconRes > 0) {
                    holder.imageHolder.setVisibility(View.VISIBLE);
                    holder.imageHolder.setImageResource(item.iconRes);
                } else {
                    holder.imageHolder.setVisibility(View.GONE);
                }
            }
        }

        return view;        
    }

}

字符串数组xml:

代码语言:javascript
复制
<string-array name="menu_data">
    <item>menu_data_patient_profile</item>
    <item>menu_data_hospital_staff</item>
    <item>menu_data_xray_results</item>
    <item>menu_data_lab_results</item>
    <item>menu_data_medical_supplies_index</item>
    <item>menu_data_hospital_forms_index</item>
    <item>menu_data_prescriptions_index</item>
    <item>menu_data_illness_index</item>
    <item>menu_data_drugs_index</item>
    <item>menu_data_hospital_interactive_map</item>
</string-array>
<string-array name="menu_tools">
    <item>menu_tools_ecg</item>
    <item>menu_tools_pulse</item>
    <item>menu_tools_microscope_feed</item>
    <item>menu_tools_blood_pressure</item>
    <item>menu_tools_temperature</item>
    <item>menu_tools_radiation_levels</item>
    <item>menu_tools_movement_log</item>
</string-array>
<string-array name="menu_emergency">
    <item>menu_emergency_call_ambulance</item>
    <item>menu_emergency_call_helicopter</item>
    <item>menu_emergency_call_nurse</item>
    <item>menu_emergency_call_doctor</item>
</string-array>

<array name="data_menu_icons">
    <item>ic_patient_profile</item>
    <item>ic_hospital_staff</item>
    <item>ic_xray_results</item>
    <item>ic_lab_results</item>
    <item>ic_medical_supplies_index</item>
    <item>ic_hospital_forms_index</item>
    <item>ic_prescription_index</item>
    <item>ic_illness_index</item>
    <item>ic_drugs_index</item>
    <item>ic_hospital_interactive_map</item>
</array>
<array name="tools_menu_icons">
    <item>ic_ecg</item>
    <item>ic_pulse</item>
    <item>ic_microscope_feed</item>
    <item>ic_blood_pressure</item>
    <item>ic_body_temperature</item>
    <item>ic_radiation_levels</item>
    <item>ic_movement_logger</item>
</array>
<array name="emergency_menu_icons">
    <item>ic_call_ambulance</item>
    <item>ic_call_helicopter</item>
    <item>ic_call_nurse</item>
    <item>ic_call_doctor</item>
</array>

和主布局:

代码语言:javascript
复制
<!-- The main content view -->

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/content_frame"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MediSyncedMainActivity" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/drawer_text" />
</RelativeLayout>

<!-- The navigation drawer -->

<ListView
    android:id="@+id/drawer"
    android:layout_width="240dp"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    android:background="#DADADC"
    android:choiceMode="singleChoice"
    android:divider="@android:color/darker_gray"
    android:dividerHeight="1dp"
    android:showDividers="middle" />

我如何才能简化该方法。有没有办法使用一个数组而不是如此复杂的结构。

B.t.w.你可以在github上找到我的项目:https://github.com/greenspand/MediSynced

这是一款医疗应用程序,因此得名。谢谢你们。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-09-05 16:36:26

这是我的布局:

代码语言:javascript
复制
<LinearLayout  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content" >

  <ImageView
    android:id="@+id/drawer_item_icon"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:layout_marginLeft="10sp"
    android:layout_marginRight="10sp"
    android:src="@drawable/ic_launcher" />

  <TextView
    android:id="@+id/drawer_item_text"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content" 
    android:textSize="25sp"
    android:paddingTop="8sp"
    android:paddingBottom="8sp"
    android:paddingLeft="15sp" />

</LinearLayout>
票数 3
EN

Stack Overflow用户

发布于 2013-12-15 19:40:21

您可以使用自定义列表视图和列表适配器来显示抽屉中列表项以外的计数器。然后将您想要的任何代码添加到您的counter方法。这是我在我的导航抽屉中实现的代码,支持android应用:

抽屉的getter/setter方法类:

代码语言:javascript
复制
package info.aea.drawer;

public class NavDrawerItem {

    private String title;
    private String tag;
    private int icon;
    private String count = "0";
    // boolean to set visibility of the counter
    private boolean isCounterVisible = false;

    public NavDrawerItem(){}

    public NavDrawerItem(String title, String tag, int icon){
        this.title = title;
        this.tag = tag;
        this.icon = icon;
    }

    public NavDrawerItem(String title, String tag, int icon, boolean isCounterVisible, String count){
        this.title = title;
        this.tag = tag;
        this.icon = icon;
        this.isCounterVisible = isCounterVisible;
        this.count = count;
    }

    public String getTitle(){
        return this.title;
    }

    public String getTag(){
        return this.tag;
    }

    public int getIcon(){
        return this.icon;
    }

    public String getCount(){
        return this.count;
    }

    public boolean getCounterVisibility(){
        return this.isCounterVisible;
    }

    public void setTitle(String title){
        this.title = title;
    }

    public void setTag(String tag){
        this.tag = tag;
    }

    public void setIcon(int icon){
        this.icon = icon;
    }

    public void setCount(String count){
        this.count = count;
    }

    public void setCounterVisibility(boolean isCounterVisible){
        this.isCounterVisible = isCounterVisible;
    }
}

这是我用来显示列表的列表适配器。最后检查显示计数方法:

代码语言:javascript
复制
package info.aea.drawer;

import info.aea.snippets.R;

import java.util.ArrayList;

import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

public class NavDrawerListAdapter extends BaseAdapter {

    private Context context;
    private ArrayList<NavDrawerItem> navDrawerItems;

    public NavDrawerListAdapter(Context context, ArrayList<NavDrawerItem> navDrawerItems){
        this.context = context;
        this.navDrawerItems = navDrawerItems;
    }

    @Override
    public int getCount() {
        return navDrawerItems.size();
    }

    @Override
    public Object getItem(int position) {       
        return navDrawerItems.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if (convertView == null) {
            LayoutInflater mInflater = (LayoutInflater)
                    context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
            convertView = mInflater.inflate(R.layout.drawer_list_item, null);
        }

        ImageView imgIcon = (ImageView) convertView.findViewById(R.id.icon);
        TextView txtTitle = (TextView) convertView.findViewById(R.id.title);
        TextView txtTag = (TextView) convertView.findViewById(R.id.tag);
        TextView txtCount = (TextView) convertView.findViewById(R.id.counter);

        imgIcon.setImageResource(navDrawerItems.get(position).getIcon());        
        txtTitle.setText(navDrawerItems.get(position).getTitle());
        txtTag.setText(navDrawerItems.get(position).getTag());

        // displaying count
        // check whether it set visible or not
        if(navDrawerItems.get(position).getCounterVisibility()){
            txtCount.setText(navDrawerItems.get(position).getCount());
        }else{
            // hide the counter view
            txtCount.setVisibility(View.GONE);
        }

        return convertView;
    }

}

对应的列表布局:

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent"
    android:layout_height="match_parent" 
    android:background="@drawable/list_selector">

    <ImageView
        android:id="@+id/icon"
        android:layout_width="25dp"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_marginLeft="12dp"
        android:layout_marginRight="12dp"
        android:contentDescription="@string/desc_list_item_icon"
        android:src="@drawable/ic_home"
        android:layout_centerVertical="true" />

    <TextView
        android:id="@+id/title"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_toRightOf="@id/icon"
        android:minHeight="?android:attr/listPreferredItemHeightSmall"
        android:textAppearance="?android:attr/textAppearanceListItemSmall"
        android:textColor="@color/list_item_title"
        android:textStyle="bold"
        android:gravity="center_vertical"
        android:paddingRight="40dp"/>

    <TextView android:id="@+id/counter"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@drawable/counter_bg"
        android:layout_alignParentRight="true"
        android:layout_centerVertical="true"
        android:layout_marginRight="8dp"
        android:textColor="@color/counter_text_color"/>

    <TextView
        android:id="@+id/tag"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/icon"
        android:layout_alignParentBottom="true"
        android:layout_marginLeft="12dp"
        android:textColor="#999967"
        android:textSize="13sp"
        android:textStyle="italic"
        android:text="sample" />

</RelativeLayout>

下面是主要的N抽屉类:

代码语言:javascript
复制
package info.aea.launch;


import info.aea.drawer.NavDrawerItem;
import info.aea.drawer.NavDrawerListAdapter;
import info.aea.snippets.R;

import java.util.ArrayList;

import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.content.Intent;
import android.content.res.Configuration;
import android.content.res.TypedArray;
import android.os.Bundle;
import android.support.v4.app.ActionBarDrawerToggle;
import android.support.v4.widget.DrawerLayout;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.Toast;

public class LaunchActivity_NavDrawer extends Activity {




    private DrawerLayout mDrawerLayout;
    private ListView mDrawerList;
    private ActionBarDrawerToggle mDrawerToggle;

    // nav drawer title
    private CharSequence mDrawerTitle;

    // used to store app title
    private CharSequence mTitle;

    // slide menu items
    private String[] navMenuTitles;
    private String[] navMenuTags;;
    private TypedArray navMenuIcons;

    private ArrayList<NavDrawerItem> navDrawerItems;
    private NavDrawerListAdapter adapter;

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


        SnippetsDB_Helper logindb;
        logindb=new SnippetsDB_Helper(this);
        //logindb=logindb.open();




        mTitle = mDrawerTitle = getTitle();

        // load slide menu items
        navMenuTitles = getResources().getStringArray(R.array.nav_drawer_items);

        // load slide menu tags
        navMenuTags = getResources().getStringArray(R.array.nav_drawer_tags);

        // nav drawer icons from resources
        navMenuIcons = getResources()
                .obtainTypedArray(R.array.nav_drawer_icons);

        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
        mDrawerList = (ListView) findViewById(R.id.list_slidermenu);

        navDrawerItems = new ArrayList<NavDrawerItem>();

        // adding nav drawer items to array
        // Home
        navDrawerItems.add(new NavDrawerItem(navMenuTitles[0], navMenuTags[0], navMenuIcons.getResourceId(0, -1), true, "22" ));
        // Find People
        navDrawerItems.add(new NavDrawerItem(navMenuTitles[1], navMenuTags[1], navMenuIcons.getResourceId(1, -1)));
        // Photos
        navDrawerItems.add(new NavDrawerItem(navMenuTitles[2], navMenuTags[2], navMenuIcons.getResourceId(2, -1)));
        // Communities, Will add a counter here
        navDrawerItems.add(new NavDrawerItem(navMenuTitles[3], navMenuTags[3],  navMenuIcons.getResourceId(3, -1), true, "22"));
        // Pages
        navDrawerItems.add(new NavDrawerItem(navMenuTitles[4], navMenuTags[4], navMenuIcons.getResourceId(4, -1)));
        // What's hot, We  will add a counter here
        navDrawerItems.add(new NavDrawerItem(navMenuTitles[5], navMenuTags[5], navMenuIcons.getResourceId(5, -1), true, "50+"));
        // Find People
        navDrawerItems.add(new NavDrawerItem(navMenuTitles[6], navMenuTags[6], navMenuIcons.getResourceId(6, -1)));
        // Communities, Will add a counter here
        navDrawerItems.add(new NavDrawerItem(navMenuTitles[7], navMenuTags[7], navMenuIcons.getResourceId(7, -1), true, "22"));

        // empty list
        navDrawerItems.add(new NavDrawerItem(navMenuTitles[8], navMenuTags[8], navMenuIcons.getResourceId(8, -1)));
        navDrawerItems.add(new NavDrawerItem(navMenuTitles[9], navMenuTags[9], navMenuIcons.getResourceId(9, -1)));
        navDrawerItems.add(new NavDrawerItem(navMenuTitles[10], navMenuTags[10], navMenuIcons.getResourceId(10, -1)));

        // Pages
        navDrawerItems.add(new NavDrawerItem(navMenuTitles[11], navMenuTags[11], navMenuIcons.getResourceId(11, -1)));

        // Pages
        navDrawerItems.add(new NavDrawerItem(navMenuTitles[12], navMenuTags[12], navMenuIcons.getResourceId(12, -1)));

        // Pages
        navDrawerItems.add(new NavDrawerItem(navMenuTitles[13], navMenuTags[13], navMenuIcons.getResourceId(13, -1)));

        navDrawerItems.add(new NavDrawerItem(navMenuTitles[14], navMenuTags[14], navMenuIcons.getResourceId(14, -1)));

        navDrawerItems.add(new NavDrawerItem(navMenuTitles[15], navMenuTags[15], navMenuIcons.getResourceId(15, -1)));





        // Recycle the typed array
        navMenuIcons.recycle();

        mDrawerList.setOnItemClickListener(new SlideMenuClickListener());

        // setting the nav drawer list adapter
        adapter = new NavDrawerListAdapter(getApplicationContext(),
                navDrawerItems);
        mDrawerList.setAdapter(adapter);

        // enabling action bar app icon and behaving it as toggle button
        getActionBar().setDisplayHomeAsUpEnabled(true);
        getActionBar().setHomeButtonEnabled(true);

        mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
                R.drawable.ic_drawer, //nav menu toggle icon
                R.string.app_name, // nav drawer open - description for accessibility
                R.string.app_name // nav drawer close - description for accessibility
        ) {
            public void onDrawerClosed(View view) {
                getActionBar().setTitle(mTitle);
                // calling onPrepareOptionsMenu() to show action bar icons
                invalidateOptionsMenu();
            }

            public void onDrawerOpened(View drawerView) {
                getActionBar().setTitle(mDrawerTitle);
                // calling onPrepareOptionsMenu() to hide action bar icons
                invalidateOptionsMenu();
            }
        };
        mDrawerLayout.setDrawerListener(mDrawerToggle);

        if (savedInstanceState == null) {
            // on first time display view for first nav item
            displayView(0);
        }
    }

    /**
     * Slide menu item click listener
     * */
    private class SlideMenuClickListener implements
            ListView.OnItemClickListener {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position,
                long id) {
            // display view for selected nav drawer item
            displayView(position);
        }
    }





    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main_menu, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // toggle nav drawer on selecting action bar app icon/title
        if (mDrawerToggle.onOptionsItemSelected(item)) {
            return true;
        }
        // Handle action bar actions click
        switch (item.getItemId()) {

        case R.id.action_settings:
            Toast.makeText(getApplicationContext(), "code", Toast.LENGTH_LONG).show();
            // Create new fragment and transaction
            Fragment newFragment = new Fragment_Java(); 
            // consider using Java coding conventions (upper char class names!!!)
            FragmentTransaction transaction = getFragmentManager().beginTransaction();

            // Replace whatever is in the fragment_container view with this fragment,
            // and add the transaction to the back stack
            transaction.replace(R.id.frame_container, newFragment);
            transaction.addToBackStack(null);
            // Commit the transaction
            transaction.commit(); 
            return true;

        case R.id.item1:
            Toast.makeText(getApplicationContext(), "send a suggestion", Toast.LENGTH_LONG).show();
            return true;

        case R.id.item2:
            Toast.makeText(getApplicationContext(), "Meet developers", Toast.LENGTH_LONG).show();
            return true;

        case R.id.item3:
            Toast.makeText(getApplicationContext(), "Rate this app", Toast.LENGTH_LONG).show();
            return true;

        default:
            return super.onOptionsItemSelected(item);
        }
    }

    /* 
     * Called when invalidateOptionsMenu() is triggered
     **/

    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {
        // if nav drawer is opened, hide the action items
        boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerList);
        menu.findItem(R.id.action_settings).setVisible(!drawerOpen);
        return super.onPrepareOptionsMenu(menu);
    }





    /**
     * Diplaying fragment view for selected nav drawer list item
     * */
    private void displayView(int position) {
        // update the main content by replacing fragments
        Fragment fragment = null;
        switch (position) {
        case 0:
            fragment = new Fragment_a();
            break;
        case 1:
            fragment = new Fragment_b();
            break;
        case 2:
            fragment = new Fragment_C();
            break;   
        default:
            break;
        }

        if (fragment != null) {
            FragmentManager fragmentManager = getFragmentManager();
            fragmentManager.beginTransaction()
                    .replace(R.id.frame_container, fragment).commit();

            // update selected item and title, then close the drawer
            mDrawerList.setItemChecked(position, true);
            mDrawerList.setSelection(position);
            setTitle(navMenuTitles[position]);
            mDrawerLayout.closeDrawer(mDrawerList);
        } else {
            // error in creating fragment
            Log.e("MainActivity", "Error in creating fragment");
        }
    }

    @Override
    public void setTitle(CharSequence title) {
        mTitle = title;
        getActionBar().setTitle(mTitle);
    }

    /**
     * When using the ActionBarDrawerToggle, you must call it during
     * onPostCreate() and onConfigurationChanged()...
     */

    @Override
    protected void onPostCreate(Bundle savedInstanceState) {
        super.onPostCreate(savedInstanceState);
        // Sync the toggle state after onRestoreInstanceState has occurred.
        mDrawerToggle.syncState();
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        // Pass any configuration change to the drawer toggls
        mDrawerToggle.onConfigurationChanged(newConfig);
    }


    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent result) {
       super.onActivityResult(requestCode, resultCode, result);
    }
}
票数 12
EN

Stack Overflow用户

发布于 2017-09-28 18:53:06

对于最新版本的支持库,最简单的方法是使用NavigationView。Here is a nice tutorialhere is the official documentation

NavigationView作为第二个视图包含在DrawerLayout中(而不是操作码中的ListView ),例如:

代码语言:javascript
复制
     <android.support.design.widget.NavigationView
     android:id="@+id/navigation"
     android:layout_width="wrap_content"
     android:layout_height="match_parent"
     android:layout_gravity="start"
     app:menu="@menu/left_menu" />

然后,菜单应填充标题和图标,如(left_menu.xml):

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<group
    android:id="@+id/leftMenuId"
    android:checkableBehavior="single">
    <item
        android:id="@+id/item1"
        android:icon="@drawable/ic_zzblack_24dp"
        android:title="Title1" />
    <item
        android:id="@+id/settings"
        android:icon="@drawable/ic_settings_black_24dp"
        android:title="Settings" />
</group>
</menu>

有关更多详细信息,请参阅第一个链接。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16874826

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档