Android開發中ListView與EditText的衝突彙總

在安卓開發的過程當中,遇到了listview遇見item中有edittext嵌套的問題,剛開始討論的時候感受這還不是很簡單的事,實際操做中遇到了各式各樣的問題ide

 

點擊EditText彈出軟鍵盤致使EditText焦點丟失和文本重置問題

問題描述:點擊EditText,彈出軟鍵盤,會致使ListView調用getView()重繪,從而致使原本應該在EditText上的焦點被刷新而消失了,從而在軟鍵盤上輸入任何文字都沒有顯示沒有效果,必須再點擊一次EditText纔會有焦點,而且不管輸入什麼內容隱藏軟鍵盤後再次因爲重繪又變回原來的文本內容。this

 

解決方案spa

定義一個整型變量來標誌點擊的是哪一個EditText:.net

private int index = -1;  事件

 

在getView中爲EditText添加onTouch事件:開發

 

  1. rightEt.setOnTouchListener(new View.OnTouchListener() {  
  2.         @Override  
  3.         public boolean onTouch(View v, MotionEvent event) {  
  4.             if (event.getAction() == MotionEvent.ACTION_UP) {  
  5.                 index = position;  
  6.             }  
  7.             return false;  
  8.         }  
  9. }); 

在getView()的結尾處判斷當前繪製的Item的position是否是剛纔點擊的那個EditText:get

 

  1. rightEt.clearFocus();  
  2. if(index != -1 && index == position){  
  3.      //強制加上焦點  
  4.      rightEt.requestFocus();  
  5.      //設置光標顯示到編輯框尾部  
  6.      rightEt.setSelection(rightEt .getText().length());  
  7.      //重置  
  8.      index = -1;  
  9. }  

思路:點擊某個Item裏的EditText,將該Item的position賦給index,彈出軟鍵盤以後,ListView所有從新繪製,每次調用getView時都進行判斷當前繪製的Item是不是點擊的那個EditText所在的Item,若是是,則將該EditText對焦,並設置光標顯示於文本尾部。it

 

解決了焦點問題,還須要解決EditText文本被從新繪製問題:io

爲EditText設置OnFocusChangeListener事件:event

 

 

  1. rightEt.setOnFocusChangeListener(new View.OnFocusChangeListener() {  
  2.     @Override  
  3.     public void onFocusChange(View v, boolean hasFocus) {  
  4.         if(!hasFocus){  
  5.             datas.get(position).setStrRightTv(rightEt.getText().toString());  
  6.         }  
  7.     }  
  8. });  

思路:一旦失去了焦點,就用此時的EditText上的文本內容去更新數據源。

ListView與EditText多行文本時的滑動衝突問題

問題描述:當EditText嵌套在ListView中且EditText設置是多行文本時,EditText自己內容本應該自帶滾動效果,但當點擊EditText內部滑動的時候,發現失效,這是因爲外層的ListView攔截了它的子控件EditText的事件致使的。

解決方案

 

 

  1. mEditText.setOnTouchListener(this);    
  2.     
  3. @Override    
  4. public boolean onTouch(View v, MotionEvent event) {    
  5.     switch (v.getId()) {    
  6.         case R.id.edit_text:    
  7.             v.getParent().requestDisallowInterceptTouchEvent(true);    
  8.             switch (event.getAction()) {    
  9.                 case MotionEvent.ACTION_UP:    
  10.                     v.getParent().requestDisallowInterceptTouchEvent(false);    
  11.                     break;    
  12.             }    
  13.     }    
  14.     return false;    
  15. }    
相關文章
相關標籤/搜索