自定義View和鍵盤的一些思考

問題來源

這段時間在忙公司的新項目。在注冊頁面需要一個驗證碼填寫的view。大概長這樣。

大概長這樣

想了想,先去github上找找資源吧!感覺 GridPasswordView 這個不錯。

我:boss啊,能不能先模仿支付寶密碼那樣的形式啊
boss:恩,好吧。
我:謝謝boss,boss真帥

因為注冊頁面布局比較復(fù)雜。大概是RelativeLayout和LinearLayout嵌套了幾層。當(dāng)我進(jìn)入了驗證碼輸入的這個過程的時候,秉持著一個程序員的嚴(yán)謹(jǐn),我需要測試各種情況,模仿用戶會遇到的各種情況。我把鍵盤隱藏了下去,然后再次點擊。咦!鍵盤上來了,填寫驗證碼的view呢?去哪了?陷入了深深的悲傷之中。看來這個view,還是要自己去研究怎么擼了。

生活總會在你覺得你能成功偷懶的時候,給你當(dāng)頭棒喝 ---牛頓

先看看鍵盤問題吧。如果鍵盤能把整屏幕頂上去,那也能解決問題啊!
瀏覽了一番,發(fā)現(xiàn)了如下要點:

android:windowSoftInputMode="adjustPan"
android:windowSoftInputMode="adjustResize"

分別在代碼里面嘗試了一下,adjustPan是平移屏幕,就是默認(rèn)的EditText默認(rèn)的鍵盤平移效果,不能頂起GridPasswordView
adjustResize的效果是屏幕控件重新計算尺寸,壓縮尺寸,使得鍵盤可以全部顯示在屏幕中。在我的項目中,只能頂起一部分控件,背景卻沒有變化,導(dǎo)致布局錯亂。

既然鍵盤不行,我去自己寫個view可以不咯

其實,現(xiàn)在要解決我的問題,就是需要一個view。該view能像EditText一樣,能正常被鍵盤頂起,就行了。
在這里,真的很感謝一篇文章。這篇文章的主要思想,就是用一個view,直接獲取用戶輸入。簡單粗暴,i like it!我先把這個作者的view,放進(jìn)了自己的布局文件里,試了一下,yes!沒有問題,能被正常頂起!
開始研究代碼~
在這里,我只放出我覺得是核心的代碼

private InputMethodManager input;// 輸入法管理

@Override
public boolean onCheckIsTextEditor() {return true;}

@Override
public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
    outAttrs.inputType = InputType.TYPE_CLASS_NUMBER;//輸入類型為數(shù)字
    outAttrs.imeOptions = EditorInfo.IME_ACTION_DONE;
    return new MyInputConnection(this, false);
}

class MyInputConnection extends BaseInputConnection {

    public MyInputConnection(View targetView, boolean fullEditor) {
        super(targetView, fullEditor);
    }
    @Override
    public boolean commitText(CharSequence text, int newCursorPosition) {
        //這里是接受輸入法的文本的,我們只處理數(shù)字,所以什么操作都不做
        return super.commitText(text, newCursorPosition);
    }

    @Override
    public boolean deleteSurroundingText(int beforeLength, int afterLength) {
        //軟鍵盤的刪除鍵 DEL 無法直接監(jiān)聽,自己發(fā)送del事件
        if (beforeLength == 1 && afterLength == 0) {
            return super.sendKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DEL))
                        && super.sendKeyEvent(new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_DEL));
        }
        return super.deleteSurroundingText(beforeLength, afterLength);
    }
}

還有就是onTouch的鍵盤彈起和onWindowsFocusChanged失去焦點收起鍵盤的處理。

View類下的方法
boolean onCheckIsTextEditor ()
官方的解釋:

Check whether the called view is a text editor, in which case it would make sense to automatically display a soft input window for it. Subclasses should override this if they implement onCreateInputConnection(EditorInfo) to return true if a call on that method would return a non-null InputConnection, and they are really a first-class editor that the user would normally start typing on when the go into a window containing your view.
The default implementation always returns false. This does not mean that its onCreateInputConnection(EditorInfo) will not be called or the user can not otherwise perform edits on your view; it is just a hint to the system that this is not the primary purpose of this view.

大概的意思就是這個決定這個View是不是一個文本編輯器。如果返回true,則認(rèn)為這個view是可以被編輯的,那么用戶也必須自己實現(xiàn)onCreateInputConnection(EditorInfo) 來決定鍵盤的樣式,或者是不是應(yīng)該彈出鍵盤。(大概的意思就是這個吧,理解有錯誤請大家及時指出,在這里跪謝了~)。

下一步呢?

鍵盤頂起view是沒問題啦。驗證碼那個樣子,該怎么解決呢?
說到自定義view,那就不得不說到ViewGroup啦,實現(xiàn)onLayout這個方法,就可以自定義自己的view啦!ViewGroup可以addView想添加多少添加多少嘛。但是,RelativeLayout是ViewGroup的子類啊!在xml布局文件里面寫好所有布局,在RelativeLayout中使用getChild的方法,獲取控件對象以后,布局可以隨意控制了嘛~用了四個SquareItemLayout,每個SquareItemLayout里面一個ImageView(驗證碼邊框),TextView(數(shù)字顯示),ImageView(光標(biāo)顯示)。

大概就是這樣了。通過這件事,對Android的鍵盤控制更加了解了。對自定義Viewyou 了更近一步的了解。

接下來的目標(biāo)

RxJava RxAndroid Dagger2

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,428評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,024評論 3 413
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,285評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,548評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 71,328評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,878評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,971評論 3 439
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,098評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,616評論 1 331
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,554評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,725評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,243評論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 43,971評論 3 345
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,361評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,613評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,339評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 47,695評論 2 370

推薦閱讀更多精彩內(nèi)容