乙個edit text 實現

2022-04-30 13:42:09 字數 1408 閱讀 7182

場景:需要動態生成用於單詞填寫的一系列edittext,要求是一空填乙個字母。edittext不能點選,填完乙個詞就進入下乙個空格,點選軟鍵盤的刪除按鈕,就把當前格的字母刪除並進入上乙個空格。

要點1:動態生成edittext,具體來說就是,每給定乙個單詞,要根據單詞的長度來生成相應數量的edittext,每乙個控制項能且僅能填寫乙個字母。

思路①:使用addview的方法,動態地在執行中知道需要的數量之後向布局中新增控制項,但是由於不熟悉這個方法,所以沒有用;

思路②:比較偷懶的方法,就是直接在布局中預先新增了數十個edittext,然後將所有控制項設定為invisible,在執行過程中直接根據需要,把相應數量的控制項設為可見即可。

思路:為每乙個edittext控制項設定textwatcher,並設定乙個全域性計數器,記住當前的edittext下標,例如叫做currentposition。在aftertextchanged方法裡面,如果檢測到當前的edittext中獲取到的文字已經》=1(實際上每個edittext的最大容納字元為2,因為刪除操作之後,又進行輸入操作時的需要),就讓下乙個控制項獲取焦點,此外對第乙個控制項和最後乙個控制項做一點特殊情況的處理。

至於軟鍵盤的刪除鍵,則可以為每乙個edittext設定乙個onkeydown監聽,可以監聽到按下del鍵的操作。然後使用handler讓主線程更新ui。具體更新過程是,把當前要刪除的edittext置為空,然後讓currentposition減一,並讓上乙個edittext控制項獲取焦點(這裡要注意的是,ui上將當前edittext置為空,和手動輸入一樣,也會觸發textwatcher的事件)。同時,因為上乙個控制項已經輸入了字元,此時可以用setselection方法讓游標出於最右邊,方便接下來的輸入。

在刪除操作之後的輸入,是輸入在已經有乙個字元的edittext中的,所以這裡進行乙個小小的操作,在textwatcher裡檢測到edittext中有兩個字元時,就馬上將該edittext中的第二個字元擷取,並放入下乙個edittext中,同時將讓下乙個edittext獲取焦點。這乙個特性用split方法即可實現。

要點3:edittext不能點選獲取焦點,但能輸入。

思路:對每乙個edittext重寫ontouch方法,其中的操作不重要,但最後返回true值,就可以把點選事件consume掉,以至於edittext無法通過手動點選的方式獲取焦點。

此外走過的彎路包括,在布局中調整clickable, enable, 在父控制項中加入focusable=true;focusableintouchmode=true;希望父控制項能將點選事件事先consume掉,但是都不能達到效果。

但是這一方法的弊端就是,讓edittext完全不可響應,只能根據預先安排好的順序進行輸入。在手動收起軟鍵盤之後不能通過在ontouch方法中呼叫彈出軟體盤的方法。

實現乙個Semaphore

其實這是我boss的想法,我一開始聽他這麼說也覺得比較差異,ms已經寫好了何必再自己寫乙個.答案有兩個 1ms寫的東西未必就是最好的,如完成埠,heap等.2semaphore是多執行緒程式設計中的核心元素所以有必要提速.我們都知道在多執行緒中ms提供的多個現成阻塞核心物件中critical mon...

乙個Redis Cache實現

應用中需要通過http呼叫遠端的資料,但是這個獲取過程需要執行較長時間,而且這個資料本身的變化也不頻繁,這種情況最適合用乙個cache來優化。前兩年在做短鏈結實現的時候,曾經用最好的語言php做過乙個redis cache實現 乙個簡單的redis應用 修訂版 但那個畢竟是乙個特定的實現,而且我現在...

實現乙個call

call是js最好用的函式之一,改變函式上下文是外掛程式編寫最經常使用的特性。var name 小鋼炮 var cat function say name say ketty 小鋼炮 ketty say.call cat,ketty 貓 ketty看下面 function say name var ...