2013-06-01 33 views
16

我目前正在为4.2.2一款Android应用,使用新NavigationDrawer图标。除了添加图标之外,它的功能就像一个魅力。如何添加毗邻标题为Android抽屉式导航

我发现其中列出角度的相对布局,其中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); 
    } 

} 

这里IST一个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

这是一个医疗应用程序,因此名称。 THX你们。

+0

问题是什么?布局的行为是否应该如此,而您只是寻找更简单的解决方案,还是采取其他措施?结果应该是什么样子? – Mifeet

+0

的确,我正在寻找更简单的解决方案。而不是使用数组适配器并实现多个字符串数组。 – greenspand

回答

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

你应该只使用'sp's来表示文字大小。对于其他一切,请使用'dp'。见[文档](http://developer.android.com/training/multiscreen/screendensities.html) –

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

嗨阿曼,非常感谢。 – greenspand

+0

没问题! –

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.对于图标阵列通过使用一个类型数组实例这个字符串数组添加到“的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内,设置图像这样的ImageView。

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

这里mIcon是你的ImageView。

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> 

欲了解更多详情,请参阅第一个链接。