標籤:android navigationdrawer listview 導航 actionbar
隱藏式瀏覽選單(navigationdrawer)是一個從螢幕左邊滑入的面板,用於顯示應用的主要導航項目。使用者可以通過在螢幕左邊緣滑入或者觸摸操作欄的應用表徵圖開啟隱藏式瀏覽選單。隱藏式瀏覽選單覆蓋在內容之上,但不覆蓋操作欄。當隱藏式瀏覽選單完全開啟後,操作欄的標題需要更換為應用的名稱,而不是顯示當前視圖的名稱,並且關閉所有和當前視圖相關的操作按鈕。操作欄的“更多操作”功能表按鈕不需要關閉,以保證使用者可以隨時訪問“設定”和“協助”。下面我們就來實現隱藏式瀏覽選單的功能。
Layout布局檔案代碼
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent"> <!-- The main content view --> <FrameLayout android:id="@+id/content_frame" android:layout_width="match_parent" android:layout_height="match_parent" /> <!-- The navigation drawer --> <ListView android:id="@+id/left_drawer" android:layout_width="100dp" android:layout_height="match_parent" android:layout_gravity="start" android:choiceMode="singleChoice" android:dividerHeight="1dp" android:background="#ffffff"/></android.support.v4.widget.DrawerLayout>
注意要點:
(1)主要視圖(上述FrameLayout)必須為DrawerLayout中的第一個孩子,因為XML意味著z順序和抽屜必須的內容。
(2)主要內容視圖必須設定為匹配父視圖的寬度和高度,因為它代表整個UI隱藏式瀏覽選單時隱藏。
(3)抽屜視圖(上述ListView)必須指定它的水平重力與android:layout_gravity屬性。支援從右至左的語言(RTL),指定值與“開始”而不是“左”(右邊的抽屜裡出 現時,布局是RTL)。
(4)抽屜視圖指定寬度的dp單位和父視圖的高度匹配。抽屜的寬度應不超過320 dp所以使用者總是可以看到部分的主要內容。
(5)DrawerLayout必須成為布局的根節點
MainActivity的代碼
package com.example.g07_navigationdrawer;import android.app.Activity;import android.app.Fragment;import android.app.FragmentManager;import android.os.Bundle;import android.support.v4.app.ActionBarDrawerToggle;import android.support.v4.widget.DrawerLayout;import android.view.View;import android.widget.AdapterView;import android.widget.ArrayAdapter;import android.widget.ListAdapter;import android.widget.ListView;import android.widget.Toast;public class MainActivity extends Activity {private String[] mPlanetTitles; // listView的每一個item的名字private DrawerLayout mDrawerLayout;private ListView mDrawerList;private ActionBarDrawerToggle mDrawerToggle; // 用來監聽DrawerLayout事件@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mPlanetTitles = getResources().getStringArray(R.array.planets_array);mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);mDrawerList = (ListView) findViewById(R.id.left_drawer);// 為ListView添加適配器mDrawerList.setAdapter((ListAdapter) new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, mPlanetTitles));// 監聽ListView的點擊事件mDrawerList.setOnItemClickListener(new DrawerItemClickListener());mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);// 監聽DrawerLayout的監聽事件mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,R.drawable.ic_launcher, R.string.app_name, R.string.app_name) {public void onDrawerClosed(View view) {super.onDrawerClosed(view);Toast.makeText(MainActivity.this, "抽屜關閉了", Toast.LENGTH_SHORT).show();}public void onDrawerOpened(View drawerView) {super.onDrawerOpened(drawerView);Toast.makeText(MainActivity.this, "抽屜開啟了", Toast.LENGTH_SHORT).show();}};mDrawerLayout.setDrawerListener(mDrawerToggle);}private class DrawerItemClickListener implementsListView.OnItemClickListener {@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position,long id) {// 根據ListView的被選中的選項切換介面布局Fragment fragment = new Fragment();FragmentManager fragmentManager = getFragmentManager();fragmentManager.beginTransaction().replace(R.id.content_frame, fragment).commit();mDrawerList.setItemChecked(position, true);// 給操作欄設定標題getActionBar().setTitle(mPlanetTitles[position]);mDrawerLayout.closeDrawer(mDrawerList);}}}