先简单说下情况。我最近在开发一个文件管理器,UI用的MD风格,如图,上面的Toolbar的sub title用来显示当前路径,但是当路径比较长的时候路径显示不全,只显示了前面一段。我想让他在路径长度大于能显示的宽度时,只显示最后面的一段路径,前面的内容用省略号代替。除此之外,我还想添加点击sub title弹出一个对话框输入路径跳转的功能。
Toolbar相信大家都不陌生,我就不介绍了,直接翻一下toolbar的源码,这个源码在m2repository里可以找到,用as的话在Toolbar类型点击右键选择 “implement”也可以查看源码:
打开源码,一眼扫过去,看到成员变量这里有个mSubtitleTextView,应该就是它了,但是为了保险起见,我们搜索toolbar的setSubtitle方法,确认一下sub title是不是这个。搜索之后找到了它的初始化代码,嗯,mSubtitleTextView,就是它了
这时候不知道你注意到没有,mSubtitleTextView是private的成员变量,也就是说我们没办法通过直接调用或者继承重写Toolbar来实现我要的功能,那么这时候我们就可以考虑一下反射了,回到我的项目中的MainActivity里,在这里toolbar就是通过findViewById拿到的Toolbar实例,反射的代码我已经写好了,就不再重写一遍了
其实这里最后一步是多余的,因为反射得到的对象还是同一个,只是重新定义了一个引用,引用指向的对象还是同一个TextView,所以其实并不需要替换回去,下面贴一下代码
//获取成员变量
Field f = toolbar.getClass().getDeclaredField("mSubtitleTextView");
//设置可访问
f.setAccessible(true);
//获取到mSubtitleTextView的实例
//这里使用final是为了方便下面在匿名内部类里使用
//传入的是toolbar实例
final TextView tv = (TextView)f.get(toolbar);
//为mSubtitleTextView设置省略号显示在开头部位
tv.setEllipsize(TextUtils.TruncateAt.START);
//设置监听器
tv.setOnClickListener(new View.OnClickListener(){
public void onClick(View v)
{
//创建对话框并根据输入的路径跳转,代码较长,省略。
}
});
//同上
tv.setOnLongClickListener(new View.OnLongClickListener(){
public boolean onLongClick(View v)
{
return true;
}
});
成果:
头部显示省略号,点击弹出对话框,OK,到这里就大功告成了。
这篇教程原文是我发在aide吧的一篇教程,时间有点久了,近期才把它搬到我csdn来,当时还在用aide开发安卓app,所以截图也全是手机的截图,各位将就着看看吧,希望能帮到有相关需求的朋友,有什么不懂的可以在评论区问我,我不定时回复。