抽屉菜单
strings.xml
-------------------------------------------------------------------------------------------------------------------------------
<?xml?version="1.0"?encoding="utf-8"?>
<resources>
????<string?name="app_name">com.navigationdrawer</string>
????<string?name="action_settings">Settings</string>
????<string?name="hello_world">Hello?world!</string>
??<string-array?name="planets_array">
????????<item>Mercury</item>
????????<item>Venus</item>
????????<item>Earth</item>
????????<item>Mars</item>
????????<item>Jupiter</item>
????????<item>Saturn</item>
????????<item>Uranus</item>
????????<item>Neptune</item>
????</string-array>
????<string?name="drawer_open">Open?navigation?drawer</string>
????<string?name="drawer_close">Close?navigation?drawer</string>
????<string?name="action_websearch">Web?search</string>
????<string?name="app_not_available">Sorry,?there\'s?no?web?browser?available</string>
</resources>
?
activity_main.xml
-------------------------------------------------------------------------------------------------------------------------------
<!--?
1、創建Drawer?Layout在需要抽屜菜單的界面,用DrawerLayout?作為界面根控件。
2、在DrawerLayout里面第一個View為當前界面主內容;第二個和第三個View為抽屜菜單內容。如果當前界面只需要一個抽屜菜單,則第三個View可以省略。
3、下面的例子中DrawerLayout里面包含兩個View,第一個FrameLayout中是當前界面主要內容顯示區域;第二個ListView為抽屜菜單內容-->
<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">
?
????<!--?As?the?main?content?view,?the?view?below?consumes?the?entire
?????????space?available?using?match_parent?in?both?dimensions.?-->
????<FrameLayout
????????android:id="@+id/content_frame"
????????android:layout_width="match_parent"
????????android:layout_height="match_parent"?/>
?
????<!--?android:layout_gravity="start"?tells?DrawerLayout?to?treat
?????????this?as?a?sliding?drawer?on?the?left?side?for?left-to-right
?????????languages?and?on?the?right?side?for?right-to-left?languages.
?????????The?drawer?is?given?a?fixed?width?in?dp?and?extends?the?full?height?of
?????????the?container.?A?solid?background?is?used?for?contrast
?????????with?the?content?view.?-->
????<ListView
????????android:id="@+id/left_drawer"
????????android:layout_width="200dp"
????????android:layout_height="match_parent"
????????android:layout_gravity="start"
????????android:background="#111"
????????android:choiceMode="singleChoice"
????????android:divider="@android:color/transparent"
????????android:dividerHeight="1dp"?/>
?
</android.support.v4.widget.DrawerLayout>
?
drawer_list_item.xml
-------------------------------------------------------------------------------------------------------------------------------
<TextView?xmlns:android="http://schemas.android.com/apk/res/android"
????android:id="@android:id/text1"
????android:layout_width="match_parent"
????android:layout_height="wrap_content"
????android:textAppearance="?android:attr/textAppearanceListItemSmall"
????android:gravity="center_vertical"
????android:paddingLeft="16dp"
????android:paddingRight="16dp"
????android:textColor="#fff"
????android:background="?android:attr/activatedBackgroundIndicator"
????android:minHeight="?android:attr/listPreferredItemHeightSmall"/>
?
fragment_planet.xml
-------------------------------------------------------------------------------------------------------------------------------
<ImageView?xmlns:android="http://schemas.android.com/apk/res/android"
????android:id="@+id/image"
????android:layout_width="match_parent"
????android:layout_height="match_parent"
????android:background="#000000"
????android:gravity="center"
????android:padding="32dp"?/>
?
MainActivity.java
-------------------------------------------------------------------------------------------------------------------------------
/**
?*?
?*?項目名稱:navigationdrawer???
?*?類??名??稱:MainActivity???
?*?類??描??述:??
?*?
?*?代碼中有如下幾點需要注意:
?*1、顯示界面主要內容的View?(上面的?FrameLayout?)?必須為DrawerLayout的第一個子View,?
?*原因在于?XML?布局文件中的View順序為Android系統中的?z-ordering順序,而抽屜必須出現在內容之上。
?*顯示界面內容的View寬度和高度設置為和父View一樣,原因在于當抽屜菜單不可見的時候,界面內容代表整個界面UI。
?*
?*2、抽屜菜單?(上面的?ListView)?必須使用android:layout_gravity屬性設置水平的?gravity值?.
?*如果要支持?right-to-left?(RTL,從右向左閱讀)語言?用?"start"?代替?"left"?(當在?RTL語言運行時候,菜單出現在右側)。
?*抽屜菜單的寬度為?dp?單位而高度和父View一樣。抽屜菜單的寬度應該不超過320dp,這樣用戶可以在菜單打開的時候看到部分內容界面。
?*
?*3、監聽菜單打開關閉事件
?*如果需要監聽菜單打開關閉事件,則需要調用?DrawerLayout類的?setDrawerListener()?函數,參數為?DrawerLayout.DrawerListener接口的實現。
?*該接口提供了菜單打開關閉等事件的回調函數,例如?onDrawerOpened()?和onDrawerClosed().
?*
?*4、如果您的Activity使用了?action?bar,則您可以使用Support庫提供的?ActionBarDrawerToggle?類,該類實現了?DrawerLayout.DrawerListener接口,
?*并且您還可以根據需要重寫相關的函數。該類實現了菜單和Action?bar相關的操作。
?*
?*5、當菜單顯示的時候您應該根據情況隱藏ActionBar上的功能菜單并且修改ActionBar的標題,可以使用?ActionBarDrawerToggle?類來實現這些功能
?*
?*6、使用?ActionBarDrawerToggle?,先通過其構造函數來創建該對象,構造函數需要如下參數:
?*顯示抽屜的?Activity?對象
??*DrawerLayout?對象
?*一個用來指示抽屜的?drawable資源
?*一個用來描述打開抽屜的文本?(用于支持可訪問性)。
?*一個用來描述關閉抽屜的文本(用于支持可訪問性).
?*無論你是否繼承?ActionBarDrawerToggle?來實現抽屜監聽器,您都需要在Activity的生命周期函數中調用ActionBarDrawerToggle?的一些函數。
?*??
?*?官網詳細說明:http://developer.android.com/design/patterns/navigation-drawer.html
?*?創??建??人:fy???
?*?創建時間:2014-3-14?下午3:08:41???
?*?Copyright?(c)?方勇-版權所有
?*/
public?class?MainActivity?extends?Activity?{
/*?抽屜菜單--根控件?*/
private?DrawerLayout?mDrawerLayout;
/*?抽屜菜單--左邊菜單?*/
private?ListView?mDrawerList;
/*?抽屜菜單--應用圖標指示抽屜開關?*/
private?ActionBarDrawerToggle?mDrawerToggle;
?
private?String?mDrawerTitle;
/*?抽屜菜單--左邊菜單--數據集合?*/
private?String[]?mPlanetTitles;
?
@Override
protected?void?onCreate(Bundle?savedInstanceState)?{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViews();
setListeners();
initdata();
if?(savedInstanceState?==?null)?{
selectItem(0);
}
}
?
private?void?findViews()?{
mDrawerLayout?=?(DrawerLayout)?findViewById(R.id.drawer_layout);
mDrawerList?=?(ListView)?findViewById(R.id.left_drawer);
//?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(mDrawerTitle);
//?Declare?that?the?options?menu?has?changed,?so?should?be?recreated.
//?//?creates?call?to?onPrepareOptionsMenu()
invalidateOptionsMenu();
}
/*打開菜單*/
public?void?onDrawerOpened(View?drawerView)?{
getActionBar().setTitle(mDrawerTitle);
//?Declare?that?the?options?menu?has?changed,?so?should?be?recreated.
//?//?creates?call?to?onPrepareOptionsMenu()
invalidateOptionsMenu();
}
};
}
?
private?void?setListeners()?{
mDrawerList.setOnItemClickListener(new?DrawerItemClickListener());
mDrawerLayout.setDrawerListener(mDrawerToggle);
}
?
private?void?initdata()?{
//?菜單標題
mDrawerTitle?=?getTitle().toString();
//?左邊菜單數據集合
mPlanetTitles?=?getResources().getStringArray(R.array.planets_array);
//設置拉出導航菜單時陰影,官方示例不明顯,可把圖片背景修改一下??
????????????????mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow,?GravityCompat.START);
//?set?up?the?drawer's?list?view?with?items?and?click?listener
mDrawerList.setAdapter(new?ArrayAdapter<String>(this,?R.layout.drawer_list_item,?mPlanetTitles));
?
//ActionBar操作模式開啟?
getActionBar().setDisplayHomeAsUpEnabled(true);
getActionBar().setHomeButtonEnabled(true);
}
?
?
/*?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);
}
}
?
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)?{
//?mTitle?=?title;
//?getActionBar().setTitle(mTitle);
mDrawerTitle?=?title.toString();
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];
?
int?imageId?=?getResources().getIdentifier(planet.toLowerCase(Locale.getDefault()),?"drawable",
????????getActivity().getPackageName());
((ImageView)?rootView.findViewById(R.id.image)).setImageResource(imageId);
getActivity().setTitle(planet);
return?rootView;
}
}
}
<!--EndFragment-->
總結
- 上一篇: 关于电脑DNS(域名系统)访问不了网页的
- 下一篇: 5.中央处理器