Android開發:利用反射給Toolbar的sub title設置點擊事件

先簡單說下情況。我最近在開發一個文件管理器,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,所以截圖也全是手機的截圖,各位將就着看看吧,希望能幫到有相關需求的朋友,有什麼不懂的可以在評論區問我,我不定時回覆。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章