解決ListView中使用EditText所遇到的一些衝突

  

   大家都知道在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) {
                //保存數據
            }
        });


發佈了30 篇原創文章 · 獲贊 3 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章