Android 底部导航 UI框架
此版本在“一个不错的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框架相关推荐
- Android底部导航框架(解决fragment界面重现,getActivity空指针)
android底部导航框架可以说是目前最常用的框架,看似非常简单的框架如果搭建不好后期会出现各种意想不到问题: 比如我前面两篇写的每次点击底部图标fragment之间会来回替换,这样肯定不实用:这个d ...
- Android底部导航栏最常用的两种写法
先来看看底部导航栏的效果 Android 底部导航栏有很多种写法,例如: RadioGroup , Tablayout, TabHost , LinearLayout + ImageView + T ...
- Android底部导航栏+消息提醒
Android底部导航栏+消息提醒 最近想在网上找一些Android底部导航栏切换并能提供消息提醒的案例,虽然有很多案例但都不是我想要的.我就开始自己瞎研究了,废话不多说了,直接上代码. 1.先创建一 ...
- Android组件及UI框架大全
开通黄钻 Android组件及UI框架大全 Android 是目前最流行的移动操作系统(还需要加之一吗?). 随着新版本的不断发布, Android的功能也日益强大, 涌现了很多流行的应用程序, 也催 ...
- android 固定底部导航,如何设置android底部导航栏位置固定在android
请帮我设置底部导航栏位置固定在底部, ,因为我在输入editText字段时遇到问题,底部导航栏向上移动并覆盖其他领域如何设置android底部导航栏位置固定在android 代码: xmlns:and ...
- VS 2015 开发Android底部导航条----[实例代码,多图]
1.废话背景介绍 在Build 2016开发者大会上,微软宣布,Xamarin将被整合进所有版本的Visual Studio之中. 这也就是说,Xamarin将免费提供给所有购买了Visual St ...
- android fragment 底部菜单栏,一句话搞定Android底部导航栏,一键绑定Fragment、ViewPager...
现在大多数App都会用到底部导航栏,比如常见的聊天工具QQ.微信.购物App等等,有了底部导航栏,用户可以随时切换界面,查看不同的内容.它的实现方式也很多,以前大多使用TabHost来实现,但是现在我 ...
- 转载:Android底部导航栏,三种风格和实现
原文出处 标题:Android底部导航栏,三种风格和实现 作者:阿飞__ 原文链接:Android底部导航栏,三种风格和实现_阿飞__的博客-CSDN博客_android导航栏 一.效果图展示 如果动 ...
- Android底部导航栏的三种风格实现
一.效果图展示 如果动图没有动的话,也可以看下面这个静态图 以下挨个分析每个的实现,这里只做简单的效果展示,大家可以基于目前代码做二次开发. 二.BottomNavigationView 这是 Goo ...
最新文章
- 微信小程序开发-入门基础
- jquery插件之选项卡
- 计算机在管理会计应用中的作用,计算机在现代管理会计中的应用(共3736字).doc...
- python修改文件后缀_python实现遍历文件夹修改文件后缀
- nginx限流健康检查
- C++设计模式之二 AbstractFactory模式
- CAN笔记(6) CAN协议(一)
- linux下自己安装软件做成命令
- html验证码功能如何实现原理,基于JS实现一个随机生成验证码功能
- zabbix详解(十三)——zabbix微信报警实战
- Amazon Alexa 入门实验
- HTML5游戏引擎(十四)-颜色效果——混合模式 滤镜 颜色矩阵滤镜 矩阵数据说明
- zuul网关的过滤器类型
- 【智能优化算法】广义邻域搜索算法(综述)
- pythonppt生成替换_python生成ppt的方法
- 包机制、访问修饰符、Jar包 java初学 面向对象五
- MYSQL/ORACLE/SQL SERVER的默认端口号
- 【2017.11.30】3. Longest Substring Without Repeating Characters-最长字串不重复字符
- 以前端角度出发做好SEO需要考虑什么?
- 元气森林,真能在中国再造一个“可口可乐”吗?