范例说明
SlidingDrawer是自SDK1.5才新加入的成员,也许你已曾经在Android手机上看过。按下一个按钮,就能展开一个“程序集”菜单,里面包含了各式各样的程序,而SlidingDrawerWidget正是为了这样的效果所准备的,当你在布局有限的UI Layout时,可以应用SlidingDrawaer来在可视范围内放置更多组件,在需要的时候才拉出“抽屉”里的“子功能图标”。SlidingDrawer配置上采用了水平展开或垂直展开两种(android:orientation)方式,在XML里必须指定其使用的android:handle与android:content,前者委托要展开的图片(Layout配置),后者则是要展开的Layout Content。
源码下载:http://vdisk.weibo.com/s/1cs8n
▲ 图4-29 按下向左的圆形按钮,会类似抽屉拉开内含的GridViewLayout中的图示
范例程序
src/irdc.ex04_27/EX04_27.java
SlidingDrawer的使用,并不需复杂的设置才能启用,关键在于XML里的属性设置,稍后将会看到XML里的描述。在主程序中所建立的SlidingDrawer对象,为了捕捉“打开完毕”与“已经关闭”这两个事件,所设置的Listener为SlidingDrawer.setOnDrawerOpenListener()与SlidingDrawer.setOnDrawerCloseListener()。
import android.widget.GridView;
import android.widget.ImageView;
importandroid.widget.SlidingDrawer;
public class EX04_27 extends Activity
{
private GridViewgv;
privateSlidingDrawer sd;
private ImageViewim;
private int[]icons={R.drawable.alarm,R.drawable.calendar,
R.drawable.camera,R.drawable.clock,
R.drawable.music,R.drawable.tv};
private String[]items=
{
"Alarm","Calendar","Camera","Clock","Music","TV"
};
@Override
public voidonCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
gv= (GridView)findViewById(R.id.myContent1);
sd =(SlidingDrawer)findViewById(R.id.drawer1);
im=(ImageView)findViewById(R.id.myImage1);
MyGridViewAdapter adapter=newMyGridViewAdapter(this,items,icons);
gv.setAdapter(adapter);
sd.setOnDrawerOpenListener
(new SlidingDrawer.OnDrawerOpenListener()
{
@Override
public void onDrawerOpened()
{
im.setImageResource(R.drawable.close);
}
});
sd.setOnDrawerCloseListener
(new SlidingDrawer.OnDrawerCloseListener()
{
@Override
public void onDrawerClosed()
{
im.setImageResource(R.drawable.open);
}
});
}
}
src/irdc.ex04_27/MyGridViewAdapter.java
MyGridViewAdapter在本范例中,是为了“拉开SlindingDrawer”所要显示的GridView配置的图标,以下是自定义继承自BaseAdapter的类。
public class MyGridViewAdapter extendsBaseAdapter
{
private Context_con;
private String[]_items;
private int[]_icons;
publicMyGridViewAdapter(Context con,String[] items,int[]icons)
{
_con=con;
_items=items;
_icons=icons;
}
@Override
public intgetCount()
{
return _items.length;
}
@Override
public ObjectgetItem(int arg0)
{
return _items[arg0];
}
@Override
public longgetItemId(int position)
{
return position;
}
@Override
publicView getView(int position, View convertView, ViewGroupparent)
{
LayoutInflater factory = LayoutInflater.from(_con);
View v = (View) factory.inflate(R.layout.grid,null);
ImageView iv = (ImageView)v.findViewById(R.id.icon);
TextView tv = (TextView) v.findViewById(R.id.text);
iv.setImageResource(_icons[position]);
tv.setText(_items[position]);
return v;
}
}
res/layout/main.java
这支XML中的SlidingDrawerTAG,通过Activity里onCreate() 方法中的setContent-View(R.layout.main)之后,就会存在于布局(Layout)当中,即使主程序(EX04_27.java)没有编写相关的程序,依然可以正常运行,关键在于当中android:handle指定要显示的ImageView(小圆图)作为开关,android:content则是按下这个ImageView(开关)之后,所要展开抽屉显示的布局(Layout)。
<?xml version="1.0"encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
android:textSize="16sp"
/>
<SlidingDrawer
android:id="@+id/drawer1"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:handle="@+id/layout1"
android:content="@+id/myContent1"
android:orientation="horizontal"
>
<LinearLayout
android:id="@id/layout1"
android:layout_width="35px"
android:layout_height="fill_parent"
android:background="@drawable/black"
android:gravity="center"
>
<ImageView
android:id="@+id/myImage1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/open"
/>
</LinearLayout>
<GridView
android:id="@id/myContent1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:numColumns="2"
android:background="@drawable/black"
android:gravity="center"
/>
</SlidingDrawer>
</RelativeLayout>
扩展学习
上面的XML程序代码之中是配置以水平方式来打开抽屉,我们另外通过修改android:orientation="vertical",就能让SlidingDrawer以垂直的方式打开。
<SlidingDrawer
android:id="@+id/drawer1"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:handle="@+id/layout1"
android:content="@+id/myContent1"
android:orientation="vertical"
>