基本上从现在开始之后的Android Studio都会在创建项目的并选择第一个Activity时可以选择带有Navigation Drawer的Acitivity,然而,对于和我一样的新手可能对于读懂NaviDrawer的实现非常困难,因此有一些要点要记下来防止自己忘记。
在Android 官方文档中可以获得不少信息,然而官方文档中的例子与实际由AS创建的NaviDrawer并不符,因此先从官方文档入手。
网址:http://developer.android.com/training/implementing-navigation/nav-drawer.html
1.创建一个新的Drawerlayout的xml文件
它可以是你的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">
<!-- 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="240dp"
android:layout_height="match_parent"
android:layout_gravity="start"
android:choiceMode="singleChoice"
android:divider="@android:color/transparent"
android:dividerHeight="0dp"
android:background="#ffa2a2a2"/>
</android.support.v4.widget.DrawerLayout>
要留意的地方是
android:layout_gravity="start"
控制的是Drawer从左边拉出而不是右边。
android:layout_width="240dp"
控制的是Drawer的宽度,可以自己调节。
2.初始化DrawerList
根据官方文档以及《Android UI Fundamentals》(by Jason Ostrander)关于ListView的描述,
这一步骤的逻辑应当是这样的。
a.首先你有一个字符串数组String array并放置在/res文件夹下(我在这里用的是/res/values/array.xml)
array.xml:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="planets_array">
<item>厦门市</item>
<item>福州市</item>
<item>泉州市</item>
<item>漳州市</item>
<item>龙岩市</item>
</string-array>
</resources>
这个数组是将来填充到Drawer中的字符串数组。
b.仅仅有可以用来填充的字符串是不够的,系统还将需要更多信息去将字符串以何种形式填充DrawerList,因此需要在layout文件夹下创建一个drawer_list_item.xml,而对于最终形成的DrawerLayout,每一行调用drawer_list_item.xml中的布局,因此这个xml必须够简单,
我的drawer_list_item.xml:
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/text1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:minHeight="?android:attr/listPreferredItemHeight"
/>
c.在java中注册以上内容
接下来这段就不难理解了,取自官方文档
public class MainActivity extends Activity {
private String[] mPlanetTitles;
private DrawerLayout mDrawerLayout;
private ListView mDrawerList;
...
@Override
public 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);
// Set the adapter for the list view
mDrawerList.setAdapter(new ArrayAdapter<String>(this,
R.layout.drawer_list_item, mPlanetTitles));
// Set the list's click listener
mDrawerList.setOnItemClickListener(new DrawerItemClickListener());
...
}
}
其中
mDrawerList.setOnItemClickListener(new DrawerItemClickListener());
是自己需要定义的
(未完待续)