[Android]AndroidBucket增加碎片SubLayout功能及AISubLayout的注解支持

以下内容为原创,转载请注明:

来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/3709957.html

 

之前写过一篇博客,是使用Fragment来实现TabHost的效果,并且模拟TabHost的切换各个fragment生命周期的调用,见http://www.cnblogs.com/tiantianbyconan/p/3360938.html

但是如果要实现的效果是两级的Tab,比如在第一级tab中又有三个子Tab切换不同的布局,

相当于在Fragment中嵌套来Fragment,这个怎么实现?

也有个官方的实现方法,通过使用android-support-v13.jar包中的getChildFragmentManager方法来获取一个Manager。

这里带来我写的一个新的方案,使用SubLayout来实现。

相关源码:https://github.com/wangjiegulu/AndroidBucket/tree/master/src/com/wangjie/androidbucket/customviews/sublayout

下面使用一个例子来说下使用方法,先看下最后的效果(项目使用了我的开源AndroidBucketAndroidInject 请先添加依赖项目,欢迎star/fork):

效果跟以前的例子大同小异,点击第一个tab上的TextView,然后Toast提示EditText上的信息,但是使用方式却是不一样的。

大体的思路是在MainActivity布局中增加一个FrameLayout,然后在切换过程中不停的用相应的布局去替换FrameLayout中。

main.xml布局如下:

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3               android:orientation="vertical"
 4               android:layout_width="fill_parent"
 5               android:layout_height="fill_parent"
 6         >
 7 
 8     <FrameLayout
 9             android:id="@+id/main_content_view"
10             android:layout_width="match_parent"
11             android:layout_height="0dp"
12             android:layout_weight="1.0"
13             />
14 
15     <RadioGroup
16             android:id="@+id/main_tabs_rg"
17             android:layout_width="fill_parent"
18             android:layout_height="65dp"
19             android:background="#aabbcc"
20             android:gravity="center_vertical"
21             android:orientation="horizontal" >
22 
23         <RadioButton
24                 android:id="@+id/main_tab_a_rb"
25                 style="@style/tab_item_background"
26                 android:drawableTop="@drawable/ic_launcher"
27                 android:paddingTop="7dp"
28                 android:textSize="13sp"
29                 android:checked="true"
30                 />
31 
32         <RadioButton
33                 android:id="@+id/main_tab_b_rb"
34                 style="@style/tab_item_background"
35                 android:drawableTop="@drawable/ic_launcher"
36                 android:paddingTop="7dp"
37                 android:textSize="13sp"
38                 />
39 
40         <RadioButton
41                 android:id="@+id/main_tab_c_rb"
42                 style="@style/tab_item_background"
43                 android:drawableTop="@drawable/ic_launcher"
44                 android:paddingTop="7dp"
45                 android:textSize="13sp"
46                 />
47 
48     </RadioGroup>
49 
50 </LinearLayout>

布局很简单,一个FrameLayout用于存放不同界面的布局,3个RadioButton表示下面的每一项Tab按钮。

在MainActivity中代码如下:

@AILayout(R.layout.main)
public class MainActivity extends AIActivity {public static final String TAG = MainActivity.class.getSimpleName();@AIView(R.id.main_content_view)ViewGroup contentView;@AIView(R.id.main_tabs_rg)RadioGroup rg;SubLayoutManager sbManager;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);sbManager = new SubLayoutManager<SubLayout>(context, contentView, TabASubLayout.class, TabBSubLayout.class, TabCSubLayout.class);sbManager.setSwitchListener(new SubLayoutManager.LayoutSwitchListener<SubLayout>() {@Overridepublic void switchSelf(SubLayout subLayout, int position) {Logger.d(TAG, "[switch listener]switchSelf, subLayout: " + subLayout + ", position: " + position);}@Overridepublic void switchCompleted(SubLayout subLayout, int position) {Logger.d(TAG, "[switch listener]switchCompleted, subLayout: " + subLayout + ", position: " + position);}});rg.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {@Overridepublic void onCheckedChanged(RadioGroup radioGroup, int i) {int index = -1;switch(i){case R.id.main_tab_a_rb:index = 0;break;case R.id.main_tab_b_rb:index = 1;break;case R.id.main_tab_c_rb:index = 2;break;}if(index < 0 || index >= sbManager.getSubLayoutSize()){return;}sbManager.switchLayout(index);}});sbManager.switchLayout(0); // 默认切换第一页
}@Overrideprotected void onDestroy() {super.onDestroy();sbManager.destoryClear();sbManager = null;}}

