美团,qq,都有自己的工具导航栏,它的功能类似前面几章讲过的标签,但是在实际应用中很少用标签TabHost,操作使用较困难,所以一般不会作为实现界面分页框架的首选,使用最多的是ActivityGroup与GridView相结合方式。
为什么要用分页框架呢?我们之前学的每一个Activity都是采用屏幕独占的方式运行,使用ActivityGroup就可以使多个Activity运行在一个屏幕上,而且每一个Activty继续独立工作,这样的模式就大大提高了系统流畅度,不信可以去测测这样的模式与之前模式页面切换的使用时间。
安卓中专门提供import android.app.ActivityGroup;类来控制Activity
首先编写其中显示之一的Activity主布局函数:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <ImageView android:layout_width="fill_parent" android:layout_height="wrap_content" android:src="@drawable/tab1" /> </LinearLayout>
Activity只要显示图片Layout即可:
public class MyActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_my); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.my, menu); return true; } }
定义ActivityGroup用于管理:
public class MyActivityGroupDemo extends ActivityGroup { private GridView gridviewToolbar; // 工具菜单栏 private MenuImageAdapter menu = null; // 图片适配器 private LinearLayout content = null; // 填充内容 private int menu_img[] = new int[] { R.drawable.menu_main, R.drawable.menu_news, R.drawable.menu_sms, R.drawable.menu_more, R.drawable.menu_exit }; // 填充的图片的资源 private int width = 0; // 求出平均的宽度 private int height = 0; // 求出平均的高度,定位显示 private Intent intent = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); super.requestWindowFeature(Window.FEATURE_NO_TITLE); // 取消标题 super.setContentView(R.layout.main); this.gridviewToolbar = (GridView) super.findViewById(R.id.gridView1); this.content = (LinearLayout) super.findViewById(R.id.content); // 定义工具栏的一些信息显示 this.gridviewToolbar.setNumColumns(this.menu_img.length); // 求出可以保存的个数 this.gridviewToolbar.setSelector(new ColorDrawable(Color.TRANSPARENT)); this.gridviewToolbar.setGravity(Gravity.CENTER); this.gridviewToolbar.setVerticalSpacing(0); this.width = super.getWindowManager().getDefaultDisplay().getWidth() / this.menu_img.length; this.height = super.getWindowManager().getDefaultDisplay().getHeight() / 8; this.menu = new MenuImageAdapter(this, this.menu_img, this.width, this.height, R.drawable.menu_selected); this.gridviewToolbar.setAdapter(this.menu);//定义适配器类 this.switchActivity(0); // 第一个被选中 this.gridviewToolbar .setOnItemClickListener(new OnItemClickListenerImpl()); } private class OnItemClickListenerImpl implements OnItemClickListener { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { MyActivityGroupDemo.this.switchActivity(position); } } private void switchActivity(int id) { // 切换选中的操作 this.menu.setFocus(id); // 设置选中图片的背景 this.content.removeAllViews(); // 删除所有的内容 switch (id) { case 0: this.intent = new Intent(MyActivityGroupDemo.this, MyActivity.class); break; case 1: this.intent = new Intent(MyActivityGroupDemo.this, MyActivity.class); break; case 2: this.intent = new Intent(MyActivityGroupDemo.this, MyActivity.class); break; case 3: this.intent = new Intent(MyActivityGroupDemo.this, MyActivity.class); break; case 4: this.exitDialog() ; return; } this.intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); Window subActivity = super.getLocalActivityManager().startActivity( "subActivity", this.intent); this.content.addView(subActivity.getDecorView(), LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT); } private void exitDialog() { Dialog dialog = new AlertDialog.Builder(this).setIcon(R.drawable.pic_m) .setTitle("程序退出? ").setMessage("您确定要退出本程序吗?") .setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { MyActivityGroupDemo.this.finish() ; } }) .setNegativeButton("取消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { MyActivityGroupDemo.this.switchActivity(0); } }).create(); dialog.show(); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if(keyCode == KeyEvent.KEYCODE_BACK) { this.exitDialog() ; } return false ; } }
主布局函数为:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent"> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/content" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> </LinearLayout> <GridView android:id="@+id/gridviewbar" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:fadingEdgeLength="5px" android:fadingEdge="vertical"/> </RelativeLayout> </LinearLayout>
然后是适配器设置:
public class MenuImageAdapter extends BaseAdapter{ private Context context=null;//传递上下文文本 private ImageView[] menumag;//保存显示标签图片 private int imageselected;//保存记录选中图片标签索引位置 public MenuImageAdapter(Context context,int image[],int weight,int height,int imageselected){ this.context=context; this.imageselected=imageselected; this.menumag=new ImageView[image.length]; for(int x=0;x<image.length;x++){ this.menumag[x]=new ImageView(this.context); this.menumag[x].setLayoutParams(new GridView.LayoutParams(weight,height));//布局参数 this.menumag[x].setAdjustViewBounds(false);//不调整边界 this.menumag[x].setPadding(3, 3, 3, 3); this.menumag[x].setImageResource(image[x]); } } public int getCount() { // TODO Auto-generated method stub return this.menumag.length; } @Override public Object getItem(int position) { // TODO Auto-generated method stub return this.menumag[position]; } @Override public long getItemId(int arg0) { // TODO Auto-generated method stub return 0; } @Override public View getView(int position, View convertView, ViewGroup parent) { ImageView imgView = null ; if(convertView == null) { imgView = this.menumag[position] ; } else { imgView = (ImageView) convertView ; } return imgView; } public void setFocus(int selId) { // 设置选中的显示 for (int x = 0; x < this.menumag.length; x++) { if (x != selId) { // 没有选中的 this.menumag[x].setBackgroundResource(0) ; // 不设置背景图片 } } this.menumag[selId].setBackgroundResource(this.imageselected) ; } }
接下来记得配置AndroidMainfest Actvity信息,这里为了方便起见,只设置了一个Activity,读者可以自行设置
<activity android:name="MyActivity" />
实现效果如下: