2013-06-01 74 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> 

欲瞭解更多詳情,請參閱第一個鏈接。