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

运行效果图如下:

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

Android 底部导航 UI框架相关推荐

  1. Android底部导航框架(解决fragment界面重现,getActivity空指针)

    android底部导航框架可以说是目前最常用的框架,看似非常简单的框架如果搭建不好后期会出现各种意想不到问题: 比如我前面两篇写的每次点击底部图标fragment之间会来回替换,这样肯定不实用:这个d ...

  2. Android底部导航栏最常用的两种写法

    先来看看底部导航栏的效果 Android 底部导航栏有很多种写法,例如: RadioGroup , Tablayout, TabHost  , LinearLayout + ImageView + T ...

  3. Android底部导航栏+消息提醒

    Android底部导航栏+消息提醒 最近想在网上找一些Android底部导航栏切换并能提供消息提醒的案例,虽然有很多案例但都不是我想要的.我就开始自己瞎研究了,废话不多说了,直接上代码. 1.先创建一 ...

  4. Android组件及UI框架大全

    开通黄钻 Android组件及UI框架大全 Android 是目前最流行的移动操作系统(还需要加之一吗?). 随着新版本的不断发布, Android的功能也日益强大, 涌现了很多流行的应用程序, 也催 ...

  5. android 固定底部导航,如何设置android底部导航栏位置固定在android

    请帮我设置底部导航栏位置固定在底部, ,因为我在输入editText字段时遇到问题,底部导航栏向上移动并覆盖其他领域如何设置android底部导航栏位置固定在android 代码: xmlns:and ...

  6. VS 2015 开发Android底部导航条----[实例代码,多图]

    1.废话背景介绍  在Build 2016开发者大会上,微软宣布,Xamarin将被整合进所有版本的Visual Studio之中. 这也就是说,Xamarin将免费提供给所有购买了Visual St ...

  7. android fragment 底部菜单栏,一句话搞定Android底部导航栏,一键绑定Fragment、ViewPager...

    现在大多数App都会用到底部导航栏,比如常见的聊天工具QQ.微信.购物App等等,有了底部导航栏,用户可以随时切换界面,查看不同的内容.它的实现方式也很多,以前大多使用TabHost来实现,但是现在我 ...

  8. 转载:Android底部导航栏,三种风格和实现

    原文出处 标题:Android底部导航栏,三种风格和实现 作者:阿飞__ 原文链接:Android底部导航栏,三种风格和实现_阿飞__的博客-CSDN博客_android导航栏 一.效果图展示 如果动 ...

  9. Android底部导航栏的三种风格实现

    一.效果图展示 如果动图没有动的话,也可以看下面这个静态图 以下挨个分析每个的实现,这里只做简单的效果展示,大家可以基于目前代码做二次开发. 二.BottomNavigationView 这是 Goo ...

最新文章

  1. 微信小程序开发-入门基础
  2. jquery插件之选项卡
  3. 计算机在管理会计应用中的作用,计算机在现代管理会计中的应用(共3736字).doc...
  4. python修改文件后缀_python实现遍历文件夹修改文件后缀
  5. nginx限流健康检查
  6. C++设计模式之二 AbstractFactory模式
  7. CAN笔记(6) CAN协议(一)
  8. linux下自己安装软件做成命令
  9. html验证码功能如何实现原理,基于JS实现一个随机生成验证码功能
  10. zabbix详解(十三)——zabbix微信报警实战
  11. Amazon Alexa 入门实验
  12. HTML5游戏引擎(十四)-颜色效果——混合模式 滤镜 颜色矩阵滤镜 矩阵数据说明
  13. zuul网关的过滤器类型
  14. 【智能优化算法】广义邻域搜索算法(综述)
  15. pythonppt生成替换_python生成ppt的方法
  16. 包机制、访问修饰符、Jar包 java初学 面向对象五
  17. MYSQL/ORACLE/SQL SERVER的默认端口号
  18. 【2017.11.30】3. Longest Substring Without Repeating Characters-最长字串不重复字符
  19. 以前端角度出发做好SEO需要考虑什么?
  20. 元气森林,真能在中国再造一个“可口可乐”吗?

热门文章

  1. 1515 跳 - Wikioi
  2. Java学习进阶—高级编程
  3. Free SQLSever 2008的书
  4. 12-1 12 防盗链 访问控制 php解析 代理
  5. Mysql学习总结(12)——21分钟Mysql入门教程
  6. 51单片机之音乐代码
  7. MAC下面maven如何设置让其实下载源码
  8. Tip:强制执行exchange DAG节点之间的数据库副本移动
  9. CAS去掉HTTPS认证
  10. myeclipse8.5安装反编译工具