1,大家都知道 android.support.design.widget.TabLayout 中的TabLayout并没有点击事件 只有addOnTabSelectedListener这个选中监听,今天遇到个问题,就是和照片墙组合使用,点击tab照片墙要滑动到相应的位置,滑动照片墙 要选中相应的tab ,用addOnTabSelectedListener这个监听的话 两边互相影响,就出问题了 ,然后就想到,给Tab添加点击事件,下面就是具体实现:

2,代码

for (int i = 0; i 

TabLayout.Tab tab = tabLayout.getTabAt(i);

if (tab == null) return;

//这里使用到反射,拿到Tab对象后获取Class

Class c = tab.getClass();

try {

//Filed “字段、属性”的意思,c.getDeclaredField 获取私有属性。

//"mView"是Tab的私有属性名称(可查看TabLayout源码),类型是 TabView,TabLayout私有内部类。

Field field = c.getDeclaredField("mView");

//值为 true 则指示反射的对象在使用时应该取消 Java 语言访问检查。值为 false 则指示反射的对象应该实施 Java 语言访问检查。

//如果不这样会报如下错误

// java.lang.IllegalAccessException:

//Class com.test.accessible.Main

//can not access

//a member of class com.test.accessible.AccessibleTest

//with modifiers "private"

field.setAccessible(true);

final View view = (View) field.get(tab);

if (view == null) return;

view.setTag(i);

view.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

int position = (int) view.getTag();

//这里就可以根据业务需求处理点击事件了。

}

});

} catch (Exception e) {

e.printStackTrace();

}

}

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