最近项目中想做一个新手提示的功能,就是在指定的View上弹出一个类似PopupView的气泡提示框。

效果见下图:

Screenshot_20170426-151801_01.png

预想在TabLayout的某个子View上弹出这个提示框,但是发现在现有公开的方法中取不到相应的View对象,研究了一下源码后,发现可以使用反射取到相应的View对象。

但是怎么获取下图中红圈中的View对象呢?

ZZZZZZ.png

public voidaddTab(@NonNullTabtab, intposition, booleansetSelected) {

if(tab.mParent!=this) {

throw newIllegalArgumentException("Tab belongs to a different TabLayout.");

}

configureTab(tab,position);

addTabView(tab);//这个是增加子Tab的方法,我们重点看这个方法

if(setSelected) {

tab.select();

}

}

我们接下来重点研究那个 addTabView 方法。

private void addTabView(Tab tab) {

final TabView tabView = tab.mView;

mTabStrip.addView(tabView, tab.getPosition(), createLayoutParamsForTabs());

}

发现了一个TabView对象,跟这个方法点进去看看。

TabView源码:

class TabView extends LinearLayout implements OnLongClickListener {

private Tab mTab;

private TextView mTextView;

private ImageView mIconView;

private View mCustomView;

private TextView mCustomTextView;

private ImageView mCustomIconView;

private int mDefaultMaxLines = 2;

public TabView(Context context) {

super(context);

if (mTabBackgroundResId != 0) {

ViewCompat.setBackground(

this, AppCompatResources.getDrawable(context, mTabBackgroundResId));

}

ViewCompat.setPaddingRelative(this, mTabPaddingStart, mTabPaddingTop,

mTabPaddingEnd, mTabPaddingBottom);

setGravity(Gravity.CENTER);

setOrientation(VERTICAL);

setClickable(true);

ViewCompat.setPointerIcon(this,

PointerIconCompat.getSystemIcon(getContext(), PointerIconCompat.TYPE_HAND));

}

//...此处省略若干行代码

}

有TextView对象也有ImageView对象,还有各种布局的方法,这时候有个猜测,是不是这个Tabview就是我们想要得到的View对象呢?

那怎么得到这个TabView对象呢?注意下面addTab中的这个方法

final TabView tabView = tab.mView;

获取到当前的Tab就可了。而获取tab是有公开的方法的:

/**

* Returns the tab at the specified index.

*/

@Nullable

public Tab getTabAt(int index) {

return (index < 0 || index >= getTabCount()) ? null : mTabs.get(index);

}

传入子Tab的角标就可以了。

至此,基本上就可以开始写代码了。

public View getTabView(int index){

View tabView = null;

TabLayout.Tab tab = binding.tabs.getTabAt(index);

Field view = null;

try {

view = TabLayout.Tab.class.getDeclaredField("mView");

} catch (NoSuchFieldException e) {

e.printStackTrace();

}

view.setAccessible(true);

try {

tabView = (View) view.get(tab);

} catch (IllegalAccessException e) {

e.printStackTrace();

}

return tabView;

}

android开发实现tab,Android 开发之获得Tablayout中子Tab所在的View相关推荐

  1. Android开发规范[Java+android]

    说明:该文档由阿里<Java开发规范>和<Android开发规范>整理而来  [强制]必须遵守,违反本约定或将会引起严重的后果:  [推荐]尽量遵守,长期遵守有助于系统稳定 ...

  2. 开发一个基于 Android系统车载智能APP

    很久之前就想做一个车载相关的app.需要实现如下功能: (1)每0.2秒更新一次当前车辆的最新速度值. (2)可控制性记录行驶里程. (3)不连接网络情况下获取当前车辆位置.如(北京市X区X路X号) ...

  3. 基于Android的手机安全卫士的开发

    基于Android的手机安全卫士的开发 开发环境 处理器:Intel® Core™ i5-5200U CPU 2.20GHz 内存:4GB 硬盘:500GB 操作系统:Windows 7中文版,64位 ...

  4. Android Studio 教程:入门开发第一个程序

    Android Studio 教程:入门开发第一个程序 2018.09.11 14:30 16005浏览 开发第一应用 可以开发属于自己的应用,是否有点小激动?好吧!让我们开始,首先点击Start a ...

  5. Android连载之:第二章第三节:利用其他的开发环境和工具开发Android应用程序

    2.3 利用其他的开发环境和工具开发Android应用程序 推荐使用带有Android插件的Eclipse来开发Android应用程序,ADT插件提供了编辑.编译.调试功能并集成进了IDE中.然而,S ...

  6. 移动开发技术【Android】:【part 2】——RecyclerView实现列表

    上一篇请参见:移动开发技术[安卓]--Android_Studio[Part 1] 在上一篇中,我们说到,如何初步的使用Android Studio ,同时完成了基础微信页面的模仿设计.同时我们上一篇 ...

  7. Material Design 开发利器:Android Design Support Library 介绍

    Material Design 开发利器:Android Design Support Library 介绍 本文翻译自著名博客 Android Developers,原作者是 Ian Lake,点击 ...

  8. Android环境搭建和Android HelloWorld—Android开发环境搭建

    Android_Android开发环境搭建-搭建Android的开发环境 1.我考虑先下载JDK7.0,在JDK的安装中,考虑一般SDK都是向上兼容的,于是选择了最高的版本7.0 这里是我总结的详细的 ...

  9. android 网络编程实现,Android开发使用HttpURLConnection进行网络编程详解【附源码下载】...

    本文实例讲述了Android开发使用HttpURLConnection进行网络编程.分享给大家供大家参考,具体如下: --HttpURLConnection URLConnection已经可以非常方便 ...

最新文章

  1. 即插即用新卷积:提升CNN性能、速度翻倍
  2. JS 二级菜单栏的tab切换
  3. 小米亿级大数据实时分析与工具选型 【转】
  4. es6与java的相似度_计算字符串的相似度-两种解法
  5. vector的reserve和resize
  6. Send data format set as XML
  7. linux help命令编写,Linux shell命令帮助格式详解
  8. 程序员如何快速成长为IT精英
  9. swift通知栏推送_如何使用Swift使用推送通知构建食品交付应用
  10. HDU1251 统计难题 trie树 简单
  11. idea 2018.1 创建springboot开启找回Run Dashboard
  12. HDU-1002 A + B Problem II Java大数
  13. Android6.0内核移植(1):分析编译日志
  14. 201671010119 2016-2017-2《Java程序设计》第十六周学习心得
  15. 抖音上非常火的整人小程序
  16. 柴静采访剑桥大学校长乐思哲
  17. TP6使用session
  18. warring:integer conversion resulted in a change of sign
  19. Python编曲实践(二):和弦的实现和进行
  20. 微信支付遇到 商户号该产品权限未开通,请前往商户平台产品中心检查后重试

热门文章

  1. gitstack连接詹金斯_詹金斯的Maven报告
  2. 新型消防机器人作文_消防机器人
  3. bootstrap自动生成html,Bootstrap框架动态生成Web页面文章内目录的方法
  4. Log4j2又爆雷!2.16.0存在DOS攻击风险,升级到2.17.0可解决!
  5. 皮一皮:女友在意的点....是包子!
  6. 重磅!Spring Boot 2.5.0火热发布,还学得动吗?
  7. 用了那么多年的 Master 分支或因种族歧视而成为历史?
  8. 每日一问一周汇总:第1期
  9. php支付密码控件,vue支付密码的图文实例
  10. T-SQL和安全机制