- 浏览: 88554 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
yandol:
ClsUtils 是个什么库的函数啊,看起来挺好用的,nj.c ...
android bluetooth -
It-eyetor:
请问android学习的重点知识有哪些?
android 应用 体会 -
不夜的星辰:
caik123 写道不夜的星辰 写道caik123 写道有个b ...
android dialog 点击不消失 -
caik123:
不夜的星辰 写道caik123 写道有个bug,不知道你发现没 ...
android dialog 点击不消失 -
不夜的星辰:
caik123 写道有个bug,不知道你发现没有。当你首先输入 ...
android dialog 点击不消失
一个在项目中运用的类似电脑底部状态栏的功能实现,该功能类似广泛使用的底部切换标签,但又有明显的不同,唯一相同点就是使用继承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>
发表评论
文章已被作者锁定,不允许评论。
相关推荐
通过以上步骤,我们可以成功地使用ViewPager和Fragment实现页面切换,同时结合BottomNavigationView来创建一个具有底部导航栏的Android应用。这种设计模式在现代Android应用中非常常见,因为它提供了一种直观的多...
在Android应用开发中,Fragment是Android SDK提供的一种...通过以上知识点,开发者可以有效地在Android应用中使用Fragment构建底部菜单和顶部菜单,实现类似微信和QQ的分页菜单功能,为用户提供直观且易用的交互体验。
通过以上步骤,你就可以在Android应用中实现一个类似网易新闻的菜单栏效果。这个过程中,你需要熟练掌握Fragment、ViewPager、Adapter等核心组件的使用,同时也要了解Android布局设计和数据绑定的基本原则。不断实践...
在本案例中,我们将探讨如何使用`Fragment`来实现在底部菜单栏切换不同内容的功能,类似于QQ空间的应用。 首先,让我们理解`Fragment`的基本概念。`Fragment`是Activity的一部分,它可以有自己的视图层次结构、生命...
在顶部导航栏中切换Fragment的方式与底部导航栏类似,但通常使用`androidx.appcompat.widget.Toolbar`作为视图容器,并通过`SupportActionBar`或`AppCompatActivity`的API进行操作。 **Fragment的生命周期** ...
通过以上步骤,你就可以在Android平板电脑应用中实现类似管理系统的页面局部跳转功能了。Fragment的使用不仅提供了更好的用户体验,还能帮助你更好地组织代码,降低Activity的复杂性。同时,结合其他Android架构组件...
总的来说,这个集合提供了一个完整的解决方案,帮助开发者快速实现类似微信和QQ那样的底部导航栏,包含小红点通知和沉浸式状态栏效果。这对于初学者理解Fragment的使用、Tab的布局设计,以及状态栏的自定义都有很大...
8. 材料设计组件:如底部导航栏、滑动抽屉菜单等,都是Material Design中的核心组件,需要正确实现其动画效果和交互行为。 9. 测试与调试:开发者亲测无bug,意味着进行了充分的单元测试、集成测试和性能测试,确保...
【Android 仿Mac Dock】是Android平台上实现的一种模仿Mac电脑底部Dock栏效果的应用程序开发案例。Dock栏在Mac操作系统中是不可或缺的一部分,它提供了一种快速启动应用、切换任务和管理打开窗口的方式。在Android...
在Android应用开发中,"fragment+fragmenttabHost仿新浪微博底部菜单栏"是一个常见的设计模式,用于构建具有多个可切换视图的应用界面,类似于微博应用中的底部导航栏。这个设计允许用户在不同功能区域之间平滑地...
在本项目中,“fragement实现的底部选项菜单”意味着利用`Fragment`来创建一个底部导航栏,这种导航栏通常包含几个图标按钮,点击每个按钮会切换不同的内容区域。 **Fragment的基本概念:** 1. **Fragment生命周期*...
2. **底部导航栏实现**:通常使用BottomNavigationView或者自定义布局配合RadioButton等控件来实现。BottomNavigationView是Android Design Support Library的一部分,可以直接使用,它可以方便地创建符合Material ...
`FLAG_FULLSCREEN`将隐藏顶部的状态栏,而`FLAG_LAYOUT_NO_LIMITS`则允许应用布局扩展到整个屏幕,包括原本被System Bar占据的空间。 2. **利用Translucent Decor**: Android 4.1引入了透明装饰的概念,可以让...
"Android程序研发源码Android 仿Mac的Dock.zip" 提供了一种实现这一目标的源代码资源,帮助开发者学习如何在Android平台上创建类似Mac OS的底部Dock效果。这个项目不仅涉及到用户界面(UI)的设计,还涵盖了触摸事件...
开发者可能运用了Material Design设计规范,提供清晰、直观的用户界面,包括导航抽屉、底部导航栏和自定义控件等,确保用户能轻松浏览和操作应用。 3. **数据库与数据管理** 在宠物救助领养系统中,数据管理尤为...
在IT行业中,设计一个类似微信页面下方的菜单是常见的任务,这种菜单通常被称为底部导航栏(Bottom Navigation Bar)或者底部菜单。它是一个用户界面(UI)元素,用于帮助用户在应用的主要功能之间轻松切换。微信...
"Android fragment底部范例"通常指的是在Android应用底部使用Fragment来实现类似TabHost的功能,即创建一个底部导航栏,用户可以通过点击不同的Tab切换不同的内容区域。这种设计模式在现代Android应用中非常常见,如...
要实现全局导航,通常会使用底部导航栏(BottomNavigationView)或者抽屉导航(DrawerLayout)。这两种方式都可以方便地切换Fragment。 - **底部导航栏**:添加`BottomNavigationView`到布局文件,然后根据点击...
在这个项目中,开发者使用了Fragment来创建类似蘑菇街应用的主界面,实现了底部导航栏的Tab切换效果。以下是对这个主题的详细解释: 1. **Fragment**:Fragment是Android SDK中的一个组件,它代表了应用程序UI的一...
在“渐变的fragment”中,我们讨论的是如何创建一个类似于微信和QQ底部导航栏的交互效果,即当用户点击某个导航选项时,导航栏会呈现出平滑的渐变转动动画,提升用户体验。 首先,我们要理解Fragment的基本概念。...