Android 底部导航 UI框架

此版本在“一个不错的UI框架”基础上修改了首次启动底部导航没有选中Tab的情况

运行效果图如下:

Screenshot_2015-03-18-16-09-20Screenshot_2015-03-18-16-09-38Screenshot_2015-03-18-16-09-47Screenshot_2015-03-18-16-10-30

1、TabView.java 这里修改的是mState=-1

/********************************************************************************* Copyright (c) Weaver Info Tech Co. Ltd** TabView** app.ui.widget.TabView.java* TODO: File description or class description.** @author: Administrator* @since:  2014-4-22* @version: 1.0.0** @changeLogs:*     1.0.0: First created this class.*******************************************************************************/
package app.ui.widget;import mobi.kuaidian.qunakao.R;
import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.LinearLayout;/*** @author Administrator**/
public class TabView extends LinearLayout implements OnClickListener {private OnTabChangeListener mOnTabChangedListener;private int mState = -1;private final Button mStateButton1;private final Button mStateButton2;private final Button mStateButton3;private final Button mStateButton4;public TabView(Context context) {this(context, null);}public TabView(Context context, AttributeSet attrs) {this(context, attrs, 0);}/*** @param context* @param attrs* @param defStyle*/public TabView(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);inflate(context, R.layout.view_tab, this);mStateButton1 = (Button) findViewById(R.id.button_state1);mStateButton2 = (Button) findViewById(R.id.button_state2);mStateButton3 = (Button) findViewById(R.id.button_state3);mStateButton4 = (Button) findViewById(R.id.button_state4);mStateButton1.setOnClickListener(this);mStateButton2.setOnClickListener(this);mStateButton3.setOnClickListener(this);mStateButton4.setOnClickListener(this);}public void setOnTabChangeListener(OnTabChangeListener listener) {mOnTabChangedListener = listener;}public void setCurrentTab(int index) {switchState(index);}private void switchState(int state) {if (mState == state) {return;} // else continue
mState = state;mStateButton1.setSelected(false);mStateButton2.setSelected(false);mStateButton3.setSelected(false);mStateButton4.setSelected(false);Object tag = null;switch (mState) {case 0:mStateButton1.setSelected(true);tag = mStateButton1.getTag();break;case 1:mStateButton2.setSelected(true);tag = mStateButton2.getTag();break;case 2:mStateButton3.setSelected(true);tag = mStateButton3.getTag();break;case 3:mStateButton4.setSelected(true);tag = mStateButton4.getTag();break;default:break;}if (mOnTabChangedListener != null) {if (tag != null && mOnTabChangedListener != null) {mOnTabChangedListener.onTabChange(tag.toString());} else {mOnTabChangedListener.onTabChange(null);}} // else ignored
    }/* (non-Javadoc)* @see android.view.View.OnClickListener#onClick(android.view.View)*/@Overridepublic void onClick(View v) {// TODO Auto-generated method stubswitch (v.getId()) {case R.id.button_state1:switchState(0);break;case R.id.button_state2:switchState(1);break;case R.id.button_state3:switchState(2);break;case R.id.button_state4:switchState(3);break;default:break;}}public static interface OnTabChangeListener {public void onTabChange(String tag);}
}

 

2、StartActivity.java 将mTabView.setCurrentTab(0); 移动到setupViews();之后

