滑动式抽屉(SlidingDrawer)
通过手柄像抽屉一样滑动式的把带有内容的画面隐藏和表示的窗体小组件。
这个窗体组件在Android1.0里面是非公开的API(frameworks\base\core\java\com\android\internal\widget\SlidingDrawer.java)。
从Android1.5开始,变成正式的API(android.widget.SlidingDrawer类)。
这个窗体组件在Android的Home画面的ApplicationLauncher里使用了(参照下图)。
● 关闭(close)状态的SlidingDrawer(红框内的是手柄-handle)
 
● オープン(open)状態のSlidingDrawer(赤枠のhandleを除く下部分がcontent)
 
例程源码(Resource)
SlidingDrawer不能被单独的记述,必须作为某个控件的子控件,并且设置handle和content的id。
具体的设置可以参照下面的例子
| 02 | <?xmlversion="1.0" encoding="utf-8"?><br/>  | 
 
| 04 |     android:orientation="vertical"<br/>  | 
 
| 05 |     android:layout_width="fill_parent"<br/>  | 
 
| 06 |     android:layout_height="fill_parent"<br/>  | 
 
| 07 |     android:background="#808080"><br/>  | 
 
| 09 |         android:id="@+id/slidingdrawer"<br/>  | 
 
| 10 |         android:layout_width="fill_parent"<br/>  | 
 
| 11 |         android:layout_height="fill_parent"<br/>  | 
 
| 12 |         android:orientation="vertical"<br/>  | 
 
| 13 |         android:handle="@+id/handle"<br/>  | 
 
| 14 |         android:content="@+id/content">        <br/>  | 
 
| 16 |             android:id="@id/handle"<br/>  | 
 
| 17 |             android:layout_width="88dip"<br/>  | 
 
| 18 |             android:layout_height="44dip"<br/>  | 
 
| 19 |             android:background="#0000FF"/><br/>  | 
 
| 21 |             android:id="@id/content"<br/>  | 
 
| 22 |             android:layout_width="fill_parent"<br/>  | 
 
| 23 |             android:layout_height="fill_parent"<br/>  | 
 
| 24 |             android:background="#00FF00"><br/>  | 
 
| 26 |                 android:id="@+id/button"<br/>  | 
 
| 27 |                 android:layout_width="wrap_content"<br/>  | 
 
| 28 |                 android:layout_height="wrap_content"<br/>  | 
 
| 29 |                 android:text="Button"/><br/>  | 
 
| 31 |                 android:id="@+id/editText"<br/>  | 
 
| 32 |                 android:layout_width="fill_parent"<br/>  | 
 
| 33 |                 android:layout_height="wrap_content"/><br/>  | 
 
| 35 |     </SlidingDrawer><br/>  | 
 
  
执行后,会表示成下图的样子。
● 关闭(close)状态的SlidingDrawer(handle是蓝色背景的LinearLayout)
 
 
● オープン(open)状態のSlidingDrawer(contentは、緑色背景のLinearLayout)
 
  
为了尽量简单的说明,在这里handle和content使用的是LinearLayout,实际运用的时候请换成适当的内容。
例如,想将handle变成按钮的时候,需要把上面记述的handle部分置换成下面的样子。
※执行时,不仅要置换例程的main.xml的一部分内容,还要追加png文件和handle.xml文件。
● 项目文件构成(res目录)
 
  
● res\layout\main.xml(内容置换)
※把id是handle的LinearLayout块<~/>置换为Button
| 3 |     android:id="@id/handle"<br/>  | 
 
| 4 |     android:layout_width="88dip"<br/>  | 
 
| 5 |     android:layout_height="44dip"<br/>  | 
 
| 6 |     android:background="@drawable/handle"/></p>  | 
 
  
● res\drawable\handle.xml(要追加)
| 02 | <p><?xmlversion="1.0" encoding="utf-8"?><br/>  | 
 
| 04 |     <itemandroid:state_window_focused="false"<br />  | 
 
| 05 |         android:state_enabled="true"<br/>  | 
 
| 06 |         android:drawable="@drawable/handle_normal" /><br/>  | 
 
| 07 |     <itemandroid:state_pressed="true"<br />  | 
 
| 08 |         android:drawable="@drawable/handle_pressed" /><br/>  | 
 
| 09 |     <itemandroid:state_focused="true"<br />  | 
 
| 10 |         android:state_enabled="true"<br/>  | 
 
| 11 |         android:drawable="@drawable/handle_selected"/><br/>  | 
 
| 12 |     <itemandroid:state_enabled="true"<br />  | 
 
| 13 |         android:drawable="@drawable/handle_normal" /><br/>  | 
 
| 14 |     <itemandroid:state_focused="true"<br />  | 
 
| 15 |         android:drawable="@drawable/handle_selected" /><br/>  | 
 
  
● res\drawable\handle_normal.png(要追加)

● res\drawable\handle_pressed.png(追加)
 
● res\drawable\handle_selected.png(追加)
 
常见问题解决
记述了SlidingDrawerResource,但是没有记述handle和content的id的时候,
编译时不会出错误,但是在执行时会出下面的错误信息
       android.view.InflateException: Binary XML file line #: Error inflating class java.lang.reflect.Constructor
解决方法,在上述的Resource记述方法,追加handle和content的id的设置。
例程源码(Java)
(不是必须的)如果要在handle的打开和关闭以及滚动的时候执行一些处理,
可以向下面的代码那样,在各自的事件里追加处理。
| 02 | publicclassSlidingDrawerActivity extendsActivity {<br />  | 
 
| 03 |     privateSlidingDrawer mDialerDrawer;<br />  | 
 
| 06 |     publicvoidonCreate(Bundle savedInstanceState) {<br />  | 
 
| 07 |         super.onCreate(savedInstanceState);<br />  | 
 
| 08 |         setContentView(R.layout.main);<br />  | 
 
| 10 |         mDialerDrawer = (SlidingDrawer) findViewById(R.id.slidingdrawer);<br />  | 
 
| 12 |         mDialerDrawer.setOnDrawerScrollListener(newSlidingDrawer.OnDrawerScrollListener() {<br />  | 
 
| 14 |             publicvoidonScrollStarted() {<br />  | 
 
| 15 |                 Log.v("SlidingDrawerActivity", "onScrollStarted()");<br />  | 
 
| 18 |             publicvoidonScrollEnded() {<br />  | 
 
| 19 |                 Log.v("SlidingDrawerActivity", "onScrollEnded()");<br />  | 
 
| 23 |         mDialerDrawer.setOnDrawerOpenListener(newSlidingDrawer.OnDrawerOpenListener() {<br />  | 
 
| 25 |             publicvoidonDrawerOpened() {<br />  | 
 
| 26 |                 Log.v("SlidingDrawerActivity", "onDrawerOpened()");<br />  | 
 
| 30 |         mDialerDrawer.setOnDrawerCloseListener(newSlidingDrawer.OnDrawerCloseListener() {<br />  | 
 
| 32 |             publicvoidonDrawerClosed() {<br />  | 
 
| 33 |                 Log.v("SlidingDrawerActivity", "onDrawerClosed()");<br />  | 
 
  
其他可参考的源代码(Java)
● 可参照Android的源代码「packages\apps\Launcher」和「packages\apps\Phone」。