2013-06-01 34 views
16

Tôi hiện đang làm việc trên một ứng dụng Android cho 4.2.2 sử dụng NavigationDrawer mới. Nó hoạt động như một nét duyên dáng ngoại trừ việc thêm các biểu tượng.Cách Thêm biểu tượng bên cạnh tiêu đề cho Android Navigation Drawer

Tôi tìm thấy một số mã mẫu trong đó Chế độ xem danh sách trở thành Bố cục tương đối trong đó 2 mảng song song được lồng nhau và được hiển thị bởi Bộ điều hợp mảng dựa trên mô hình menu theo cách chúng được đồng bộ hóa.

Đây là 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); 
    } 
} 

Dưới đây là mô hình đơn:

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

} 

đây ist thi 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;   
    } 

} 

Chuỗi mảng 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> 

và cách bố trí chính:

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

Làm thế nào tôi có thể đơn giản hóa phương pháp này. Có cách nào để sử dụng một mảng thay vì cấu trúc phức tạp như vậy không.

B.t.w. bạn có thể tìm thấy dự án của tôi trên github theo: https://github.com/greenspand/MediSynced

Đây là một ứng dụng y tế, do đó tên. Thx y'all.

+0

Sự cố là gì? Bố cục có hoạt động như nó được cho là đúng hay không và bạn chỉ đang tìm giải pháp đơn giản hơn hoặc nó có làm gì khác không? Kết quả sẽ như thế nào? – Mifeet

+0

Chính xác, tôi đang tìm một giải pháp đơn giản hơn. Thay vì sử dụng một adapter Array và thực hiện một số mảng chuỗi. – greenspand

Trả lời

3

đây là cách bố trí của tôi:

<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

Bạn thực sự chỉ nên sử dụng 'sp's cho kích thước văn bản. Đối với mọi thứ khác, sử dụng 'dp'. Xem [tài liệu] (http://developer.android.com/training/multiscreen/screendensities.html) –

12

Bạn có thể sử dụng một cái nhìn danh sách tùy chỉnh cùng với các bộ chuyển đổi danh sách để hiển thị bộ đếm bên cạnh mục danh sách trong ngăn kéo. Và sau đó thêm bất kỳ mã nào bạn muốn vào phương thức phản đối của mình. Dưới đây là đoạn code tôi thực hiện trong ngăn kéo navigation tôi hỗ trợ ứng dụng android:

getter phương pháp/setter lớp học cho các ngăn kéo:

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

Đây là bộ chuyển đổi danh sách tôi dùng để hiển thị danh sách.kiểm tra các phương pháp đếm hiển thị cuối cùng:

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

} 

Tương ứng với danh sách bố trí:

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

và đây là chính lớp N-ngăn kéo:

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

Hi Aman, cảm ơn bạn rất nhiều. – greenspand

+0

Không có vấn đề gì! –

2

Cách đơn giản nhất tôi đã làm nó là thế này cách:

1. Đặt làm ngăn kéo của bạn 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. Thêm các giá trị này vào 'dimens.xml' của bạn. Không bao giờ hardcode giá trị!

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

3. Đối với mảng Icons thêm Chuỗi này 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. Trong truy cập Adaptor của bạn mảng này bằng cách sử dụng một mảng dụ gõ.

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

5. Bên trong getView của adapter của bạn, thiết lập hình ảnh để IMAGExem như thế này.

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

đây mIcon là ImageView của bạn.

0

Với các phiên bản Thư viện hỗ trợ gần đây, cách dễ nhất là sử dụng NavigationView. Here is a nice tutorialhere is the official documentation.

Một NavigationView được bao gồm như là điểm thứ hai trong DrawerLayout (thay vì ListView từ mã OP), ví dụ:

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

Sau đó, thực đơn nên được dân cư với tiêu đề và biểu tượng, như (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> 

Để biết thêm chi tiết, vui lòng tham khảo liên kết đầu tiên.

Các vấn đề liên quan