上面的SubLayout相当于一个Fragment,SubLayoutManager用于管理多个SubLayout之间的切换。SubLayoutManager可以通过new获取。

其中构造方法中:

public SubLayoutManager(Context context, ViewGroup contentView, Class<? extends T>... slszzs) {

参数二:contentView表示在MainActivity中预留给SubLayout显示的FrameLayout。

参数三:是个可变长参数,可以在后面(有序)追加所有需要切换的SubLayout的Class对象。

第一次初始化后各个SubLayout对象不会马上生成,只会在切换到改页面时才会生成该对象,会执行SubLayout的initLayout()方法,这个方法只会调用一次(类似onCreate()方法)

需要切换页面时只需要执行SubLayoutManager的switchLayout()方法,传入SubLayout的position就可以了,这个position跟参数三的顺序一致。

 

接下来看下几个SubLayout是怎么去实现的,因为三个SubLayout大致相同,所以只分析一个就可以了:

TabASubLayout代码如下:

 1 @AILayout(R.layout.tab_a)
 2 public class TabASubLayout extends AISubLayout {
 3     public static final String TAG = TabASubLayout.class.getSimpleName();
 4 
 5 
 6 //    @AIView(R.id.tab_a_tv)
 7 //    TextView tv;
 8     @AIView(R.id.tab_a_et)
 9     EditText et;
10 
11     public TabASubLayout(Context context) {
12         super(context);
13 //        setContentView(R.layout.tab_a);
14 
15     }
16 
17     @Override
18     public void initLayout() {
19         super.initLayout();
20         Logger.d(TAG, "initLayout...");
21     }
22 
23     @AIClick({R.id.tab_a_tv})
24     public void onClickCallbackSample(View view) {
25         Toast.makeText(context, "clicked: " + ((TextView)view).getText() + ", " + et.getText(), Toast.LENGTH_SHORT).show();
26     }
27 
28     @Override
29     public void onResume() {
30         super.onResume();
31         Logger.d(TAG, "onResume...");
32     }
33 
34     @Override
35     public void onPause() {
36         super.onPause();
37         Logger.d(TAG, "onPause...");
38     }
39 
40 }

代码很简单,继承AISubLayout即可,AISubLayout是AndroidInject中AndroidBucket的子类,实现了SubLayout的注解的支持。当然你也可以直接继承SubLayout,这样的话就不能使用注解了,看上面的被注释的代码,可以通过setContentView来设置对应的布局,可以通过findViewById来获取控件对象。

它也有onResume和onPause方法,当前页A被切换到B的话会调用A的onPause,然后调用B的onResume(如果之前B没有被初始化过,则先调用initLayout再调用onResume方法)

下面来看看log打印的日志:

 

// 以下为启动应用,默认加载TabA

05-05 08:22:32.216 1086-1086/com.wangjie.sublayouttest D/SubLayoutManager﹕ -----switch start-----------------------
05-05 08:22:32.216 1086-1086/com.wangjie.sublayouttest D/SubLayoutManager﹕ switch before.........: [DelayObj{clazz=class com.wangjie.sublayouttest.TabASubLayout, delayObj=null}, DelayObj{clazz=class com.wangjie.sublayouttest.TabBSubLayout, delayObj=null}, DelayObj{clazz=class com.wangjie.sublayouttest.TabCSubLayout, delayObj=null}]
05-05 08:22:32.336 1086-1086/com.wangjie.sublayouttest D/TabASubLayout﹕ initLayout...
05-05 08:22:32.336 1086-1086/com.wangjie.sublayouttest D/TabASubLayout﹕ onResume...
05-05 08:22:32.336 1086-1086/com.wangjie.sublayouttest D/MainActivity﹕ [switch listener]switchCompleted, subLayout: com.wangjie.sublayouttest.TabASubLayout@b4dff088, position: 0
05-05 08:22:32.336 1086-1086/com.wangjie.sublayouttest D/SubLayoutManager﹕ switch after.........: [DelayObj{clazz=class com.wangjie.sublayouttest.TabASubLayout, delayObj=com.wangjie.sublayouttest.TabASubLayout@b4dff088}, DelayObj{clazz=class com.wangjie.sublayouttest.TabBSubLayout, delayObj=null}, DelayObj{clazz=class com.wangjie.sublayouttest.TabCSubLayout, delayObj=null}]
05-05 08:22:32.336 1086-1086/com.wangjie.sublayouttest D/SubLayoutManager﹕ -----switch end-----------------------


// TabA切换到TabB
05-05 08:22:37.926 1086-1086/com.wangjie.sublayouttest D/SubLayoutManager﹕ -----switch start-----------------------
05-05 08:22:37.926 1086-1086/com.wangjie.sublayouttest D/SubLayoutManager﹕ switch before.........: [DelayObj{clazz=class com.wangjie.sublayouttest.TabASubLayout, delayObj=com.wangjie.sublayouttest.TabASubLayout@b4dff088}, DelayObj{clazz=class com.wangjie.sublayouttest.TabBSubLayout, delayObj=null}, DelayObj{clazz=class com.wangjie.sublayouttest.TabCSubLayout, delayObj=null}]
05-05 08:22:37.946 1086-1086/com.wangjie.sublayouttest D/TabASubLayout﹕ onPause...
05-05 08:22:37.986 1086-1086/com.wangjie.sublayouttest D/TabBSubLayout﹕ initLayout...
05-05 08:22:37.996 1086-1086/com.wangjie.sublayouttest D/TabBSubLayout﹕ onResume...
05-05 08:22:37.996 1086-1086/com.wangjie.sublayouttest D/MainActivity﹕ [switch listener]switchCompleted, subLayout: com.wangjie.sublayouttest.TabBSubLayout@b4de1d80, position: 1
05-05 08:22:37.996 1086-1086/com.wangjie.sublayouttest D/SubLayoutManager﹕ switch after.........: [DelayObj{clazz=class com.wangjie.sublayouttest.TabASubLayout, delayObj=com.wangjie.sublayouttest.TabASubLayout@b4dff088}, DelayObj{clazz=class com.wangjie.sublayouttest.TabBSubLayout, delayObj=com.wangjie.sublayouttest.TabBSubLayout@b4de1d80}, DelayObj{clazz=class com.wangjie.sublayouttest.TabCSubLayout, delayObj=null}]
05-05 08:22:37.996 1086-1086/com.wangjie.sublayouttest D/SubLayoutManager﹕ -----switch end-----------------------


// TabB切换到TabC
05-05 08:22:41.486 1086-1086/com.wangjie.sublayouttest D/SubLayoutManager﹕ -----switch start-----------------------
05-05 08:22:41.486 1086-1086/com.wangjie.sublayouttest D/SubLayoutManager﹕ switch before.........: [DelayObj{clazz=class com.wangjie.sublayouttest.TabASubLayout, delayObj=com.wangjie.sublayouttest.TabASubLayout@b4dff088}, DelayObj{clazz=class com.wangjie.sublayouttest.TabBSubLayout, delayObj=com.wangjie.sublayouttest.TabBSubLayout@b4de1d80}, DelayObj{clazz=class com.wangjie.sublayouttest.TabCSubLayout, delayObj=null}]
05-05 08:22:41.496 1086-1086/com.wangjie.sublayouttest D/TabBSubLayout﹕ onPause...
05-05 08:22:41.516 1086-1086/com.wangjie.sublayouttest D/TabCSubLayout﹕ initLayout...
05-05 08:22:41.516 1086-1086/com.wangjie.sublayouttest D/TabCSubLayout﹕ onResume...
05-05 08:22:41.516 1086-1086/com.wangjie.sublayouttest D/MainActivity﹕ [switch listener]switchCompleted, subLayout: com.wangjie.sublayouttest.TabCSubLayout@b4e17840, position: 2
05-05 08:22:41.516 1086-1086/com.wangjie.sublayouttest D/SubLayoutManager﹕ switch after.........: [DelayObj{clazz=class com.wangjie.sublayouttest.TabASubLayout, delayObj=com.wangjie.sublayouttest.TabASubLayout@b4dff088}, DelayObj{clazz=class com.wangjie.sublayouttest.TabBSubLayout, delayObj=com.wangjie.sublayouttest.TabBSubLayout@b4de1d80}, DelayObj{clazz=class com.wangjie.sublayouttest.TabCSubLayout, delayObj=com.wangjie.sublayouttest.TabCSubLayout@b4e17840}]
05-05 08:22:41.526 1086-1086/com.wangjie.sublayouttest D/SubLayoutManager﹕ -----switch end-----------------------

 

// TabC切换到TabA
05-05 08:22:44.086 1086-1086/com.wangjie.sublayouttest D/SubLayoutManager﹕ -----switch start-----------------------
05-05 08:22:44.086 1086-1086/com.wangjie.sublayouttest D/SubLayoutManager﹕ switch before.........: [DelayObj{clazz=class com.wangjie.sublayouttest.TabASubLayout, delayObj=com.wangjie.sublayouttest.TabASubLayout@b4dff088}, DelayObj{clazz=class com.wangjie.sublayouttest.TabBSubLayout, delayObj=com.wangjie.sublayouttest.TabBSubLayout@b4de1d80}, DelayObj{clazz=class com.wangjie.sublayouttest.TabCSubLayout, delayObj=com.wangjie.sublayouttest.TabCSubLayout@b4e17840}]
05-05 08:22:44.086 1086-1086/com.wangjie.sublayouttest D/TabCSubLayout﹕ onPause...
05-05 08:22:44.136 1086-1086/com.wangjie.sublayouttest D/TabASubLayout﹕ onResume...
05-05 08:22:44.136 1086-1086/com.wangjie.sublayouttest D/MainActivity﹕ [switch listener]switchCompleted, subLayout: com.wangjie.sublayouttest.TabASubLayout@b4dff088, position: 0
05-05 08:22:44.136 1086-1086/com.wangjie.sublayouttest D/SubLayoutManager﹕ switch after.........: [DelayObj{clazz=class com.wangjie.sublayouttest.TabASubLayout, delayObj=com.wangjie.sublayouttest.TabASubLayout@b4dff088}, DelayObj{clazz=class com.wangjie.sublayouttest.TabBSubLayout, delayObj=com.wangjie.sublayouttest.TabBSubLayout@b4de1d80}, DelayObj{clazz=class com.wangjie.sublayouttest.TabCSubLayout, delayObj=com.wangjie.sublayouttest.TabCSubLayout@b4e17840}]
05-05 08:22:44.136 1086-1086/com.wangjie.sublayouttest D/SubLayoutManager﹕ -----switch end-----------------------

 

转载于:https://www.cnblogs.com/tiantianbyconan/p/3709957.html

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

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

相关文章

WordPress 获取当前页面 ID 的几大方法

https://zhangzifan.com/wordpress-get-id.html 在很多的 WordPress 主题或者插件功能的开发中&#xff0c;我们总是需要获取到 WordPress 给每个页面定义的 ID&#xff0c;不然也某些情况下是无法确定这是哪一个页面&#xff0c;针对于文章或者页面的 ID 获取基本可以使用 get…

王者荣耀交流协会第四次Scrum立会

拍照的是王磊同学&#xff0c;没有出镜。 开会时间&#xff1a;2017年10月30日下午18&#xff1a;45-19&#xff1a;16 共计31分钟 开会地点&#xff1a;一食堂二楼靠近窗户倒数第四排 今日完成工作进度&#xff1a; 袁玥同学完成了点击按钮刷新时间的功能代码&#xff1b; 王…

Python在信号与系统(1)——Hilbert兑换,Hilbert在国家统计局的包络检测应用,FIR_LPF滤波器设计,格鲁吉亚也迫使高FM(PM)调制...

谢谢董老师&#xff0c;董老师是个好老师。 心情久久不能平静&#xff0c;主要是高频这门课的分析方法实在是让我难以理解&#xff0c;公式也背只是&#xff0c;还是放放吧。 近期厌恶了Matlab臃肿的体积和频繁的读写对我的Mac的损害&#xff0c;所以学习了一下Python这一轻量级…

如何在WP-Config中设置WordPress错误日志

https://baijiahao.baidu.com/s?id1622279671500148245&wfrspider&forpc 你想在wp-config文件中设置WordPress错误日志吗&#xff1f;WordPress中的wp-config文件不仅控制您的WordPress网站设置&#xff0c;它也是一个非常有用的调试工具&#xff0c;可帮助您查找和修…

wordpress启用侧边栏小工具

http://www.seo628.com/1872.html wordpress后台默认不显示小工具选项&#xff0c;开发者需要启用小工具功能并把小工具在相应的前台位置调用出来&#xff0c;这样才能在后台直接拖动生成侧边栏。 激活小工具 激活小工具需要在functions.php中注册至少一个侧边栏 register_s…

详解 Spotlight on MySQL监控MySQL服务器

前一章详解了Spotlight on Unix 监控Linux服务器 &#xff0c;今天再来看看Spotlight on MySQL怎么监控MySQL服务器。 注&#xff1a;http://www.cnblogs.com/Javame/p/3685512.html 第一步: 下载并安装mysql-connector-3.5x Spotlight on MySQL 连接mysql必须使用mysql-connec…

lua------------------Unity3D研究院编辑器之打开unity不可识别的文件(十三)

Unity3D研究院编辑器之打开unity不可识别的文件&#xff08;十三&#xff09; 雨松MOMO 【Unity3D拓展编辑器】 围观8597次 9 条评论 编辑日期&#xff1a;2017-03-02 字体&#xff1a;大 中 小 有些特殊后缀名的文件在unity里是不可识别的。如下图所示&#xff0c;这里我把文本…

一起Polyfill系列:Function.prototype.bind的四个阶段

昨天边参考es5-shim边自己实现Function.prototype.bind&#xff0c;发现有不少以前忽视了的地方&#xff0c;这里就作为一个小总结吧。 一、Function.prototype.bind的作用 其实它就是用来静态绑定函数执行上下文的this属性&#xff0c;并且不随函数的调用方式而变化。 示例&am…

盘点18个免费的WordPress主题后台选项开发框架

https://yusi123.com/3205.html/3 13.Warp Framework Warp框架不仅支持WordPress和Joomla,还可以可扩展到其他的适用Web程序。使用Warp框架你可以轻松的定制你需要的功能。 该框架是来自Yootheme团队。看看他们出的主题&#xff0c;你就知道这个绝对是精品了。精心设计的界面和…

lua----------------使用VS2015搭建lua开发环境的一些侥幸成功经验,

所以本篇博文介绍在Windows平台下&#xff0c;使用VS2015搭建lua开发环境的一些侥幸成功经验&#xff0c;安装过程参考网上教程&#xff0c;安装过程如下&#xff08;参考http://www.byjth.com/lua/33.html&#xff09; 一 生成lua5.3.lib 1、下载并编译lua源码 首先进入lua官…

WordPress中使主题支持小工具以及添加插件启用函数

https://www.jb51.net/article/76810.htm 这篇文章主要介绍了WordPress中使主题支持widget以及添加插件启用函数的方法,使WP可以使用小工具widget与通过register_activation_hook()来添加启用插件的函数,需要的朋友可以参考下 让主题支持小工具 WordPress 的小工具&#xff08;…

Thunder团队第三周 - Scrum会议6

Scrum会议6 小组名称&#xff1a;Thunder 项目名称&#xff1a;i阅app Scrum Master&#xff1a;宋雨 工作照片&#xff1a; 代秋彤照相&#xff0c;所以图片中没有该同学。 参会成员&#xff1a; 王航&#xff1a;http://www.cnblogs.com/wangh013/ 李传康&#xff1a;http://…

如何使WordPress博客添加多个sidebar侧边栏

https://www.cnblogs.com/lydbk/p/4609736.html 如何使WordPress博客添加多个sidebar侧边栏 在制作wordpress模版的时候,也许你会遇到一个sidebar侧栏不能完全满足你的需求&#xff0c;或者侧栏内容过多导致页面过长&#xff0c;那么我们可以考虑使用两个或者更多侧栏。 考虑…

glove中文词向量_Summary系列glove模型解读

一、Glove模型简介语义文本向量表示可以应用在信息抽取&#xff0c;文档分类&#xff0c;问答系统&#xff0c;NER&#xff08;Named Entity Recognition&#xff09;和语义解析等领域中&#xff0c;大都需要计算单词或者文本之间的距离或者相似度&#xff0c;因此&#xff0c;…

lynx---CentOS终端访问IP

1、官网 http://lynx.isc.org 2、稳定版本 http://invisible-mirror.net/archives/lynx/tarballs/lynx2.8.8rel.2.tar.gz 3、下载 cd /usr/local/ wget http://invisible-mirror.net/archives/lynx/tarballs/lynx2.8.8rel.2.tar.gz 4、解压 tar xzf lynx2.8.8rel.2.tar.gz 5…

OnLongClickListener长按事件设置墙纸

在AndroidApp应用中&#xff0c;OnLongClick事件表示长按2秒以上触发的事件&#xff0c;本章我们通过长按图像设置为墙纸来理解其具体用法。知识点&#xff1a;OnLongClickListener  OnLongClickListener接口与之前介绍的OnClickListener接口原理基本相同&#xff0c;只是该接…

foursquare nyc数据集_炫酷的python地理数据可视化

介绍在本文中&#xff0c;我依靠纽约市提供的这一数据集&#xff0c;详细列出了从2010年1月到2017年9月的所有大鼠目击事件。在此期间&#xff0c;已有101,914例报告的老鼠目击事件。虽然这已经是一个非常高的数字&#xff0c;但实际观察的鼠标数量可能要高得多。在纽约市独自一…

crawler_微信采集方案

仅供参考 转载于:https://www.cnblogs.com/cphmvp/p/3729295.html

jsp文件通常用common_springboot还能这样用redis

点击蓝字 关注我们 作者&#xff1a;xfkhttps://www.cnblogs.com/xfk1999/p/11347793.html一直想在springboot上集成带缓存的redis&#xff0c;终于成功了。网上有1000种写法&#xff0c;想找到一篇合适的还真不容易?。走下流程&#xff0c;加深下印象。环境:springboot版本&a…

takePic and Videos

2019独角兽企业重金招聘Python工程师标准>>> //// ViewController.m// UIImagePickerController// Created by Kenshin Cui on 14/04/05.// Copyright (c) 2014年 cmjstudio. All rights reserved.//AVFoundation.framework//MediaPlayer.framework//MobileCore…