melonl吧 关注:97贴子:2,322
  • 11回复贴,共1

利用反射给Toolbar的sub title设置点击事件

只看楼主收藏回复

自古一楼不说事,我大艾利欧镇楼


IP属地:广东来自Android客户端1楼2017-03-12 18:07回复
    先简单说下情况。我最近在开发一个文件管理器,UI用的MD风格,如图,上面的Toolbar的sub title用来显示当前路径,但是当路径比较长的时候路径显示不全,只显示了前面一段,我想让他显示后面的一段,前面的内容用省略号代替。除此之外,我还想添加点击sub title弹出一个对话框输入路径跳转的功能。


    IP属地:广东来自Android客户端2楼2017-03-12 18:08
    回复
      Toolbar是v7包里的一个新控件,主要用于实现MaterialDesign风格,用来替代以前古板的Actionbar,如果不了解的朋友可以自己搜一下toolbar。


      IP属地:广东来自Android客户端3楼2017-03-12 18:10
      回复
        首先,我们先来翻翻Toolbar的源码,这个源码在m2repository里可以找到


        IP属地:广东来自Android客户端4楼2017-03-12 18:11
        回复
          打开源码,一眼瞟过去,就看到成员变量这里有个mSubtitleTextView,应该就是它了,但是为了保险起见,我们搜索toolbar的setSubtitle方法,确认一下sub title是不是这个。搜索之后找到了它的初始化代码,嗯,mSubtitleTextView,就是它了



          IP属地:广东来自Android客户端5楼2017-03-12 18:14
          回复
            这时候不知道你注意到没有,mSubtitleTextView是private的,也就是说我们没办法通过直接调用或者继承重写Toolbar来实现我要的功能,那么这时候我们就可以考虑一下反射了


            IP属地:广东来自Android客户端6楼2017-03-12 18:17
            回复
              回到我的项目中的MainActivity里,在这里toolbar就是通过findViewById拿到的Toolbar实例,反射的代码我已经写好了,就不再重写一遍了,觉得图片模糊请查看原图


              IP属地:广东来自Android客户端7楼2017-03-12 18:18
              回复
                其实这里最后一步是多余的,因为反射得到的对象还是同一个,只是重新定义了一个引用,引用指向的对象还是同一个TextView,所以其实并不需要替换回去。


                IP属地:广东来自Android客户端8楼2017-03-12 18:20
                回复
                  //获取成员变量
                  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;
                  }
                  });
                  //其实这里也可以new一个新的TextView替换回去
                  //f.set(toolbar, yourNewTextView);


                  IP属地:广东来自Android客户端9楼2017-03-12 18:21
                  回复
                    头部显示省略号,点击弹出对话框,OK,到这里就大功告成了



                    IP属地:广东来自Android客户端10楼2017-03-12 18:22
                    回复
                      楼主加油⊙▽⊙


                      IP属地:广东来自Android客户端11楼2017-03-13 12:52
                      收起回复