`
不夜的星辰
  • 浏览: 87831 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

android 类似电脑底部状态栏实现

 
阅读更多

一个在项目中运用的类似电脑底部状态栏的功能实现,该功能类似广泛使用的底部切换标签,但又有明显的不同,唯一相同点就是使用继承GroupActivity的方式实现不同activity在主界面上的切换,具体实现如下:

 

主界面:

package com.bar.test;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.AdapterView;
import android.widget.GridView;
import android.widget.SimpleAdapter;
import android.widget.AdapterView.OnItemClickListener;

public class MainActivity extends Activity {

	private Context mContext;
	private GridView gridView;
	private SimpleAdapter adapter;
	private List<HashMap<String, Object>> iconList;
	private Map<String, Object> mapItem;
	//gridview 标题与图标
	public static Object[][] gridViewData = new Object[][]{{"选项一",R.drawable.icon_im_at_desk_top,ToolUtil.ACTIVITY_ID_1},
		                                                    {"选项二",R.drawable.icon_map_at_desk_top,ToolUtil.ACTIVITY_ID_2},
		                                                    {"选项三",R.drawable.icon_interest_at_desk_top,ToolUtil.ACTIVITY_ID_3},
		                                                    {"选项四",R.drawable.icon_locus_at_desk_top,ToolUtil.ACTIVITY_ID_4},
		                                                    {"选项五",R.drawable.icon_assistant_at_desk_top,ToolUtil.ACTIVITY_ID_5},
		                                                    {"选项六",R.drawable.icon_setting_at_desk_top,ToolUtil.ACTIVITY_ID_6},};
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		mContext = this;
		gridView = (GridView) findViewById(R.id.gridView);
		init();
	}
	//初始化
	private void init(){
		iconList = new ArrayList<HashMap<String,Object>>();
		for(Object[] objects : gridViewData){
			mapItem = new HashMap<String, Object>();
			mapItem.put("title", objects[0]);
			mapItem.put("icon", objects[1]);
			iconList.add((HashMap<String, Object>) mapItem);
		}
		adapter = new SimpleAdapter(mContext, iconList, R.layout.gridview_item, new String[]{"title","icon"}, new int[]{R.id.tvTitle,R.id.ivIcon});
		gridView.setAdapter(adapter);
		gridView.setOnItemClickListener(new OnItemClickListener() {

			@Override
			public void onItemClick(AdapterView<?> parent, View view,
					int position, long id) {
				//传递选择要打开的activity ID
				Handler handler = ToolUtil.getHandler(AndroidBarTestActivity.class.getName());
				int activityId = Integer.parseInt(gridViewData[position][2].toString());
				if(handler != null){
					Message msg = new Message();
					msg.what = AndroidBarTestActivity.WITCH_ACTIVITY;
					msg.obj = activityId;
					handler.sendMessage(msg);
				}
			}
		});
	}
}

 继承了GroupActivity的框架activity:

package com.bar.test;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import android.R.integer;
import android.app.ActivityGroup;
import android.app.LocalActivityManager;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

public class AndroidBarTestActivity extends ActivityGroup {
	private Context mContext;
	public static final int WITCH_ACTIVITY = 10;
	// 当前activity ID
	private int currentActivityId = ToolUtil.ACTIVITY_ID_MAIN;
	private LayoutInflater lInflater;
	private LocalActivityManager aManager;
	private ImageButton ibClose,ibHide;
	private TextView tvTitle;

	private static final String PRIX = "activity_id_";
	private LinearLayout contentView;//当前窗口所包含的视图 即activity
	private LinearLayout bottomBarView;//底部状态栏所包含的视图 即activity
	private List<Integer> openActivityIdList = new ArrayList<Integer>();//底部状态栏所有打开的activity id
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.system_bar);
		ToolUtil.putHandler(AndroidBarTestActivity.class.getName(), handler);
		mContext = this;
		lInflater = this.getLayoutInflater();
		aManager = this.getLocalActivityManager();
		contentView = (LinearLayout) findViewById(R.id.content);
		bottomBarView = (LinearLayout) findViewById(R.id.bottom_status_bar);
		
		ibClose = (ImageButton) findViewById(R.id.close_window_btn);
		ibHide = (ImageButton) findViewById(R.id.hide_window_btn);
		tvTitle = (TextView) findViewById(R.id.title);
		
		ibClose.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				closeWindow();
			}
		});
		ibHide.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				hideWindow();
			}
		});
		switchWindowView();
	}
	private Handler handler = new Handler(){
		public void handleMessage(android.os.Message msg) {
			switch (msg.what) {
			case WITCH_ACTIVITY:
				int activityId = Integer.parseInt( msg.obj.toString());
				openWindow(activityId);
				break;

			default:
				break;
			}
		};
	};

	/**
	 * 关闭窗口
	 */
	private void closeWindow(){
		aManager.destroyActivity(PRIX + currentActivityId, true);
		try {
			final Field mActivitiesField = LocalActivityManager.class
					.getDeclaredField("mActivities");
			if (mActivitiesField != null) {
				mActivitiesField.setAccessible(true);
				@SuppressWarnings("unchecked")
				final Map<String, Object> mActivities = (Map<String, Object>) mActivitiesField
						.get(aManager);
				if (mActivities != null) {
					mActivities.remove(PRIX + currentActivityId);
				}
				final Field mActivityArrayField = LocalActivityManager.class
						.getDeclaredField("mActivityArray");
				if (mActivityArrayField != null) {
					mActivityArrayField.setAccessible(true);
					@SuppressWarnings("unchecked")
					final ArrayList<Object> mActivityArray = (ArrayList<Object>) mActivityArrayField
							.get(aManager);
					if (mActivityArray != null) {
						for (Object record : mActivityArray) {
							final Field idField = record.getClass()
									.getDeclaredField("id");
							if (idField != null) {
								idField.setAccessible(true);
								final String _id = (String) idField.get(record);
								if ((PRIX + currentActivityId).equals(_id)) {
									mActivityArray.remove(record);
									break;
								}
							}
						}
					}
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		openActivityIdList.remove(new Integer(currentActivityId));
		hideWindow();
	}
	/**
	 * 用于显示哪个activity窗口
	 */
	private void switchWindowView() {
		View view = null;
		Intent intent = null;
		switch (currentActivityId) {
		case ToolUtil.ACTIVITY_ID_MAIN:

			intent = new Intent(mContext,MainActivity.class);
			break;
		case ToolUtil.ACTIVITY_ID_1:

			intent = new Intent(mContext,FirstActivity.class);
			break;
		case ToolUtil.ACTIVITY_ID_2:

			intent = new Intent(mContext,TwoActivity.class);
			break;
		case ToolUtil.ACTIVITY_ID_3:

			intent = new Intent(mContext,ThreeActivity.class);
			break;
		case ToolUtil.ACTIVITY_ID_4:

//			intent = new Intent(mContext,MainActivity.class);
			break;
		case ToolUtil.ACTIVITY_ID_5:

//			intent = new Intent(mContext,MainActivity.class);
			break;

		case ToolUtil.ACTIVITY_ID_6:

//			intent = new Intent(mContext,MainActivity.class);
			break;

		default:
			break;
		}
		if(currentActivityId == ToolUtil.ACTIVITY_ID_MAIN){
			tvTitle.setText("");
		}
		if(intent != null){
			view = aManager.startActivity(PRIX+currentActivityId, intent).getDecorView();
			contentView.removeAllViews();
			contentView.addView(view);
			switchActivityForBottomBar();
		}
	}
	/**
	 * 底部状态栏所显示的activity
	 */
	private void switchActivityForBottomBar(){
		bottomBarView.removeAllViews();
		for(Integer activityId : openActivityIdList){
			int statusIconId = 0;
			switch (activityId) {
			case ToolUtil.ACTIVITY_ID_1:
				statusIconId = R.drawable.icon_im_at_status_bar;
				break;
			case ToolUtil.ACTIVITY_ID_2:
				statusIconId = R.drawable.icon_map_at_status;
				break;
			case ToolUtil.ACTIVITY_ID_3:
				statusIconId = R.drawable.icon_interest_at_status_bar;
				break;
			case ToolUtil.ACTIVITY_ID_4:
				statusIconId = R.drawable.icon_locus_at_status_bar;
				break;
			case ToolUtil.ACTIVITY_ID_5:
				statusIconId = R.drawable.icon_assistant_at_status_bar;
				break;
			case ToolUtil.ACTIVITY_ID_6:
				statusIconId = R.drawable.icon_setting_at_status_bar;
				break;

			default:
				break;
			}
			LinearLayout iconBg = (LinearLayout) lInflater.inflate(R.layout.bottom_bar_icon_detail, null);
			ImageView iconView = (ImageView) iconBg.findViewById(R.id.running_activity_icon);
			iconView.setTag(PRIX + activityId);
			iconView.setImageResource(statusIconId);
			//选中状态
			if(activityId == currentActivityId){
				iconView.setBackgroundResource(R.drawable.desk_top_bottom_icon_pressed);
				iconView.setOnClickListener(new OnClickListener() {
					
					@Override
					public void onClick(View v) {
						hideWindow();
					}
				});
				//设置标题
				if(currentActivityId != ToolUtil.ACTIVITY_ID_MAIN){
					tvTitle.setText(MainActivity.gridViewData[currentActivityId-1][0].toString());
				}else{
					tvTitle.setText("");
				}
			}else{
				iconView.setBackgroundDrawable(null);
				iconView.setOnClickListener(new OnClickListener() {
					
					@Override
					public void onClick(View v) {
						String tag = v.getTag().toString();
						currentActivityId = Integer.parseInt(tag.substring(tag.length() - 1),tag.length());
						switchWindowView();
					}
				});
			}
			bottomBarView.addView(iconBg);
		}
	}
	/**
	 * 隐藏窗口
	 */
	private void hideWindow(){
		currentActivityId = ToolUtil.ACTIVITY_ID_MAIN;
		switchWindowView();
	}
	private void openWindow(int activityId){
		if(!openActivityIdList.contains(new Integer(activityId))){
			openActivityIdList.add(activityId);
		}
		currentActivityId = activityId;
		switchWindowView();
	}
}
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/systemView"
  android:orientation="vertical"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  >
    <LinearLayout android:layout_width="fill_parent"
                  android:layout_height="wrap_content"
                  android:id="@+id/llTop">
         <RelativeLayout android:layout_width="fill_parent"
                         android:layout_height="wrap_content"
                         android:background="@drawable/desk_top_status_bar">
                      <ImageButton android:id="@+id/hide_window_btn"
                                   android:layout_width="wrap_content"
                                   android:layout_height="wrap_content"
                                   android:layout_marginLeft="10dip"
                                   android:layout_alignParentLeft="true"
                                   android:background="@drawable/hide_window_btn_selector"/>
                      <TextView android:id="@+id/title"
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:layout_centerInParent="true"
                                android:textSize="20sp"/>
                      <ImageButton android:id="@+id/close_window_btn"
                                   android:layout_width="wrap_content"
                                   android:layout_height="wrap_content"
                                   android:layout_marginRight="10dip"
                                   android:layout_alignParentRight="true"
                                   android:background="@drawable/close_window_btn_selector"/>
         </RelativeLayout>
    </LinearLayout>
    <LinearLayout android:id="@+id/content"
                  android:layout_width="fill_parent"
                  android:layout_height="fill_parent"
                  android:layout_above="@+id/bottomView"
                  android:layout_below="@+id/llTop">
    </LinearLayout>
    <LinearLayout android:id="@+id/bottomView"
                  android:layout_width="fill_parent"
                  android:layout_height="wrap_content"
                  android:background="@drawable/desk_top_status_bar"
                  android:layout_alignParentBottom="true">
          <HorizontalScrollView android:layout_width="fill_parent"
                                android:layout_height="wrap_content">
                      <LinearLayout android:id="@+id/bottom_status_bar"
                                    android:layout_width="fill_parent"
                                    android:layout_height="wrap_content"
                                    android:orientation="horizontal"
                                    android:gravity="center_vertical|left"
                                    android:scrollbars="horizontal">
                      </LinearLayout>
          </HorizontalScrollView>
    </LinearLayout>
</RelativeLayout>

 

 工具类:

package com.bar.test;

import java.util.HashMap;

import android.os.Handler;

public class ToolUtil {

	//定义每个activity的标识id
	public static final int ACTIVITY_ID_MAIN = 0;
	public static final int ACTIVITY_ID_1 = 1;
	public static final int ACTIVITY_ID_2 = 2;
	public static final int ACTIVITY_ID_3 = 3;
	public static final int ACTIVITY_ID_4 = 4;
	public static final int ACTIVITY_ID_5 = 5;
	public static final int ACTIVITY_ID_6 = 6;
	
	//保存handler实例
	public static HashMap<String, Handler> handlerMap = new HashMap<String, Handler>();
	public static void putHandler(String activityName,Handler handler){
		synchronized (handlerMap) {
			handlerMap.put(activityName, handler);
		}
	}
	public static Handler getHandler(String activityName){
		return handlerMap.get(activityName);
	}
}

 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
	android:layout_width="wrap_content"
	android:layout_height="wrap_content">
	
	<ImageView
    	android:layout_marginLeft="2dip"
    	android:layout_marginRight="2dip"
    	android:id="@+id/running_activity_icon"
    	android:layout_width="wrap_content"
    	android:layout_height="wrap_content"/>

</LinearLayout>

		
	
	

 

  • 大小: 18.9 KB
  • 大小: 9.9 KB
分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    ViewPager&amp;Fragment实现页面切换、底部导航栏

    通过以上步骤,我们可以成功地使用ViewPager和Fragment实现页面切换,同时结合BottomNavigationView来创建一个具有底部导航栏的Android应用。这种设计模式在现代Android应用中非常常见,因为它提供了一种直观的多...

    android fragment 使用以及嵌套使用 底部菜单和顶部菜单

    在Android应用开发中,Fragment是Android SDK提供的一种...通过以上知识点,开发者可以有效地在Android应用中使用Fragment构建底部菜单和顶部菜单,实现类似微信和QQ的分页菜单功能,为用户提供直观且易用的交互体验。

    android实现网易菜单栏效果

    通过以上步骤,你就可以在Android应用中实现一个类似网易新闻的菜单栏效果。这个过程中,你需要熟练掌握Fragment、ViewPager、Adapter等核心组件的使用,同时也要了解Android布局设计和数据绑定的基本原则。不断实践...

    使用Fragment实现底部菜单的切换

    在本案例中,我们将探讨如何使用`Fragment`来实现在底部菜单栏切换不同内容的功能,类似于QQ空间的应用。 首先,让我们理解`Fragment`的基本概念。`Fragment`是Activity的一部分,它可以有自己的视图层次结构、生命...

    Android的fragment导航栏

    在顶部导航栏中切换Fragment的方式与底部导航栏类似,但通常使用`androidx.appcompat.widget.Toolbar`作为视图容器,并通过`SupportActionBar`或`AppCompatActivity`的API进行操作。 **Fragment的生命周期** ...

    android+Fragment实现页面的局部跳转

    通过以上步骤,你就可以在Android平板电脑应用中实现类似管理系统的页面局部跳转功能了。Fragment的使用不仅提供了更好的用户体验,还能帮助你更好地组织代码,降低Activity的复杂性。同时,结合其他Android架构组件...

    类似微信qq的fragment加上tab的集合,包含了小红点

    总的来说,这个集合提供了一个完整的解决方案,帮助开发者快速实现类似微信和QQ那样的底部导航栏,包含小红点通知和沉浸式状态栏效果。这对于初学者理解Fragment的使用、Tab的布局设计,以及状态栏的自定义都有很大...

    Android项目源码仿淘宝安卓客户端本人亲测,无bug

    8. 材料设计组件:如底部导航栏、滑动抽屉菜单等,都是Material Design中的核心组件,需要正确实现其动画效果和交互行为。 9. 测试与调试:开发者亲测无bug,意味着进行了充分的单元测试、集成测试和性能测试,确保...

    Android 仿Mac的Dock

    【Android 仿Mac Dock】是Android平台上实现的一种模仿Mac电脑底部Dock栏效果的应用程序开发案例。Dock栏在Mac操作系统中是不可或缺的一部分,它提供了一种快速启动应用、切换任务和管理打开窗口的方式。在Android...

    fragment+fragmenttabHost仿新浪微博底部菜单栏

    在Android应用开发中,"fragment+fragmenttabHost仿新浪微博底部菜单栏"是一个常见的设计模式,用于构建具有多个可切换视图的应用界面,类似于微博应用中的底部导航栏。这个设计允许用户在不同功能区域之间平滑地...

    fragement实现的底部选项菜单

    在本项目中,“fragement实现的底部选项菜单”意味着利用`Fragment`来创建一个底部导航栏,这种导航栏通常包含几个图标按钮,点击每个按钮会切换不同的内容区域。 **Fragment的基本概念:** 1. **Fragment生命周期*...

    Fragment实现微信Tab主界面

    2. **底部导航栏实现**:通常使用BottomNavigationView或者自定义布局配合RadioButton等控件来实现。BottomNavigationView是Android Design Support Library的一部分,可以直接使用,它可以方便地创建符合Material ...

    android4.1 平板隐藏System Bar

    `FLAG_FULLSCREEN`将隐藏顶部的状态栏,而`FLAG_LAYOUT_NO_LIMITS`则允许应用布局扩展到整个屏幕,包括原本被System Bar占据的空间。 2. **利用Translucent Decor**: Android 4.1引入了透明装饰的概念,可以让...

    Android程序研发源码Android 仿Mac的Dock.zip

    "Android程序研发源码Android 仿Mac的Dock.zip" 提供了一种实现这一目标的源代码资源,帮助开发者学习如何在Android平台上创建类似Mac OS的底部Dock效果。这个项目不仅涉及到用户界面(UI)的设计,还涵盖了触摸事件...

    安卓Android宠物救助领养系统app毕业生设计

    开发者可能运用了Material Design设计规范,提供清晰、直观的用户界面,包括导航抽屉、底部导航栏和自定义控件等,确保用户能轻松浏览和操作应用。 3. **数据库与数据管理** 在宠物救助领养系统中,数据管理尤为...

    类似微信下面的菜单列子

    在IT行业中,设计一个类似微信页面下方的菜单是常见的任务,这种菜单通常被称为底部导航栏(Bottom Navigation Bar)或者底部菜单。它是一个用户界面(UI)元素,用于帮助用户在应用的主要功能之间轻松切换。微信...

    Android fragment

    "Android fragment底部范例"通常指的是在Android应用底部使用Fragment来实现类似TabHost的功能,即创建一个底部导航栏,用户可以通过点击不同的Tab切换不同的内容区域。这种设计模式在现代Android应用中非常常见,如...

    Android Fragment 全局的导航

    要实现全局导航,通常会使用底部导航栏(BottomNavigationView)或者抽屉导航(DrawerLayout)。这两种方式都可以方便地切换Fragment。 - **底部导航栏**:添加`BottomNavigationView`到布局文件,然后根据点击...

    高仿蘑菇街 主界面,fragment实现首页tab切换

    在这个项目中,开发者使用了Fragment来创建类似蘑菇街应用的主界面,实现了底部导航栏的Tab切换效果。以下是对这个主题的详细解释: 1. **Fragment**:Fragment是Android SDK中的一个组件,它代表了应用程序UI的一...

    渐变的fragment

    在“渐变的fragment”中,我们讨论的是如何创建一个类似于微信和QQ底部导航栏的交互效果,即当用户点击某个导航选项时,导航栏会呈现出平滑的渐变转动动画,提升用户体验。 首先,我们要理解Fragment的基本概念。...

Global site tag (gtag.js) - Google Analytics