關於android:descendantFocusability

最近修改一個功能,EditText一開始默認不獲焦點,等點擊Edittext的時候,再獲得焦點並彈軟鍵盤。
按照常規操作,
一開始在代碼中設置Edittext沒有焦點:

tv_subject.clearFocus();

當它需要焦點的時候,讓其獲取焦點:

 tv_subject.setFocusable(true);
 tv_subject.setFocusableInTouchMode(true);
 tv_subject.requestFocus();
 tv_subject.requestFocusFromTouch();
 //需要光標閃動
 tv_subject.setCursorVisible(true);

然後調用彈出軟鍵盤的代碼。
發現沒有效果!
後面根據網上的一些說法,又嘗試了下面的做法,不行!

    tv_subject.postDelayed(new Runnable() {
        @Override
        public void run() {
            tv_subject.setFocusable(true);
            tv_subject.setFocusableInTouchMode(true);
            tv_subject.requestFocus();
            tv_subject.requestFocusFromTouch();

        }
    },500);

總之軟鍵盤就是死活不出來!

後面終於找到了原因,原來是在EditText的某一層根佈局中有這樣一個屬性:

android:descendantFocusability="blocksDescendants"

該屬性是當一個爲view獲取焦點時,定義viewGroup和其子控件兩者之間的關係。

屬性的值有三種:

    beforeDescendants:viewgroup會優先其子類控件而獲取到焦點

    afterDescendants:viewgroup只有當其子類控件不需要獲取焦點時才獲取焦點

    blocksDescendants:viewgroup會覆蓋子類控件而直接獲得焦點

原來是上層的控件直接就已經將焦點給搶走了,纔會導致軟鍵盤彈不出來!

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