Android 底部TabActivity(3)——ActivityGroup|顶部底部均有Tab标签之二

本文介绍了一种在Android应用中实现底部带图标的Tab栏的方法。通过使用GridView和自定义适配器来展示Tab项,包括主页、订单和钱包等选项。此方案适用于希望在页面底部添加美观Tab栏的应用。

http://blog.youkuaiyun.com/geofferysun/article/details/41852605

上一篇使用过时的ActivityGroup简单实现了顶部底部均有Tab标签的效果,是页面底部只有文字的样式,今天想完善一下效果,底部实现文字加图标的样式。

本文属于半成品,本来想着放弃的,想着先放博客吧,好歹也是一种思路,以后作参考用!追求完美效果的可以忽略本篇,我会在后续文章中实现更优的效果!

先看下效果图



首先是主页面MainActivity.java,这种方式其实不是真正意义上的Tab,只是实现了这样的效果。底部用了GridView实现三个切换开关,放到页面底部。

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. package sun.geoffery.tabtopbottom;  
  2.   
  3. import android.app.ActivityGroup;  
  4. import android.content.Intent;  
  5. import android.os.Bundle;  
  6. import android.os.Handler;  
  7. import android.os.Message;  
  8. import android.view.MotionEvent;  
  9. import android.view.View;  
  10. import android.view.View.OnTouchListener;  
  11. import android.view.Window;  
  12. import android.widget.AdapterView;  
  13. import android.widget.AdapterView.OnItemClickListener;  
  14. import android.widget.GridView;  
  15. import android.widget.LinearLayout;  
  16. import android.widget.LinearLayout.LayoutParams;  
  17.   
  18. /** 
  19.  * All rights Reserved, Designed By GeofferySun 
  20.  *  
  21.  * @Title: MainActivity.java 
  22.  * @Package sun.geoffery.tabtopbottom 
  23.  * @Description:上下都有Tab的界面 
  24.  * @author: GeofferySun 
  25.  * @date: 2014-12-9 下午3:41:04 
  26.  * @version V1.0 
  27.  */  
  28. public class MainActivity extends ActivityGroup {  
  29.       
  30.     public static Class mTabClassAry[]= {   
  31.         HomeActivity.class,  
  32.         OrderActivity.class,  
  33.         WalletActivity.class};  
  34.     public static String mTabTxtAry[] = {"主页""订单""钱包"};  
  35.     public static int mTabImgAry[] = {  
  36.         R.drawable.ic_launcher,  
  37.         R.drawable.ic_launcher,  
  38.         R.drawable.ic_launcher};  
  39.       
  40.     private int mCurTab;  
  41.     private final static int FLAG_EVENT = 0X100;  
  42.     private GridView mTabGridView;  
  43.     private GridViewAdapter mTabAdapter;  
  44.     private LinearLayout mContainer; // 装载sub Activity的容器  
  45.   
  46.     public void onCreate(Bundle savedInstanceState) {  
  47.         super.onCreate(savedInstanceState);  
  48.           
  49.         requestWindowFeature(Window.FEATURE_NO_TITLE);  
  50.         setContentView(R.layout.activity_main);  
  51.   
  52.         initView();  
  53.     }  
  54.   
  55.     private void initView() {  
  56.         mContainer = (LinearLayout) findViewById(R.id.Container);  
  57.         mTabGridView = (GridView) findViewById(R.id.bottom_tab);  
  58.         // 禁止GridView滚动  
  59.         mTabGridView.setOnTouchListener(new OnTouchListener() {  
  60.             @Override  
  61.             public boolean onTouch(View v, MotionEvent event) {  
  62.                 return MotionEvent.ACTION_MOVE == event.getAction() ? true : false;  
  63.             }  
  64.         });  
  65.   
  66.         mTabAdapter = new GridViewAdapter(this, mTabImgAry, mTabTxtAry);  
  67.         mTabGridView.setAdapter(mTabAdapter);  
  68.         mTabGridView.setOnItemClickListener(new OnItemClickListener() {  
  69.   
  70.             @Override  
  71.             public void onItemClick(AdapterView<?> parent, View view, int position, long id) {  
  72.                 switchActivity(position);  
  73.             }  
  74.         });  
  75.   
  76.         mCurTab = -1;  
  77.         mHandler.sendEmptyMessageDelayed(FLAG_EVENT, 100);  
  78.     }  
  79.       
  80.     Handler mHandler = new Handler() {  
  81.   
  82.         @Override  
  83.         public void handleMessage(Message msg) {  
  84.             switch (msg.what) {  
  85.             case FLAG_EVENT:  
  86.                 switchActivity(0);  
  87.                 break;  
  88.             }  
  89.         }  
  90.   
  91.     };  
  92.   
  93.     private void switchActivity(int index) {  
  94.         if (index < 0 || index >= mTabClassAry.length) {  
  95.             return;  
  96.         }  
  97.   
  98.         if (mCurTab == index) {  
  99.             return;  
  100.         }  
  101.   
  102.         if (mCurTab != -1) {  
  103.             mTabGridView.getChildAt(mCurTab).setBackgroundDrawable(null);  
  104.         }  
  105.           
  106. //      mTabGridView.getChildAt(index).setBackgroundResource(R.drawable.tab_item_d);  
  107.           
  108.         mCurTab = index;  
  109.   
  110.         mContainer.removeAllViews();  
  111.         Intent intent = new Intent(this, mTabClassAry[index]);  
  112.   
  113.         String name = index + " subactivity";  
  114.         // Activity 转为 View  
  115.         Window subActivity = getLocalActivityManager().startActivity(name, intent);  
  116.   
  117.         View child = subActivity.getDecorView();  
  118.         LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);  
  119.         child.setLayoutParams(params);  
  120.         // 容器添加View  
  121.         mContainer.addView(child);  
  122.     }  
  123. }  

