安卓ButtomBar实现方法

这里ButtomBar有3个items,分别有icon和文字,在当前fragment时,所属的icon和文字会显示不同颜色。
1. 首先要准好ICON素材,命名规范要清楚。

2. 实现这个ButtomBar用到fragment,架构是这样。

3. ButtomBar的TextView带ICON
<TextView
android:id="@+id/tvBbMainHome"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center_vertical|center_horizontal"
android:paddingBottom="4dp"
android:text="主頁"
android:drawableTop="@drawable/selector_icon_frag_home"
android:textColor="@drawable/selector_bottom_text"
android:textSize="12dp"
android:paddingTop="6dp" />
用DrawTop在TextView上画ICON,TextColor来改变当前点选的颜色。看看代码就知道发生什麽事了。
selector_icon_frag_home
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/bb_main_home_select" android:state_selected="true"/>
<item android:drawable="@drawable/bb_main_home_native"/>
</selector>
selector_bottom_text
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="@color/bottomTextSelectedColor" android:state_selected="true"/>
<item android:color="@color/bottomTextStabledColor"/>
</selector>
不算太复杂,不解释。
3. 先创建Fregment吧。
public class HomeFragment extends Fragment {
@Override
public View onCreateView (LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
view = inflater.inflate(R.layout.fragment_home, container, false);
return view;
}
}
别忘记要创建fragment_home。
4. 现在有了ButtonBar,有了Fragment,就可以用MainActivity调用它们来实现ButtonBar功能。
MainActivity初始化2个很重要的控件,FragmentManager和FragmentTransaction。
FragmentManager是管理Fragment,FragmentTransaction是过场效果。
这3个TextView就是ButtonBar的3个IC。
// bottom bar main
private TextView tvBbMainHome;
private TextView tvBbMainAcademic;
private TextView tvBbMainSet; // fragment
private FragmentManager fragmentManager;
private FragmentTransaction transaction; // fragment
private HomeFragment homeFragment;
private AcademicFragment academicFragment;
private SetFrgment setFragment;
初始化。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
supportRequestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
fragmentManager = getSupportFragmentManager();
initUI();
initListener();
// per-click the home page icon of button bar
tvBbMainHome.performClick();
}
看代码,不解释。
private void initUI() {
// bottom bar main
tvBbMainHome = (TextView)findViewById(R.id.tvBbMainHome);
tvBbMainAcademic = (TextView)findViewById(R.id.tvBbMainAcademic);
tvBbMainSet = (TextView)findViewById(R.id.tvBbMainSet);
}
private void initListener() {
// bottom bar Main
tvBbMainHome.setOnClickListener(this);
tvBbMainAcademic.setOnClickListener(this);
tvBbMainSet.setOnClickListener(this);
}
private void setSelectorAllFalse() {
tvBbMainHome.setSelected(false);
tvBbMainAcademic.setSelected(false);
tvBbMainSet.setSelected(false);
}
private void hideAllFragment() {
if (homeFragment != null) {
transaction.hide(homeFragment);
}
if (academicFragment != null) {
transaction.hide(academicFragment);
}
if (setFragment != null) {
transaction.hide(setFragment);
}
}
最核心的业务层在这。TextView继承了onClickListener。假如点中了TextView,首先会调用hideAllFragment,把所有Fragment都隐藏,保证画面是初始化了完全空白。
然后调用setSelectorAllFalse,确保不会出现连点的情况。
setSelected(true)是用来调用selector_bottom_text,转变TextView的颜色。
中间的太简单不解释。
最后别忘记调用transaction.commit()
@Override
public void onClick(View view) {
transaction = fragmentManager.beginTransaction();
hideAllFragment();
setSelectorAllFalse();
switch (view.getId()) {
case R.id.tvBbMainHome:
tvBbMainHome.setSelected(true);
if (homeFragment == null) {
homeFragment = new HomeFragment();
transaction.add(R.id.frameLayout, homeFragment, "homeFragment");
}
transaction.show(homeFragment);
break;
case R.id.tvBbMainAcademic:
tvBbMainAcademic.setSelected(true);
if (academicFragment == null) {
academicFragment = new AcademicFragment();
transaction.add(R.id.frameLayout, academicFragment, "academicFragment");
}
transaction.show(academicFragment);
break;
case R.id.tvBbMainSet:
tvBbMainSet.setSelected(true);
if (setFragment == null) {
setFragment = new SetFrgment();
transaction.add(R.id.frameLayout, setFragment, "setFragment");
}
transaction.show(setFragment);
break;
}
transaction.commit();
}
吾系佛系青年,庚叁透叁透!
安卓ButtomBar实现方法的更多相关文章
- RN 调用安卓的原生方法(实现Toast效果)
首先明确一点,坑实在是是太多了-神奇呀! ok! 基本思路: 1.用AS打开一个已经存在的项目(这里可以打开项目中的android也可以是android里面的build.gradle) 2.在AS里新 ...
- mob免费短信验证码安卓SDK调用方法
很不错的一款免费验证码平台,支持IOS.安卓,比那些收费的稳定.开发容易.分享给大家,希望大家不要滥用 官网: http://mob.com/ 官方有开发文档,但是有几点要注意的官方没有提到,导致初始 ...
- Unity调用安卓中的方法遇到的问题
最近在用U3D做一个简单的迷宫游戏,在项目中利用Unity制作游戏场景,在android中调用游戏场景,并在游戏结束后调用安卓方法,传递参数,退出游戏场景 查找网上资料,基本上Unity调用安卓的写法 ...
- 与安卓联调,调用安卓那边的方法,获取到安卓传过来的数据,再携带这些数据发送axios请求,获取到用户的信息
第一步:js调用Android方法:接收Android传递过来的数据,并做处理 //参数一:调用java中的方法 submitFromWeb是方法名,必须和Android中注册时候的方法名称保持一 ...
- mac电脑链接安卓手机的方法
https://blog.csdn.net/liubin9043/article/details/78928253/ 我用了个爱莫 不错 http://web.airmore.com
- 安卓android破解方法
韩梦飞沙 yue31313 韩亚飞 han_meng_fei_sha 313134555@qq.com 如何给smali文件中的unicode字符串添加中文注释 如何注释掉smali文件中包含关键字 ...
- eclipse安卓引入库项目的正确方法
之前清单文件里theme主题老是改不成库项目里定义好的主题@style/Theme.AppCompat.Light,只能用默认主题@style/AppTheme <application and ...
- Dcloud HTML5 监听蓝牙设备 调用 原生安卓实现
最近一直搞Dcloud ,这是HTML5版本的开发,打包时候,可以打包成 apk 和ipa 分别运行在安卓和ios 机器上面, 但是这里面的资料很少,遇到问题,之后只能自己钻研总结, 现在有这么一个需 ...
- 超简单,安卓模拟器手动root
本文转载自:http://quantoubao.blog.163.com/blog/static/2083211702013870501987/ 安装Android SDK安卓模拟器的方法很简单,网上 ...
随机推荐
- .NET Core开发实战(第11课:文件配置提供程序)--学习笔记
11 | 文件配置提供程序:自由选择配置的格式 文件配置提供程序 Microsoft.Extensions.Configuration.Ini Microsoft.Extensions.Configu ...
- LeetCode做题笔记之动态规划
LeetCode之动态规划 时间有限只做了下面这几道:70.338.877.96.120.95.647,后续会继续更新 70:爬楼梯 先来道简单的练练手,一道经典的动态规划题目 可以采用动态规划的备忘 ...
- part10 header界面渐隐渐显 //动态路由//项目动画
两个组件只同时显示一个 可以用 a v-show='variable' b: v-show='!variable' 1.对全局事件的解绑 //代码容易出现大量bug 因为影响其他组件 keep-al ...
- CCCC 正整数A+B
题意: 本题的目标很简单,就是求两个正整数A和B的和,其中A和B都在区间[1,1000].稍微有点麻烦的是,输入并不保证是两个正整数. 输入格式: 输入在一行给出A和B,其间以空格分开.问题是A和B不 ...
- 每天一点点之vue框架开发 - 数据渲染-for循环中动态设置页面背景色
实现方式很简单,在属性前加:,表示绑定 :style="{'background':item.bgColor} 代码样例: <li v-for="item in laber_ ...
- C++保存数据到CSV文件
主要是今天工作的时候需要把一些数据保存到本地,因为是一些预测值和标签的对比,还有预测值的概率,所以想到用CSV文件来保存,大概查了一下,还是比较简单的,所以记录一下. 首先要说明的是CSV文件有点类似 ...
- 高级变量类型(列表,元组,字典,字符串,公共方法,变量高级)for循环
Python 中数据类型可以分为 数字型 和 非数字型 数字型 整型 (int) 浮点型(float) 布尔型(bool) 真 True 非 0 数 -- 非零即真 假 False 0 复数型 (co ...
- SQL基础教程(第2版)第6章 函数、谓词、CASE表达式:6-2 谓词
● 谓词就是返回值为真值的函数. ● 可以将子查询作为IN和EXISTS的参数. 本节将会和大家一起学习 SQL 的抽出条件中不可或缺的工具——谓词(predicate).例如, =. <. & ...
- vue组件传值 part2
非父子组件传值 轻量级 视图层框架 复杂组件间传值,引进其他的工具或者设计模式 1.vuex 2.总线机制 //main line 1.在main.js中注册全局的bus Vue.prototype. ...
- 统计web 访问日志的请求数据
tomcat日志格式 在配置文件 server.xml 中,具体参照官方文档 https://tomcat.apache.org/tomcat-8.0-doc/config/valve.html#A ...