1. 程式人生 > >Android控制元件獲取焦點

Android控制元件獲取焦點

問題來源:
使用android:ellipsize="marquee"這個屬性時,發現textview並不能實現跑馬燈效果,百度之,說是要先獲取焦點,於是乎,textview.requestFocus();然並卵。
然後就有了這篇文章,主角上場:requestFocus();setFocusable();setFocusableInTouchMode();

先看下原始碼解釋:
這裡寫圖片描述
這裡寫圖片描述

這兩個方法目的是一樣的,就是設定view是否可以獲得焦點,TouchMode顧名思義是觸屏模式下咯~
這裡注意一下,setFocusable設定為false會導致TouchMode下也為false,setFocusableInTouchMode設定為true會導致非TouchMode下也為true。所以為true只要設定setFocusableInTouchMode(true),為false只要設定setFocusable(false),當然兩個同時設定最保險啦~

再來看requestFocus()
這裡寫圖片描述

這個方法是用來獲取焦點的,用EditText來做個測試,會發現:

EditText edit=(EditText)findViewById(R.id.edit);
        edit.setFocusable(true);
        edit.setFocusableInTouchMode(true);
        edit.requestFocus();

這段是可以成功獲取焦點的。

EditText edit=(EditText)findViewById(R.id.edit);
        edit.setFocusable(false
); edit.setFocusableInTouchMode(false); edit.requestFocus();

而這段顯然是不能了。

綜上,setFocusable()和setFocusableInTouchMode()是requestFocus()的控制條件。

回到最初的問題,加上這兩個控制條件:

TextView textview=(TextView)findViewById(R.id.mt);
        textview.setFocusable(true);
        textview.setFocusableInTouchMode
(true); textview.requestFocus();

發現可以實現marquee的跑馬燈效果了~

不過樓主手賤,把textview.requestFocus()這段程式碼刪了發現還是可以實現…但是一旦別的控制元件獲取了焦點,跑馬燈效果就停止了,使用textview.requestFocus()獲取焦點後,效果又開始~