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,一经查实,立即删除!

相关文章

Windows在当前目录(文件)打开cmd窗口

将下面的内容保存到一个.reg文件&#xff0c;再双击运行即可。 Windows Registry Editor Version 5.00[HKEY_CLASSES_ROOT\*\shell\cmdhere] "Cmd&Here"[HKEY_CLASSES_ROOT\*\shell\cmdhere\command] "cmd.exe /c start cmd.exe /k pushd \"%L\\..\&qu…

ceontos7安装mysql5.5_centos7 安装mysql5.7及配置

一、Mysql 各个版本区别&#xff1a;1、MySQL Community Server 社区版本&#xff0c;开源免费&#xff0c;但不提供官方技术支持。2、MySQL Enterprise Edition 企业版本&#xff0c;需付费&#xff0c;可以试用30天。3、MySQL Cluster 集群版&#xff0c;开源免费。可将几个M…

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…

UML——概述

1. 静态视图&#xff08;类图&#xff09; 静态视图不描述与时间相关的系统行为&#xff0c;这种行为在其他视图中描述&#xff0c;因此称之为静态试图。静态视图用类图来实现&#xff0c;正因为它以类图为中心&#xff0c;因此也称之为类图。在类图中类用矩形框表示&#xff0…

QT中文乱码总结

在写一个非常简单的QT源程序时遇到了中文乱码问题&#xff0c;所以上网搜索得到了还算比较满意的答案。 From: http://www.ctogo.net/313.html WOWCode的主体部分基本已经完成了&#xff0c;对于我自己来说&#xff0c;其实已经足以应付我的需要了&#xff0c;不过如果发布的话…

mysql batis传多个参数_Mybatis传多个参数(三种解决方案)

据我目前接触到的传多个参数的方案有三种。第一种方案DAO层的函数方法Public User selectUser(String name,String area);对应的Mapper.xmlselect * from user_user_t where user_name #{0} and user_area#{1}其中&#xff0c;#{0}代表接收的是dao层中的第一个参数&#xff0c…

78%的iPhone用户手机没有安装过新软件

78%的iPhone用户手机没有安装过新软件 最近一直在做手机的研究&#xff0c;也在观察用户的行为习惯。在众多的智能手机中&#xff0c;iphone的强大是自然的&#xff0c;这是一款把用户从2G时代&#xff0c;带到3G时代的手机。它的革命性是显而易见的&#xff0c;我的观察是用户…

Decorator模式

Decorator(装饰器)模式能够像标准的继承一样为类添加新的功能。 不同于标准继承机制的是,如果对象进行了实例化,Decorator模式能够在运行时动态地为对象添加新的功能。 <?php abstract class AbstractCar{public abstract function getPrice();public abstract function g…

fetch 之GET请求带参数

fetch 之GET请求带参数

mysql受影响的行 0_为什么更新/删除成功时受影响的行返回0?

我有声明&#xff1a;INSERT INTO infotbl(name, phone) VALUES(Alex, 9999999);并更新它&#xff1a;UPDATE infotbl SET name Alex Johnes, phone 999 34356063 WHERE id 1;然后删除&#xff1a;DELETE FROM infotbl WHERE id 1;当我在MySQL中更新和删除行时,我已成功插入…

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

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

HTML语法06

框架标签: 这个比较难解说&#xff0c;我还是通过一个例子来说吧&#xff01; 如&#xff1a; <html> <head> <title>框架实作</title> </head> <frameset cols20%,80%> <frame src"a.html" name"1"> <frame…

sgu 240 Runaway (spfa)

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

浅谈浏览器中的preflight请求

浅谈浏览器中的preflight请求

使用UltraEdit32编辑器格式化源码功能 XML、Java、C/C++、C#

From: http://www.cnblogs.com/zcy_soft/archive/2011/01/18/1938509.html UE编辑器一直是我编程和编辑文本的好帮手&#xff0c;对它映像最深刻的功能就是列模式编辑功能&#xff0c;确实给我的工作带来不少的便利&#xff0c;但作为编程工具没有格式化源 代码的功能能似乎使U…

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

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

mysql整理类型_MYSQL数据类型分析整理

1&#xff0c;时间类型类型 所站空间datetime 8字节timestamp 4字节date 3字节year 1字节time 3字节datetime使用范围&#xff1a;"1000-01-01 00:00:00" 至 "9999-12-31 23:59:59…