主页面对应的页面文件

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="fill_parent"  
  4.     android:layout_height="fill_parent" >  
  5.   
  6.     <LinearLayout  
  7.         android:id="@+id/Container"  
  8.         android:layout_width="fill_parent"  
  9.         android:layout_height="fill_parent"  
  10.         android:orientation="horizontal"  
  11.         android:layout_above="@+id/bottom_tab" />  
  12.   
  13.     <GridView  
  14.         android:id="@+id/bottom_tab"  
  15.         android:layout_width="fill_parent"  
  16.         android:layout_height="wrap_content"  
  17.         android:layout_alignParentBottom="true"  
  18.         android:background="#404040"  
  19.         android:listSelector="@android:color/transparent"  
  20.         android:numColumns="3"  
  21.         android:padding="2dp" />  
  22.   
  23. </RelativeLayout>  

底部的GridView需要一个适配器GridViewAdapter.java,Item就是上边一个图标、下边一个文字。
[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. </pre><pre name="code" class="java">package sun.geoffery.tabtopbottom;  
  2.   
  3. import android.content.Context;  
  4. import android.view.LayoutInflater;  
  5. import android.view.View;  
  6. import android.view.ViewGroup;  
  7. import android.widget.BaseAdapter;  
  8. import android.widget.ImageView;  
  9. import android.widget.TextView;  
  10.   
  11. public class GridViewAdapter extends BaseAdapter {  
  12.     Context mContext;  
  13.     LayoutInflater mLayoutInflater;  
  14.     int mImageviewArray[];  
  15.     String mTextViewArray[];  
  16.   
  17.     public GridViewAdapter(Context context, int imageViewArray[], String textViewArray[]) {  
  18.   
  19.         mContext = context;  
  20.         mLayoutInflater = LayoutInflater.from(context);  
  21.         mImageviewArray = imageViewArray;  
  22.         mTextViewArray = textViewArray;  
  23.     }  
  24.   
  25.     @Override  
  26.     public Object getItem(int position) {  
  27.         return position;  
  28.     }  
  29.   
  30.     @Override  
  31.     public long getItemId(int position) {  
  32.         return position;  
  33.     }  
  34.   
  35.     @Override  
  36.     public View getView(int position, View convertView, ViewGroup parent) {  
  37.   
  38.         if (convertView == null) {  
  39.             convertView = mLayoutInflater.inflate(R.layout.tab_item_view, null);  
  40.         }  
  41.   
  42.         ImageView imageView = (ImageView) convertView  
  43.                 .findViewById(R.id.imageview);  
  44.         imageView.setBackgroundResource(mImageviewArray[position]);  
  45.   
  46.         TextView textView = (TextView) convertView.findViewById(R.id.textview);  
  47.         textView.setText(mTextViewArray[position]);  
  48.   
  49.         return convertView;  
  50.   
  51.     }  
  52.   
  53.     @Override  
  54.     public int getCount() {  
  55.         return mImageviewArray.length;  
  56.     }  
  57.   
  58. }  
每个Item对应的布局文件tab_item_view.xml如下
[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="wrap_content"  
  4.     android:layout_height="wrap_content"  
  5.     android:gravity="center"  
  6.     android:orientation="vertical" >  
  7.   
  8.     <ImageView  
  9.         android:id="@+id/imageview"  
  10.         android:layout_width="wrap_content"  
  11.         android:layout_height="wrap_content"  
  12.         android:focusable="false"  
  13.         android:padding="3dp" >  
  14.     </ImageView>  
  15.   
  16.     <TextView  
  17.         android:id="@+id/textview"  
  18.         style="@style/tab_item_text_style"  
  19.         android:layout_width="wrap_content"  
  20.         android:layout_height="wrap_content" >  
  21.     </TextView>  
  22.   
  23. </LinearLayout>  
至于其他页面还是 上一篇文章 中的代码,没有改动。

没看明白的直接去查看源码吧!


【完美复现】面向配电网韧性提升的移动储能预布局与动态调度策略【IEEE33节点】(Matlab代码实现)内容概要:本文介绍了基于IEEE33节点的配电网韧性提升方法,重点研究了移动储能系统的预布局与动态调度策略。通过Matlab代码实现,提出了一种结合预配置动态调度的两阶段优化模型,旨在应对电网故障或极端事件时快速恢复供电能力。文中采用了多种智能优化算法(如PSO、MPSO、TACPSO、SOA、GA等)进行对比分析,验证所提策略的有效性优越性。研究不仅关注移动储能单元的初始部署位置,还深入探讨其在故障发生后的动态路径规划与电力支援过程,从而全面提升配电网的韧性水平。; 适合人群:具备电力系统基础知识Matlab编程能力的研究生、科研人员及从事智能电网、能源系统优化等相关领域的工程技术人员。; 使用场景及目标:①用于科研复现,特别是IEEE顶刊或SCI一区论文中关于配电网韧性、应急电源调度的研究;②支撑电力系统在灾害或故障条件下的恢复力优化设计,提升实际电网应对突发事件的能力;③为移动储能系统在智能配电网中的应用提供理论依据技术支持。; 阅读建议:建议读者结合提供的Matlab代码逐模块分析,重点关注目标函数建模、约束条件设置以及智能算法的实现细节。同时推荐参考文中提及的MPS预配置与动态调度上下两部分,系统掌握完整的技术路线,并可通过替换不同算法或测试系统进一步拓展研究。
先看效果: https://pan.quark.cn/s/3756295eddc9 在C#软件开发过程中,DateTimePicker组件被视为一种常见且关键的构成部分,它为用户提供了图形化的途径来选取日期与时间。 此类控件多应用于需要用户输入日期或时间数据的场景,例如日程管理、订单管理或时间记录等情境。 针对这一主题,我们将细致研究DateTimePicker的操作方法、具备的功能以及相关的C#编程理念。 DateTimePicker控件是由.NET Framework所支持的一种界面组件,适用于在Windows Forms应用程序中部署。 在构建阶段,程序员能够通过调整属性来设定其视觉形态及运作模式,诸如设定日期的显示格式、是否展现时间选项、预设的初始值等。 在执行阶段,用户能够通过点击日历图标的下拉列表来选定日期,或是在文本区域直接键入日期信息,随后按下Tab键或回车键以确认所选定的内容。 在C#语言中,DateTime结构是处理日期与时间数据的核心,而DateTimePicker控件的值则表现为DateTime类型的实例。 用户能够借助`Value`属性来读取或设定用户所选择的日期与时间。 例如,以下代码片段展示了如何为DateTimePicker设定初始的日期值:```csharpDateTimePicker dateTimePicker = new DateTimePicker();dateTimePicker.Value = DateTime.Now;```再者,DateTimePicker控件还内置了事件响应机制,比如`ValueChanged`事件,当用户修改日期或时间时会自动激活。 开发者可以注册该事件以执行特定的功能,例如进行输入验证或更新关联的数据:``...
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值