美团,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" />
实现效果如下:
相关推荐
ActivityGroup使导航栏一直都在,在Activity中还能进行多层跳转
采用了两种方式实现:1.用ActivityGroup和DataGrid相结合实现;2.采用继承FragmentActivity和RadioButton相组合实现;博客地址:http://blog.csdn.net/pfe_nova/article/details/38645515
ActivityGroup 多个activity页面返回 子activity menu设置
用ActivityGroup实现的activity栈,类似IOS的UINavigationController
ActivityGroup|顶部底部均有Tab标签之二 http://blog.csdn.net/geofferysun/article/details/41852605
ActivityGroup的用法,头部和底部为固定布局中间动态显示界面 并在中间布局实现手势滑动效果,自定义SlidingDrawer(抽屉)效果,在ActivityGroup里执行跳转等功能。至于在Android在ActivityGroup里执行跳转详细介绍 ...
通过ActivityGroup的方式实现Android底部导航栏。布局文件可根据activity所需编写
使用ActivityGroup来切换Activity和Layout
NULL 博文链接:https://fanhongtao.iteye.com/blog/1430893
ActivityGroup和GridView实现标签分页 ActivityGroup和GridView实现标签分页
Android开发—使用ActivityGroup来切换Activity和Layout.pdf
ActivityGroup
使用GridView+ActivityGroup实现的tab分页效果
为ActivityGroup能往界面上不停的添加界面,这样就能实现界面的叠加效果,但是你叠加的时候就会发现,叠加上去的界面不会显示下面的选项卡, 而且你的返回键,也不好使。这个源码就是用到TabActivity内嵌ActivityGroup...
Android基于ActivityGroup项目框架,此框架和tabActivity不一样,每个tab下都可以建立多个Activity。
NULL 博文链接:https://1002878825-qq-com.iteye.com/blog/1812628
ActivityGroup之Activity内跳转和外跳转
一个详细讲解activitygroup类使用方法的工程。
android中tabhost和ActivityGroup的组合使用,特别是对多个Activity之间的跳转,压栈出战的管理,很有帮助。