package app.ui.activity;import mobi.kuaidian.qunakao.R;import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.util.Log;
import android.view.KeyEvent;
import android.widget.TextView;import app.ui.FragmentCallback;
import app.ui.fragment.ProfileFragment;
import app.ui.fragment.ServiceFragment;
import app.ui.fragment.SessionFragment;
import app.ui.fragment.SettingFragment;
import app.ui.widget.TabView;
import app.ui.widget.TabView.OnTabChangeListener;
import app.util.DialogUtils;
import app.util.FragmentUtils;public class StartActivity extends FragmentActivity implements OnTabChangeListener, FragmentCallback {private FragmentManager mFragmentManager;private Fragment mCurrentFragment;private TabView mTabView;private TextView mTitleTextView;/** 上一次的状态 */private int mPreviousTabIndex = 1;/** 当前状态 */private int mCurrentTabIndex = 1;/** 再按一次退出程序*/private long exitTime = 0;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);mFragmentManager = getSupportFragmentManager();mCurrentTabIndex = 1;mPreviousTabIndex = 1;setupViews();mTabView.setCurrentTab(0);}private void setupViews(){setContentView(R.layout.activity_start);mTitleTextView = (TextView) findViewById(R.id.text_title);mTabView = (TabView) findViewById(R.id.view_tab);mTabView.setOnTabChangeListener(this);
//        mTabView.setCurrentTab(mCurrentTabIndex);mCurrentFragment = new ServiceFragment();FragmentUtils.replaceFragment(mFragmentManager, R.id.layout_content,ServiceFragment.class, null, false);}/* (non-Javadoc)* @see android.support.v4.app.FragmentActivity#onActivityResult(int, int, android.content.Intent)*/@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);switch (requestCode) {/*case BaseActivity.REQUEST_OK_LOGIN:if (resultCode == RESULT_OK) {ApplicationUtils.showToast(this, R.string.text_loginsuccess);mTitleTextView.setText(R.string.text_tab_profile);final ProfileFragment profileFragment =(ProfileFragment) mFragmentManager.findFragmentByTag(ProfileFragment.class.getSimpleName());if (profileFragment != null) {Log.d(TAG, "ProfileFragment is refreshing.");profileFragment.refreshViews();} else {Log.e(TAG, "ProfileFragment is null.");}} else {// 返回原来的页面mTabView.setCurrentTab(mPreviousTabIndex);ApplicationUtils.showToast(this, R.string.toast_login_failed);}break;default:break;*/}}/* (non-Javadoc)* @see app.ui.FragmentCallback#onFragmentCallback(android.support.v4.app.Fragment, int, android.os.Bundle)*/@Overridepublic void onFragmentCallback(Fragment fragment, int id, Bundle args) {mTabView.setCurrentTab(1);}/* (non-Javadoc)* @see app.ui.widget.TabView.OnTabChangeListener#onTabChange(java.lang.String)*/@Overridepublic void onTabChange(String tag) {Log.e("tag", "onTabchange tag:" + tag);if (tag != null) {if (tag.equals("message")) {mPreviousTabIndex = mCurrentTabIndex;mCurrentTabIndex = 0;mTitleTextView.setText(R.string.text_tab_message);replaceFragment(SessionFragment.class);// 检查,如果没有登录则跳转到登录界面/*  final UserConfigManager manager = UserConfigManager.getInstance();if (manager.getId() <= 0) {startActivityForResult(new Intent(this, LoginActivity.class),BaseActivity.REQUEST_OK_LOGIN);}*/}else if ("service".equals(tag)) {mPreviousTabIndex = mCurrentTabIndex;mCurrentTabIndex = 1;mTitleTextView.setText(R.string.text_tab_service);replaceFragment(ServiceFragment.class);} else if (tag.equals("personal")) {mPreviousTabIndex = mCurrentTabIndex;mCurrentTabIndex = 2;mTitleTextView.setText(R.string.text_tab_profile);replaceFragment(ProfileFragment.class);// 检查,如果没有登录则跳转到登录界面/*  final UserConfigManager manager = UserConfigManager.getInstance();if (manager.getId() <= 0) {startActivityForResult(new Intent(this, LoginActivity.class),BaseActivity.REQUEST_OK_LOGIN);}*/} else if (tag.equals("settings")) {mPreviousTabIndex = mCurrentTabIndex;mCurrentTabIndex = 3;mTitleTextView.setText(R.string.text_tab_setting);replaceFragment(SettingFragment.class);// 检查,如果没有登录则跳转到登录界面/* final UserConfigManager manager = UserConfigManager.getInstance();if (manager.getId() <= 0) {startActivityForResult(new Intent(this, LoginActivity.class),BaseActivity.REQUEST_OK_LOGIN);}*/}}}private void replaceFragment(Class<? extends Fragment> newFragment) {mCurrentFragment = FragmentUtils.switchFragment(mFragmentManager,R.id.layout_content, mCurrentFragment,newFragment, null, false);}@Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN) {if ((System.currentTimeMillis() - exitTime) > 2000) {DialogUtils.showToast(this, "再按一次退出程序");exitTime = System.currentTimeMillis();} else {finish();System.exit(0);}return true;}return super.onKeyDown(keyCode, event);}
}

 

 

 

下载地址:http://download.csdn.net/detail/zhanyujiez/8512197

转载于:https://www.cnblogs.com/zhangyulogin/p/4347641.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/406173.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux编译源码问题 环境变量的设置

本来想安装一个gkrellm-2.3.2&#xff0c;解压进去后,执行./configure&#xff0c;出现这个情况。如图1大概的意思是gtk-2.0未安装吧。然后我下载了一个gtk-2.0&#xff0c;执行./configure&#xff0c;出现这种情况。如图2大概的意思是说&#xff0c;这glib-2.0,atk,pango,cai…

