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

时间:2013-06-01 16:35:47

标签: android android-layout navigation-drawer

我目前正在使用4.2.2的Android应用程序,它使用新的NavigationDrawer。它除了添加图标外,还像魅力一样。

我发现了一些示例代码,其中List视图变成了一个相对布局,其中2个并行数组由一个数组适配器根据菜单模型嵌套和呈现,我认为这是同步的方式。

以下是MainActivity:

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

这是菜单模型:

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实现:

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:

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

和主要布局:

<!-- 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

这是一个医疗应用程序,因此得名。 大家好。

4 个答案:

答案 0 :(得分:12)

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

抽屉的getter / setter方法类:

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

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

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

}

对应的列表布局:

<?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抽屉类:

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

答案 1 :(得分:3)

这是我的布局:

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

答案 2 :(得分:2)

我这样做最简单的方法就是这样:

<强> 1。将其作为抽屉xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tashan="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="?android:attr/listPreferredItemHeightSmall"
android:orientation="horizontal"
android:padding="@dimen/spacing_small" >

<ImageView
    android:id="@+id/drawer_item_icons"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_vertical"
    android:layout_marginLeft="@dimen/spacing_small"
    android:layout_marginStart="@dimen/spacing_small"
    android:contentDescription="@string/test_string"/>

<TextView
    android:id="@+id/drawer_item_labels"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="center_vertical"
    android:layout_marginLeft="@dimen/spacing_normal"
    android:layout_marginStart="@dimen/spacing_small"
    android:paddingLeft="@dimen/spacing_small"
    android:paddingRight="@dimen/spacing_small"
    android:textAppearance="?android:attr/textAppearanceSmall"
    android:textColor="#58585b" />

</LinearLayout>

<强> 2。将这些值添加到'dimens.xml'中。永远不要硬编码值!

    <dimen name="spacing_normal">16dp</dimen>
    <dimen name="spacing_small">8dp</dimen>

第3。对于Icons数组,将此String Array添加到'strings.xml

<string-array name="array_main_menu">
    <item>@drawable/1</item>
    <item>@drawable/2</item>
    <item>@drawable/3</item>
    <item>@drawable/4</item>
    <item>@drawable/5</item>
</string-array>

<强> 4。在适配器中,使用类型化数组实例访问此数组。

    TypedArray typedArray=getResources().obtainTypedArray(R.array.array_main_menu);

<强> 5。在适配器的getView中,将image设置为Imageview,如下所示。

 mIcon.setImageResource(typedArray.getResourceId(position, -1));

这里mIcon是你的ImageView。

答案 3 :(得分:0)

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

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

     <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):

<?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>

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