• android_滑动式抽屉(SlidingDrawer)的使用


    滑动式抽屉(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)

     160-1

    ● オープン(open)状態のSlidingDrawer(赤枠のhandleを除く下部分がcontent)

     160-2

    例程源码(Resource)
    SlidingDrawer不能被单独的记述,必须作为某个控件的子控件,并且设置handle和content的id。
    具体的设置可以参照下面的例子

    01 <br />
    02 <?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?><br />
    03 <LinearLayout xmlns:android=&quot;<a href=&quot;http://schemas.android.com/apk/res/android&quot;>http://schemas.android.com/apk/res/android</a>&quot;<br />
    04     android:orientation=&quot;vertical&quot;<br />
    05     android:layout_width=&quot;fill_parent&quot;<br />
    06     android:layout_height=&quot;fill_parent&quot;<br />
    07     android:background=&quot;#808080&quot;><br />
    08     <SlidingDrawer<br />
    09         android:id=&quot;@+id/slidingdrawer&quot;<br />
    10         android:layout_width=&quot;fill_parent&quot;<br />
    11         android:layout_height=&quot;fill_parent&quot;<br />
    12         android:orientation=&quot;vertical&quot;<br />
    13         android:handle=&quot;@+id/handle&quot;<br />
    14         android:content=&quot;@+id/content&quot;>        <br />
    15         <LinearLayout<br />
    16             android:id=&quot;@id/handle&quot;<br />
    17             android:layout_width=&quot;88dip&quot;<br />
    18             android:layout_height=&quot;44dip&quot;<br />
    19             android:background=&quot;#0000FF&quot;/><br />
    20         <LinearLayout<br />
    21             android:id=&quot;@id/content&quot;<br />
    22             android:layout_width=&quot;fill_parent&quot;<br />
    23             android:layout_height=&quot;fill_parent&quot;<br />
    24             android:background=&quot;#00FF00&quot;><br />
    25             <Button<br />
    26                 android:id=&quot;@+id/button&quot;<br />
    27                 android:layout_width=&quot;wrap_content&quot;<br />
    28                 android:layout_height=&quot;wrap_content&quot;<br />
    29                 android:text=&quot;Button&quot;/><br />
    30             <EditText<br />
    31                 android:id=&quot;@+id/editText&quot;<br />
    32                 android:layout_width=&quot;fill_parent&quot;<br />
    33                 android:layout_height=&quot;wrap_content&quot;/><br />
    34         </LinearLayout><br />
    35     </SlidingDrawer><br />
    36 </LinearLayout></p>
    37 <p>

    执行后,会表示成下图的样子。
    ● 关闭(close)状态的SlidingDrawer(handle是蓝色背景的LinearLayout)

     160-3

     
    ● オープン(open)状態のSlidingDrawer(contentは、緑色背景のLinearLayout)

     160-4

      

    为了尽量简单的说明,在这里handle和content使用的是LinearLayout,实际运用的时候请换成适当的内容。
    例如,想将handle变成按钮的时候,需要把上面记述的handle部分置换成下面的样子。
    ※执行时,不仅要置换例程的main.xml的一部分内容,还要追加png文件和handle.xml文件。
    ● 项目文件构成(res目录)

     160-5

      

    ● res\layout\main.xml(内容置换)
    ※把id是handle的LinearLayout块<~/>置换为Button

    1 </p>
    2 <p><Button<br />
    3     android:id=&quot;@id/handle&quot;<br />
    4     android:layout_width=&quot;88dip&quot;<br />
    5     android:layout_height=&quot;44dip&quot;<br />
    6     android:background=&quot;@drawable/handle&quot;/></p>
    7 <p>

    ● res\drawable\handle.xml(要追加)

    01 </p>
    02 <p><?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?><br />
    03 <selector xmlns:android=&quot;<a href=&quot;http://schemas.android.com/apk/res/android&quot;>http://schemas.android.com/apk/res/android</a>&quot;><br />
    04     <item android:state_window_focused=&quot;false&quot;<br />
    05         android:state_enabled=&quot;true&quot;<br />
    06         android:drawable=&quot;@drawable/handle_normal&quot; /><br />
    07     <item android:state_pressed=&quot;true&quot;<br />
    08         android:drawable=&quot;@drawable/handle_pressed&quot; /><br />
    09     <item android:state_focused=&quot;true&quot;<br />
    10         android:state_enabled=&quot;true&quot;<br />
    11         android:drawable=&quot;@drawable/handle_selected&quot;/><br />
    12     <item android:state_enabled=&quot;true&quot;<br />
    13         android:drawable=&quot;@drawable/handle_normal&quot; /><br />
    14     <item android:state_focused=&quot;true&quot;<br />
    15         android:drawable=&quot;@drawable/handle_selected&quot; /><br />
    16 </selector></p>
    17 <p>

    ● res\drawable\handle_normal.png(要追加)

    handle_normal

    ● res\drawable\handle_pressed.png(追加)

     handle_pressed

    ● res\drawable\handle_selected.png(追加)

     handle_selected

    常见问题解决
    记述了SlidingDrawerResource,但是没有记述handle和content的id的时候,
    编译时不会出错误,但是在执行时会出下面的错误信息
           android.view.InflateException: Binary XML file line #: Error inflating class java.lang.reflect.Constructor
    解决方法,在上述的Resource记述方法,追加handle和content的id的设置。

    例程源码(Java)
    (不是必须的)如果要在handle的打开和关闭以及滚动的时候执行一些处理,
    可以向下面的代码那样,在各自的事件里追加处理。

    01 <br />
    02 public class SlidingDrawerActivity extends Activity {<br />
    03     private SlidingDrawer mDialerDrawer;<br />
    04    <br />
    05     @Override<br />
    06     public void onCreate(Bundle savedInstanceState) {<br />
    07         super.onCreate(savedInstanceState);<br />
    08         setContentView(R.layout.main);<br />
    09        <br />
    10         mDialerDrawer = (SlidingDrawer) findViewById(R.id.slidingdrawer);<br />
    11        <br />
    12         mDialerDrawer.setOnDrawerScrollListener(new SlidingDrawer.OnDrawerScrollListener() {<br />
    13             @Override<br />
    14             public void onScrollStarted() {<br />
    15                 Log.v(&quot;SlidingDrawerActivity&quot;, &quot;onScrollStarted()&quot;);<br />
    16             }<br />
    17             @Override<br />
    18             public void onScrollEnded() {<br />
    19                 Log.v(&quot;SlidingDrawerActivity&quot;, &quot;onScrollEnded()&quot;);<br />
    20             }<br />
    21         });<br />
    22        <br />
    23         mDialerDrawer.setOnDrawerOpenListener(new SlidingDrawer.OnDrawerOpenListener() {<br />
    24             @Override<br />
    25             public void onDrawerOpened() {<br />
    26                 Log.v(&quot;SlidingDrawerActivity&quot;, &quot;onDrawerOpened()&quot;);<br />
    27             }<br />
    28         });<br />
    29        <br />
    30         mDialerDrawer.setOnDrawerCloseListener(new SlidingDrawer.OnDrawerCloseListener() {<br />
    31             @Override<br />
    32             public void onDrawerClosed() {<br />
    33                 Log.v(&quot;SlidingDrawerActivity&quot;, &quot;onDrawerClosed()&quot;);<br />
    34             }<br />
    35         });<br />
    36     }<br />
    37 }</p>
    38 <p>

    其他可参考的源代码(Java)
    ● 可参照Android的源代码「packages\apps\Launcher」和「packages\apps\Phone」。

  • 相关阅读:
    第三章 p62 或运算
    p57 字符串的长度
    p53 ASCII码
    整数类型,如同时钟
    重要:原码、反码、补码...
    p42 实验溢出(上溢)
    P40 字节单位:KMGT
    p38 二、八、十六进制的对应关系
    p13 数组元素的地址
    p11 内存中的数据和地址
  • 原文地址:https://www.cnblogs.com/xianghang123/p/1705333.html
Copyright © 2020-2023  润新知