美团,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" />
实现效果如下:
相关推荐
在Android开发中,ActivityGroup是一种特殊的布局管理器,它允许我们在一个TabHost或者StackView等容器内嵌套多个Activity,从而实现类似导航栏的效果,使得导航栏始终可见。这个技术在早期的Android版本中被广泛...
1. 使用Material Design库:Google提供了Material Design组件库,其中的`BottomNavigationView`是专门用于创建底部导航栏的。引入依赖后,可以通过XML布局文件创建并添加菜单项。 ```xml android:id="@+id/bottom...
在Android SDK中,可以使用`BottomNavigationView`组件来创建底部导航栏。每个菜单项对应一个Tab,可以通过设置`NavigationItemSelectedListener`来监听用户的点击事件,并根据选择的Tab更新内容。 在描述中提到的...
- ActivityGroup中,LocalActivityManager是核心组件,用于管理和控制子Activity的生命周期。它可以启动、暂停、恢复或销毁子Activity,并保存每个子Activity的状态。 3. **添加和管理子Activity**: - 使用...
在Android开发中,Activity是应用程序的基本组件,用于与用户交互并展示UI。然而,有时开发者可能需要在同一个栈中管理多个Activity,这时`ActivityGroup`就派上了用场。`ActivityGroup`是早期Android版本(Android ...
虽然`ActivityGroup`提供了一种实现多级导航的方式,但它存在许多问题,如内存泄漏、难以调试以及不兼容新版本的Android API。因此,从Android 3.0开始,官方推荐使用`Fragment`来代替。`Fragment`可以直接在`...
采用了两种方式实现:1.用ActivityGroup和DataGrid相结合实现;2.采用继承FragmentActivity和RadioButton相组合实现;博客地址:http://blog.csdn.net/pfe_nova/article/details/38645515
1. **LocalActivityManager**:这是ActivityGroup的核心组件,用于管理子Activity的创建、销毁以及保存和恢复状态。通过LocalActivityManager,我们可以方便地在ActivityGroup内启动新的子Activity,并在需要时切换...
在这种情况下,通常我们会选择使用TabHost或者Fragment等组件来实现,但如果你正在使用的是Android早期版本(API Level ),`ActivityGroup`是一个可行的选择。`ActivityGroup`是`TabActivity`的一种替代方案,它...
ActivityGroup的用法,头部和底部为固定布局中间动态显示界面 并在中间布局实现手势滑动效果,自定义SlidingDrawer(抽屉)效果,在ActivityGroup里执行跳转等功能。至于在Android在ActivityGroup里执行跳转详细介绍 ...
通过ActivityGroup的方式实现Android底部导航栏。布局文件可根据activity所需编写
7. **使用Intent传递数据**:在ActivityGroup中,可以通过LocalActivityManager和Intent来启动和管理子Activity,并传递必要的数据。 8. **优化用户体验**:为了提供良好的用户体验,可以考虑添加滑动切换Tab的功能...
现代Android开发中,推荐使用Fragment搭配FragmentManager和FragmentTransaction来实现界面的切换和管理,这样可以更好地支持多屏幕适配,以及利用Android Studio提供的工具和生命周期管理。然而,理解ActivityGroup...
在这个场景中,`GridView`被用于作为底部的导航栏,展示各个分页的标签。 `ActivityGroup`是Android早期版本中的一个类,它允许你在同一个`Activity`里嵌套多个子`Activity`。在这个实现中,`ActivityGroup`的作用...
总结,TabHost和ActivityGroup是Android早期开发中的重要工具,它们帮助开发者构建了具有标签页功能的应用。随着Android API的发展,现在更倾向于使用Fragment和FragmentTransaction来替代ActivityGroup,以实现更...
在Android开发中,ActivityGroup和GridView是两种常用的组件,它们可以协同工作来实现标签分页的效果,这是一种常见的用户界面设计模式,通常用于展示多个类似内容的页面,让用户通过标签进行切换浏览。本篇将深入...
在Android开发中,TabHost和ActivityGroup是两个重要的组件,它们用于实现复杂的界面布局和交互。TabHost主要用于创建带有标签页的应用界面,而ActivityGroup则允许你在同一个父Activity下管理多个子Activity,使得...
7. **升级到Fragment**:虽然ActivityGroup在现代Android开发中已经较少使用,但理解它的工作原理有助于理解Fragment。通常,开发者会被鼓励将ActivityGroup的代码重构为使用Fragment,以利用Fragment提供的更丰富的...
总之,这个开源项目展示了如何利用现代的Android组件Fragment和TabHost来构建一个精美的底部导航栏,遵循最佳实践,避免使用已废弃的API,从而提高应用的稳定性和可维护性。通过学习和实践这个示例,开发者可以提升...
在安卓应用开发中,TabHost和ActivityGroup是两种常见的组件,用于实现多页面的导航和管理。本资源“安卓Android源码——TabHost内嵌ActivityGroup界面管理源码.zip”提供了一个实例,帮助开发者理解如何在TabHost中...