手把手教你封装一个ant design的审核框组件

我是歌谣 放弃很容易 但是坚持一定很酷 微信公众号关注前端小歌谣学习前端知识 这边先上代码 然后我们逐个解释 import React, { Component, Fragment } from react; import { Modal, Row, Form, Col, Radio, Tag, Input, message } from antd;/*** 弹框 审核* param {String…

sgu 240 Runaway (spfa)

题意&#xff1a;N点M边的无向图&#xff0c;边上有线性不下降的温度&#xff0c;给固定入口S&#xff0c;有E个出口。逃出去&#xff0c;使最大承受温度最小。输出该温度&#xff0c;若该温度超过H&#xff0c;输出-1。 羞涩的题意 显然N*H的复杂度dp[n][h]表示到达n最大温度为…

深入react技术栈(1):React简介

我是歌谣 放弃很容易 但是坚持一定很酷 微信公众号关注前端小歌谣获取前端知识 前言 专注视图层 Virtual DOM 真实页面对应一个DOM树.在传统页面的开发模式中 每次更新页面都需要手动更新 DOM操作非常昂贵。我们都知道在前端开发中&#xff0c;性能消耗最大的就是DOM操作 而且这…

Capistrano3 与 Mina

链接&#xff1a; http://blog.naixspirit.com/2014/12/14/cap_and_mina/ Capistrano 0. 服务器目录结构 首先来看看经过多次部署后, 服务器会生成一个这样的目录结构 ├── current -> /var/www/your_app/releases/20141201042659 ├── releases │ ├── 2014120103…

金山毒霸的云查杀很牛X

金山毒霸的云查杀很牛X无论安装包大小、资源占用率、查杀率、还是新病毒反应速度&#xff08;秒级对比&#xff09;&#xff0c;牛X!听说&#xff0c;金山毒霸2011-增加了免费服务时间&#xff01;以后是否也会全免费&#xff1f;既然免费了&#xff0c;就试试吧&#xff01;下…

python中空位符_python中空位符_Python之路 - Python - 字符编码 - 期权论坛

字符编码python解释器在加载 .py 文件中的代码时&#xff0c;会对内容进行编码(默认ascill)ASCII(American Standard Code for Information Interchange&#xff0c;美国标准信息交换代码)是基于拉丁字母的一套电脑编码系统&#xff0c;主要用于显示现代英语和其他西欧语言&…

python爬虫爬汽车图片_Python快速爬取车标网图片,以后不要说这什么车你不认识了!...

知识不分边界......人&#xff0c;为什么要读书&#xff1f;举个例子:当看到天边飞鸟&#xff0c;你会说&#xff1a;“落霞与孤鹜齐飞&#xff0c;秋水共长天一色。”而不是&#xff1a;“卧靠&#xff0c;好多鸟。”;当你失恋时你低吟浅唱道&#xff1a;“人生若只如初见&…

电化学仿真的基础知识笔记

1 概述 电化学反应是一种特殊的化学反应&#xff0c;其能量转移形式为化学能和电能之间互相转换。根据能量转换方向&#xff0c;可分为两类&#xff1a; 原电池&#xff08;Galvanic cells&#xff09;&#xff1a;将化学能转化为电能&#xff0c;对外放电电解槽&#xff08;…

mysql以秒为单位限制资源_MYSQL中限制资源的使用

今天看到手册&#xff0c;不小心看到了这里&#xff0c;自己做了几个例子。从MYSQL4.x开始&#xff0c;MYSQL就增加了以每个用户为基础&#xff0c;限制MYSQL服务器的资源利用。自己查看MYSQL.USER 表就会发现里面最后几个字段&#xff1a;mysql> select version();--------…

漫谈经典排序算法:一、从简单选择排序到堆排序的深度解析

From: http://blog.csdn.net/touch_2011/article/details/6767673 1、序言 这是《漫谈经典排序算法系列》第一篇&#xff0c;该篇从最简单的选择排序算法谈起&#xff0c;由浅入深的详细解析两种选择排序算法的过程及性能比较。逐步揭露选择排序的本质及其基本思想。 各种排序算…

React开发(168):...dva调用不成功的原因

注意三对三对应关系 否则无法调用成功

深入react技术栈(2):JSX语法

JSX的由来 DOM元素 组件元素 JSX基本语法 XML基本语法 元素类型 、我们讲到两种不同的元素:DOM元素和组件元素 在JSX里面有对应 注释 元素属性 Boolean属性 展开属性 自定义属性 javascript属性表达式 属性值使用表达式 用{}表示 HTML转义 文章参考深入react学习技术栈