`

ActivityGroup组件工具导航栏(7)

阅读更多

       美团,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" />

 

实现效果如下:




 
 

 

 

  • 大小: 3.8 KB
  • 大小: 42.7 KB
  • 大小: 25.9 KB
0
1
分享到:
评论

相关推荐

    ActivityGroup使导航栏一直都在

    在Android开发中,ActivityGroup是一种特殊的布局管理器,它允许我们在一个TabHost或者StackView等容器内嵌套多个Activity,从而实现类似导航栏的效果,使得导航栏始终可见。这个技术在早期的Android版本中被广泛...

    android 底部导航栏

    1. 使用Material Design库:Google提供了Material Design组件库,其中的`BottomNavigationView`是专门用于创建底部导航栏的。引入依赖后,可以通过XML布局文件创建并添加菜单项。 ```xml android:id="@+id/bottom...

    ActivityGroup|顶部底部均有Tab标签之二

    在Android SDK中,可以使用`BottomNavigationView`组件来创建底部导航栏。每个菜单项对应一个Tab,可以通过设置`NavigationItemSelectedListener`来监听用户的点击事件,并根据选择的Tab更新内容。 在描述中提到的...

    ActivityGroup实现Activit栈

    - ActivityGroup中,LocalActivityManager是核心组件,用于管理和控制子Activity的生命周期。它可以启动、暂停、恢复或销毁子Activity,并保存每个子Activity的状态。 3. **添加和管理子Activity**: - 使用...

    使用ActivityGroup管理Activity

    在Android开发中,Activity是应用程序的基本组件,用于与用户交互并展示UI。然而,有时开发者可能需要在同一个栈中管理多个Activity,这时`ActivityGroup`就派上了用场。`ActivityGroup`是早期Android版本(Android ...

    activitygroup

    虽然`ActivityGroup`提供了一种实现多级导航的方式,但它存在许多问题,如内存泄漏、难以调试以及不兼容新版本的Android API。因此,从Android 3.0开始,官方推荐使用`Fragment`来代替。`Fragment`可以直接在`...

    Android工具导航栏(博客源码)

    采用了两种方式实现:1.用ActivityGroup和DataGrid相结合实现;2.采用继承FragmentActivity和RadioButton相组合实现;博客地址:http://blog.csdn.net/pfe_nova/article/details/38645515

    android ActivityGroup的demo

    1. **LocalActivityManager**:这是ActivityGroup的核心组件,用于管理子Activity的创建、销毁以及保存和恢复状态。通过LocalActivityManager,我们可以方便地在ActivityGroup内启动新的子Activity,并在需要时切换...

    使用ActivityGroup来切换Activity和Layout

    在这种情况下,通常我们会选择使用TabHost或者Fragment等组件来实现,但如果你正在使用的是Android早期版本(API Level ),`ActivityGroup`是一个可行的选择。`ActivityGroup`是`TabActivity`的一种替代方案,它...

    Android中ActivityGroup的应用

    ActivityGroup的用法,头部和底部为固定布局中间动态显示界面 并在中间布局实现手势滑动效果,自定义SlidingDrawer(抽屉)效果,在ActivityGroup里执行跳转等功能。至于在Android在ActivityGroup里执行跳转详细介绍 ...

    安卓底部导航栏的实现

    通过ActivityGroup的方式实现Android底部导航栏。布局文件可根据activity所需编写

    gridview+activityGroup实现tab分页

    7. **使用Intent传递数据**:在ActivityGroup中,可以通过LocalActivityManager和Intent来启动和管理子Activity,并传递必要的数据。 8. **优化用户体验**:为了提供良好的用户体验,可以考虑添加滑动切换Tab的功能...

    Android开发—使用ActivityGroup来切换Activity和Layout.pdf

    现代Android开发中,推荐使用Fragment搭配FragmentManager和FragmentTransaction来实现界面的切换和管理,这样可以更好地支持多屏幕适配,以及利用Android Studio提供的工具和生命周期管理。然而,理解ActivityGroup...

    基于GridView和ActivityGroup实现的TAB分页(附源码)

    在这个场景中,`GridView`被用于作为底部的导航栏,展示各个分页的标签。 `ActivityGroup`是Android早期版本中的一个类,它允许你在同一个`Activity`里嵌套多个子`Activity`。在这个实现中,`ActivityGroup`的作用...

    tabhost和ActivityGroup的组合使用

    总结,TabHost和ActivityGroup是Android早期开发中的重要工具,它们帮助开发者构建了具有标签页功能的应用。随着Android API的发展,现在更倾向于使用Fragment和FragmentTransaction来替代ActivityGroup,以实现更...

    ActivityGroup和GridView实现标签分页

    在Android开发中,ActivityGroup和GridView是两种常用的组件,它们可以协同工作来实现标签分页的效果,这是一种常见的用户界面设计模式,通常用于展示多个类似内容的页面,让用户通过标签进行切换浏览。本篇将深入...

    TabHost, ActivityGroup 的使用例子

    在Android开发中,TabHost和ActivityGroup是两个重要的组件,它们用于实现复杂的界面布局和交互。TabHost主要用于创建带有标签页的应用界面,而ActivityGroup则允许你在同一个父Activity下管理多个子Activity,使得...

    ActivityGroup应用实例

    7. **升级到Fragment**:虽然ActivityGroup在现代Android开发中已经较少使用,但理解它的工作原理有助于理解Fragment。通常,开发者会被鼓励将ActivityGroup的代码重构为使用Fragment,以利用Fragment提供的更丰富的...

    fragment tabhost 精美底部导航栏源代码

    总之,这个开源项目展示了如何利用现代的Android组件Fragment和TabHost来构建一个精美的底部导航栏,遵循最佳实践,避免使用已废弃的API,从而提高应用的稳定性和可维护性。通过学习和实践这个示例,开发者可以提升...

    安卓Android源码——TabHost内嵌ActivityGroup界面管理源码.zip

    在安卓应用开发中,TabHost和ActivityGroup是两种常见的组件,用于实现多页面的导航和管理。本资源“安卓Android源码——TabHost内嵌ActivityGroup界面管理源码.zip”提供了一个实例,帮助开发者理解如何在TabHost中...

Global site tag (gtag.js) - Google Analytics