在android support.v4 中有一個抽屜視圖控件DrawerLayout。使用這個控件,可以生成通過在屏幕上水平滑動打開或者關閉菜單,能給用戶一個不錯的體驗效果。
DrawerLayout分為側邊菜單和主內容區兩部分,側邊菜單可以根據手勢展開與隱藏,主內容區的部分可以隨着菜單的點擊而變化。DrawerLayout其實是一個控件,跟LinearLayout差不多,直接使用即可。
DrawerLayout屬性
drawerPosition:指定 drawer 將從屏幕的一側滑動。
drawerWidth :指定 drawer 的寬度,即從窗口的邊緣拉到視圖更精確的寬度。
keyboardDismissMode :確定鍵盤是否響應拖動被駁回。
'none' (默認值), 拖動不影響鍵盤。 'on-drag', 拖動開始,鍵盤被駁回。
onDrawerClose :導航視圖關閉時調用函數。
onDrawerOpen :導航視圖打開時調用函數。
onDrawerSlide :與導航視圖交互時調用函數。
onDrawerStateChanged :當 Drawer 狀態發生變化時調用函數,drawer 有 3 種狀態:
idle -- 表示與導航視圖沒有交互 dragging -- 表示目前有與導航視圖的交互 settling -- 表示有與導航視圖的交互,並且導航視圖正在的關閉或打開。
renderNavigationView :導航圖將被渲染到屏幕的一側,並且可以拉出。
案例
使用導入依賴庫
compile 'com.android.support:appcompat-v7:24.2.1'
布局文件
<?xml version="1.0" encoding="utf-8"?> <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/v4_drawerlayout" android:layout_width="match_parent" android:layout_height="match_parent"> <FrameLayout android:id="@+id/v4_drawerlayout_frame" android:layout_width="match_parent" android:layout_height="match_parent" > <TextView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/v4_text" android:textSize="22sp" android:textColor="@color/colorAccent" android:gravity="center" /> </FrameLayout> <ListView android:layout_width="200dp" android:layout_height="match_parent" android:layout_gravity="left" android:id="@+id/v4_listview" android:choiceMode="singleChoice" android:background="@android:color/white" /> </android.support.v4.widget.DrawerLayout>
Activity
public class DrawerActivity extends AppCompatActivity { private ListView listView; private DrawerLayout drawerLayout; private TextView textView; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.drawer_activity); initView(); } private void initView() { listView=(ListView) findViewById(R.id.v4_listview); drawerLayout=(DrawerLayout) findViewById(R.id.v4_drawerlayout); textView=(TextView) findViewById(R.id.v4_text); initDate(); } private void initDate(){ final List<String> list = new ArrayList<String>(); list.add("網易"); list.add("騰訊"); list.add("新浪"); list.add("搜狐"); ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, list); listView.setAdapter(adapter); listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { textView.setText(list.get(position)); showDrawerLayout(); } }); drawerLayout.openDrawer(Gravity.LEFT);//側滑打開 不設置則不會默認打開 } private void showDrawerLayout() { if (!drawerLayout.isDrawerOpen(Gravity.LEFT)) { drawerLayout.openDrawer(Gravity.LEFT); } else { drawerLayout.closeDrawer(Gravity.LEFT); } } }
運行效果如圖: