Android 隱藏式瀏覽選單—Navigation Drawer (DrawerLayout)使用

來源:互聯網
上載者:User
1建立Drawer Layout

在需要抽屜菜單的介面,用DrawerLayout 作為介面根控制項。在DrawerLayout裡面第一個View為當前介面主內容;第二個和第三個View為抽屜菜單內容。如果當前介面只需要一個抽屜菜單,則第三個View可以省略。

下面的例子中DrawerLayout裡麵包含兩個View,第一個FrameLayout中是當前介面主要內容顯示地區;第二個ListView為抽屜菜單內容。

<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:id="@+id/drawer_layout"    android:layout_width="match_parent"    android:layout_height="match_parent"    tools:context=".MainActivity"><FrameLayout        android:id="@+id/frame_layout"        android:layout_width="match_parent"        android:layout_height="match_parent"        ></FrameLayout>    <ListView            android:id="@+id/listview"            android:layout_width="240dp"            android:layout_height="match_parent"            android:background="#FFFFFF"            android:choiceMode="singleChoice"            android:layout_gravity="start"            /></android.support.v4.widget.DrawerLayout>

上面的代碼中有如下幾點需要注意:

  • 顯示介面主要內容的View (上面的
    FrameLayout )
    必須為DrawerLayout的第一個子View, 原因在於 XML 布局檔案中的View順序為Android系統中的 z-ordering順序,而抽屜必須出現在內容之上。
  • 顯示介面內容的View寬度和高度設定為和父View一樣,原因在於當抽屜菜單不可見的時候,介面內容代表整個介面UI。
  • 抽屜菜單 (上面的
    ListView)
    必須使用android:layout_gravity屬性設定水平的 gravity值 .如果要支援 right-to-left (RTL,從右向左閱讀)語言 用
    "start" 代替 "left" (當用"end"的時候功能表列在右側。但在右側的時候總是自動滑回去,一直沒搞懂,希望知道的朋友告訴我一下)。
  • 抽屜菜單的寬度為
    dp 單位而高度和父View一樣。抽屜菜單的寬度應該不超過320dp,這樣使用者可以在菜單開啟的時候看到部分內容介面。

  • 2初始化抽屜菜單

    在您的Activity中需要先初始化抽屜菜單內容,根據您的應用需要抽屜菜單的內容可能不是ListView。官方樣本中普通listView載入固定資料的過程就不多說了,和平時一樣,沒有乾貨。

3監聽菜單開啟關閉事件

如果需要監聽菜單開啟關閉事件,則需要調用
DrawerLayout類的

setDrawerListener() 函數,參數為
DrawerLayout.DrawerListener介面的實現。該介面提供了菜單開啟關閉等事件的回呼函數,例如
onDrawerOpened()onDrawerClosed().

如果您的Activity使用了
action bar,則您可以使用Support庫提供的 ActionBarDrawerToggle 類,該類實現了
DrawerLayout.DrawerListener介面,並且您還可以根據需要重寫相關的函數。該類實現了菜單和Action bar相關的操作。

根據在
Navigation Drawer 設計指南中的介紹,當菜單顯示的時候您應該根據情況隱藏ActionBar上的功能菜單並且修改ActionBar的標題。

關鍵代碼:

package com.tao.drawerlayout;import android.os.Bundle;import android.support.v4.app.ActionBarDrawerToggle;import android.support.v4.app.FragmentActivity;import android.support.v4.app.FragmentTransaction;import android.support.v4.widget.DrawerLayout;import android.view.Menu;import android.view.View;import android.widget.AdapterView;import android.widget.ListView;import java.util.ArrayList;import java.util.List;public class MainActivity extends FragmentActivity {    ListView myListview;    DrawerLayout drawerLayout;    List<String> list;    CharSequence title;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        myListview = (ListView)findViewById(R.id.listview);        drawerLayout = (DrawerLayout)findViewById(R.id.drawer_layout);        list = new ArrayList<String>();        for (int i = 0;i<10;i++){            list.add("item"+(i+1));        }        ListAdapter listAdapter = new ListAdapter(this,list);        myListview.setAdapter(listAdapter);        drawerLayout.setDrawerListener(new ActionBarDrawerToggle(this,drawerLayout,R.drawable.ic_launcher,R.string.open,R.string.close){            @Override            public void onDrawerOpened(View drawerView) {                super.onDrawerOpened(drawerView);                invalidateOptionsMenu();            }            @Override            public void onDrawerClosed(View drawerView) {                super.onDrawerClosed(drawerView);                getActionBar().setTitle(title);                invalidateOptionsMenu();            }        });        myListview.setOnItemClickListener(new AdapterView.OnItemClickListener() {            @Override            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {                MyFragment myFragment = new MyFragment();                Bundle bundle = new Bundle();                bundle.putString("content",list.get(i));                myFragment.setArguments(bundle);                FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();                transaction.replace(R.id.frame_layout,myFragment).commit();                title = list.get(i);                myListview.setItemChecked(i,true);                drawerLayout.closeDrawer(myListview);            }        });    }    @Override    public boolean onCreateOptionsMenu(Menu menu) {        // Inflate the menu; this adds items to the action bar if it is present.        getMenuInflater().inflate(R.menu.main, menu);        return true;    }    }

本文參考了雲在千峰的文章。如果需要代碼可以給我留言


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.