SlidingDrawer 是自SDK 1.5 才新加入的成员,也许你已曾经在Android 手机上看过。按下
一个按钮,就能展开一个"程序集"菜单,里面包含了各式各样的程序,而SlidingDrawer
Widget 正是为了这样的效果所准备的,当你在布局有限的UI Layout 时,可以应用
SlidingDrawaer 来在可视范围内放置更多组件,在需要的时候才拉出"抽屉"里的"子功能图标
"。SlidingDrawer 配置上采用了水平展开或垂直展开两种(android:orientation)方式,在XML
里必须指定其使用的android:handle 与android:content,前者委托要展开的图片(Layout 配
置),后者则是要展开的Layout Content。
运行结果如下
SlidingDrawer 的使用,并不需复杂的设置才能启用,关键在于XML 里的属性设置,稍后
将会看到XML 里的描述。在主程序中所建立的SlidingDrawer 对象,为了捕捉"打开完毕"与"
已经关闭"这两个事件,所设置的Listener 为SlidingDrawer.setOnDrawerOpenListener()与
SlidingDrawer.setOnDrawerCloseListener()。
1.
2. import android.widget.GridView;
3. import android.widget.ImageView;
4. import android.widget.SlidingDrawer;
5.
6. public class EX04_27 extends Activity
7. {
8. private GridView gv;
9. private SlidingDrawer sd;
10. private ImageView im;
11. private int[] icons={R.drawable.alarm,R.drawable.calendar,
12. R.drawable.camera,R.drawable.clock,
13. R.drawable.music,R.drawable.tv};
14. private String[] items=
15. {
16. "Alarm","Calendar","Camera","Clock","Music","TV"
17. };
18.
19.
20. @Override
21. public void onCreate(Bundle savedInstanceState)
22. {
23. super.onCreate(savedInstanceState);
24.
25. setContentView(R.layout.main);
26.
27. gv = (GridView)findViewById(R.id.myContent1);
28. sd = (SlidingDrawer)findViewById(R.id.drawer1);
29. im=(ImageView)findViewById(R.id.myImage1);
30.
31.
32. MyGridViewAdapter adapter=new MyGridViewAdapter(this,items,icons);
33. gv.setAdapter(adapter);
34.
35.
36. sd.setOnDrawerOpenListener
37. (new SlidingDrawer.OnDrawerOpenListener()
38. {
39. @Override
40. public void onDrawerOpened()
41. {
42. im.setImageResource(R.drawable.close);
43. }
44. });
45.
46. sd.setOnDrawerCloseListener
47. (new SlidingDrawer.OnDrawerCloseListener()
48. {
49. @Override
50. public void onDrawerClosed()
51. {
52. im.setImageResource(R.drawable.open);
53. }
54. });
55. }
56. }
MyGridViewAdapter 在本范例中,是为了"拉开SlindingDrawer"所要显示的GridView 配置
的图标,以下是自定义继承自BaseAdapter 的类。
1.
2.
3.
4. public class MyGridViewAdapter extends BaseAdapter
5. {
6. private Context _con;
7. private String[] _items;
8. private int[] _icons;
9.
10. public MyGridViewAdapter(Context con,String[] items,int[] icons)
11. {
12. _con=con;
13. _items=items;
14. _icons=icons;
15. }
16.
17. @Override
18. public int getCount()
19. {
20. return _items.length;
21. }
22.
23. @Override
24. public Object getItem(int arg0)
25. {
26. return _items[arg0];
27. }
28.
29. @Override
30. public long getItemId(int position)
31. {
32. return position;
33. }
34.
35. @Override
36. public View getView(int position, View convertView, ViewGroup parent)
37. {
38. LayoutInflater factory = LayoutInflater.from(_con);
39.
40. View v = (View) factory.inflate(R.layout.grid, null);
41.
42. ImageView iv = (ImageView) v.findViewById(R.id.icon);
43. TextView tv = (TextView) v.findViewById(R.id.text);
44.
45. iv.setImageResource(_icons[position]);
46. tv.setText(_items[position]);
47. return v;
48. }
49. }
res/layout/main.java
这支XML 中的SlidingDrawer TAG,通过Activity 里onCreate() 方法中的setContent-
View(R.layout.main)之后,就会存在于布局(Layout )当中,即使主程序(EX04_27.java)没有
编写相关的程序,依然可以正常运行,关键在于当中android:handle 指定要显示的ImageView
(小圆图)作为开关,android:content 则是按下这个ImageView (开关)之后,所要展开抽屉
显示的布局(Layout)。
1. <?xml version="1.0" encoding="utf-8"?>
2. <RelativeLayout
3. xmlns:android="http://schemas.android.com/apk/res/android"
4. android:layout_width="fill_parent"
5. android:layout_height="fill_parent"
6. >
7. <TextView
8. android:layout_width="fill_parent"
9. android:layout_height="wrap_content"
10. android:text="@string/hello"
11. android:textSize="16sp"
12. />
13. <SlidingDrawer
14. android:id="@+id/drawer1"
15. android:layout_width="fill_parent"
16. android:layout_height="fill_parent"
17. android:handle="@+id/layout1"
18. android:content="@+id/myContent1"
19. android:orientation="horizontal"
20. >
21. <LinearLayout
22. android:id="@id/layout1"
23. android:layout_width="35px"
24. android:layout_height="fill_parent"
25. android:background="@drawable/black"
26. android:gravity="center"
27. >
28. <ImageView
29. android:id="@+id/myImage1"
30. android:layout_width="wrap_content"
31. android:layout_height="wrap_content"
32. android:src="@drawable/open"
33. />
34. </LinearLayout>
35. <GridView
36. android:id="@id/myContent1"
37. android:layout_width="wrap_content"
38. android:layout_height="wrap_content"
39. android:numColumns="2"
40. android:background="@drawable/black"
41. android:gravity="center"
42. />
43. </SlidingDrawer>
44. </RelativeLayout>
上面的XML 程序代码之中是配置以水平方式来打开抽屉,我们另外通过修改
android:orientation="vertical",就能让SlidingDrawer 以垂直的方式打开。
1. <SlidingDrawer
2. android:id="@+id/drawer1"
3. android:layout_width="fill_parent"
4. android:layout_height="fill_parent"
5. android:handle="@+id/layout1"
6. android:content="@+id/myContent1"
7. android:orientation="vertical"
8. >