大家都知道在listView中使用editText,在輸入過程中是有衝突的。今天稍微研究了一下這個問題,有一點點小小的心得和大家一起分享下。
首先建立一個最簡單的demo,主界面就是一個ListView,其中list_item的佈局代碼如下:
1
2
3
4
5
6
7
8
9
10
11
12
|
<?xml
version= "1.0"
encoding= "utf-8" ?> <LinearLayout
xmlns:android= "http://schemas.android.com/apk/res/android" android:orientation= "vertical"
android:layout_width= "match_parent" android:layout_height= "match_parent" > <TextView
android:layout_width= "wrap_content" android:layout_height= "wrap_content"
android:text= "TextView" android:id= "@+id/textView1"
android:textSize= "20sp" ></TextView> <EditText
android:layout_width= "match_parent" android:layout_height= "wrap_content"
android:id= "@+id/editText1" > </EditText> </LinearLayout> |
很簡單list_item包含一個TextView,還有一個就是EditText。
運行後在某一項EditText進行輸入,點擊返回鍵隱藏輸入法鍵盤時會遇到一個問題即所有項的EditText內容都被清空了。
解決辦法:在Manifest中Activity標籤下加入android:windowSoftInputMode="adjustPan"。
這個問題是解決了,但是還有其他的問題。
當你點擊最後一項時,沒有問題,此時最後一項的EditText擁有焦點。然後,點擊系統返回鍵,再點擊最後一項,此時你會發現輸入法將最後一項完全擋住了(這樣很影響用戶體驗)。
解決方法:當點擊系統返回鍵時,讓其釋放焦點。
有人肯定會先這樣處理:
1
2
3
4
5
6
7
8
|
@Override public
boolean
onKeyDown( int
keyCode, KeyEvent event) { //
TODO Auto-generated method stub if
(keyCode == KeyEvent.KEYCODE_BACK) { //釋放焦點 } return
super .onKeyDown(keyCode,
event); } |
但是很遺憾,當輸入法鍵盤顯示的時候,你點擊系統的返回鍵事件被捕獲了,而不會在onKeyDown裏執行。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
@Override public
boolean
dispatchKeyEventPreIme(KeyEvent event) { if
(context != null )
{ InputMethodManager
imm = (InputMethodManager) context .getSystemService(Context.INPUT_METHOD_SERVICE); if
(imm.isActive() && event.getKeyCode() == KeyEvent.KEYCODE_BACK) { //釋放焦點 for
( int
i = 0 ;
i < getChildCount(); i++) { View
view = getChildAt(i); EditText
editText1 = (EditText) view .findViewById(R.id.editText1); editText1.clearFocus(); } } } return
super .dispatchKeyEventPreIme(event); } |
自定義控件重寫dispatchKeyEventPreIme方法判斷軟鍵處於活動狀態,並且用戶按下了返回鍵盤。
說到這裏提一下,自定義adapter的getView方法中view不要複用
1
2
3
4
5
|
@Override public
View getView( int
position, View convertView, ViewGroup parent) { convertView
= mLayoutInflater.inflate(R.layout.list_item, null ); return
convertView; } |
寫到這裏覺得這種實現方式和ScrollView+LinearLayout本質差不多
順便提一下怎麼保存數據:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
editText1.addTextChangedListener( new
TextWatcher() { @Override public
void
onTextChanged(CharSequence s, int
start, int
before, int
count) { } @Override public
void
beforeTextChanged(CharSequence s, int
start, int
count, int
after) { } @Override public
void
afterTextChanged(Editable s) { //保存數據 } });
|