zl程序教程

您现在的位置是:首页 >  移动开发

当前栏目

Android利用DrawerLayout实现抽屉效果详解编程语言

Android编程语言 实现 详解 利用 效果 抽屉 DrawerLayout
2023-06-13 09:20:29 时间

官网guide:http://developer.android.com/training/implementing-navigation/nav-drawer.html

官网示例:NavigationDrawer.zip  

android.support.v4.widget.DrawerLayout 抽屉layout。该widget只能实现从左向右、从右向左

   openDrawer(), closeDrawer(), isDrawerOpen()

下面贴一下示例的主要的布局文件 和 activity实现

activity_main.xml

 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" 

 FrameLayout 

 android:id="@+id/content_frame" 

 android:layout_width="match_parent" 

 android:layout_height="match_parent" / 

 ListView 

 android:id="@+id/left_drawer" 

 android:layout_width="240dp" 

 android:layout_height="match_parent" 

 android:layout_gravity="right" 

 android:choiceMode="singleChoice" 

 android:divider="@android:color/transparent" 

 android:dividerHeight="0dp" 

 android:background="#111"/ 

 !-- 

 android:choiceMode 选中状态 跟itemclick没有冲突 

 none 值为0,表示无选择模式; 

 singleChoice 值为1,表示最多可以有一项被选中; 

 multipleChoice 值为2,表示可以多项被选中。 

 android:layout_gravity left或right left或start right或end 

 表示在抽屉里的效果是从左到右还是从右到左出现 

 /android.support.v4.widget.DrawerLayout 

 package com.stone.drawerlayout; 

 * Copyright 2013 The Android Open Source Project 

 * Licensed under the Apache License, Version 2.0 (the "License"); 

 * you may not use this file except in compliance with the License. 

 * You may obtain a copy of the License at 

 * http://www.apache.org/licenses/LICENSE-2.0 

 * Unless required by applicable law or agreed to in writing, software 

 * distributed under the License is distributed on an "AS IS" BASIS, 

 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 

 * See the License for the specific language governing permissions and 

 * limitations under the License. 

 import java.util.Locale; 

 import android.app.Activity; 

 import android.app.Fragment; 

 import android.app.FragmentManager; 

 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.LayoutInflater; 

 import android.view.Menu; 

 import android.view.MenuInflater; 

 import android.view.MenuItem; 

 import android.view.View; 

 import android.view.ViewGroup; 

 import android.widget.AdapterView; 

 import android.widget.ArrayAdapter; 

 import android.widget.ImageView; 

 import android.widget.ListView; 

 import android.widget.Toast; 

 /** 

 * This example illustrates a common usage of the DrawerLayout widget 

 * in the Android support library. 

 * p/ 

 * p When a navigation (left) drawer is present, the host activity should detect presses of 

 * the action bars Up affordance as a signal to open and close the navigation drawer. The 

 * ActionBarDrawerToggle facilitates this behavior. 

 * Items within the drawer should fall into one of two categories: /p 

 * p/ 

 * ul 

 * li strong View switches /strong . A view switch follows the same basic policies as 

 * list or tab navigation in that a view switch does not create navigation history. 

 * This pattern should only be used at the root activity of a task, leaving some form 

 * of Up navigation active for activities further down the navigation hierarchy. /li 

 * li strong Selective Up /strong . The drawer allows the user to choose an alternate 

 * parent for Up navigation. This allows a user to jump across an apps navigation 

 * hierarchy at will. The application should treat this as it treats Up navigation from 

 * a different task, replacing the current task stack using TaskStackBuilder or similar. 

 * This is the only form of navigation drawer that should be used outside of the root 

 * activity of a task. /li 

 * /ul 

 * p/ 

 * p Right side drawers should be used for actions, not navigation. This follows the pattern 

 * established by the Action Bar that navigation should be to the left and actions to the right. 

 * An action should be an operation performed on the current contents of the window, 

 * for example enabling or disabling a data overlay on top of the current content. /p 

 public class MainActivity extends Activity { 

 private DrawerLayout mDrawerLayout; 

 private ListView mDrawerList; 

 private ActionBarDrawerToggle mDrawerToggle; 

 private CharSequence mDrawerTitle; 

 private CharSequence mTitle; 

 private String[] mPlanetTitles; 

 @Override 

 protected void onCreate(Bundle savedInstanceState) { 

 super.onCreate(savedInstanceState); 

 setContentView(R.layout.activity_main); 

 mTitle = mDrawerTitle = getTitle(); 

 mPlanetTitles = getResources().getStringArray(R.array.planets_array); 

 mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); 

 mDrawerList = (ListView) findViewById(R.id.left_drawer);//抽屉里的view 

 // set a custom shadow that overlays the main content when the drawer opens 

 mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START);//设置shadow 

 // set up the drawers list view with items and click listener 

 mDrawerList.setAdapter(new ArrayAdapter String (this, 

 R.layout.drawer_list_item, mPlanetTitles)); 

 mDrawerList.setOnItemClickListener(new DrawerItemClickListener()); 

 // enable ActionBar app icon to behave as action to toggle nav drawer 需要api level 11 

 getActionBar().setDisplayHomeAsUpEnabled(true);//给home icon的左边加上一个返回的图标 

 getActionBar().setHomeButtonEnabled(true); //需要api level 14 使用home-icon 可点击 

 // ActionBarDrawerToggle ties together the the proper interactions 

 // between the sliding drawer and the action bar app icon 

 mDrawerToggle = new ActionBarDrawerToggle(//v4控件 actionbar上的抽屉开关 

 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(mDrawerTitle); 

 invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu() 

 public void onDrawerOpened(View drawerView) {//抽屉打开后 

 getActionBar().setTitle(mTitle); 

 invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu() 

 @Override 

 public boolean onOptionsItemSelected(MenuItem item) { 

 if (item != null item.getItemId() == android.R.id.home) {//actionbar上的home icon 

 //END即gravity.right 从右向左显示 START即left 从左向右弹出显示 

 if (mDrawerLayout.isDrawerVisible(GravityCompat.END)) { 

 mDrawerLayout.closeDrawer(GravityCompat.END);//关闭抽屉 

 } else { 

 mDrawerLayout.openDrawer(GravityCompat.END);//打开抽屉 

 return true; 

 return false; 

 mDrawerLayout.setDrawerListener(mDrawerToggle);//设置抽屉监听 

 if (savedInstanceState == null) { 

 // selectItem(0); 

 @Override 

 public boolean onCreateOptionsMenu(Menu menu) {//加载menu sdk3.0以后menu包含在actionbar中 

 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_websearch).setVisible(!drawerOpen);//search的显示与drawer的显示相反 

 return super.onPrepareOptionsMenu(menu); 

 @Override 

 public boolean onOptionsItemSelected(MenuItem item) { 

 // The action bar home/up action 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_websearch: 

 // create intent to perform web search for this planet 

 Intent intent = new Intent(Intent.ACTION_WEB_SEARCH); 

 intent.putExtra(SearchManager.QUERY, getActionBar().getTitle()); 

 // catch event that theres no activity to handle intent 

 if (intent.resolveActivity(getPackageManager()) != null) { 

 startActivity(intent); 

 } else { 

 Toast.makeText(this, R.string.app_not_available, Toast.LENGTH_LONG).show(); 

 return true; 

 default: 

 return super.onOptionsItemSelected(item); 

 /* The click listner for ListView in the navigation drawer */ 

 private class DrawerItemClickListener implements ListView.OnItemClickListener { 

 @Override 

 public void onItemClick(AdapterView ? parent, View view, int position, long id) { 

 selectItem(position); 

 //内容区显示PlanetFragment 

 private void selectItem(int position) { 

 // update the main content by replacing fragments 

 Fragment fragment = new PlanetFragment(); 

 Bundle args = new Bundle(); 

 args.putInt(PlanetFragment.ARG_PLANET_NUMBER, position); 

 fragment.setArguments(args); 

 FragmentManager fragmentManager = getFragmentManager(); 

 fragmentManager.beginTransaction().replace(R.id.content_frame, fragment).commit(); 

 // update selected item and title, then close the drawer 

 // mDrawerList.setItemChecked(position, true); 

 // setTitle(mPlanetTitles[position]); 

 mDrawerLayout.closeDrawer(mDrawerList); 

 @Override 

 public void setTitle(CharSequence title) { 

 mDrawerTitle = title; 

 getActionBar().setTitle(mDrawerTitle); 

 /** 

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

 /** 

 * Fragment that appears in the "content_frame", shows a planet 

 public static class PlanetFragment extends Fragment { 

 public static final String ARG_PLANET_NUMBER = "planet_number"; 

 public PlanetFragment() { 

 // Empty constructor required for fragment subclasses 

 @Override 

 public View onCreateView(LayoutInflater inflater, ViewGroup container, 

 Bundle savedInstanceState) { 

 View rootView = inflater.inflate(R.layout.fragment_planet, container, false); 

 int i = getArguments().getInt(ARG_PLANET_NUMBER); 

 String planet = getResources().getStringArray(R.array.planets_array)[i]; 

 //查找出 res-drawable资源的id 

 int imageId = getResources().getIdentifier(planet.toLowerCase(Locale.getDefault()), 

 "drawable", getActivity().getPackageName()); 

 ((ImageView) rootView.findViewById(R.id.image)).setImageResource(imageId); 

 getActivity().setTitle(planet); 

 return rootView; 

 } 

10706.html

cgojavaxml