問題說明: activity中有個三級菜單,三個ListView嵌套,最後一層ListView的item中有EditText控制項。要求EditText不僅能手動輸入,還能點擊加減進行改變。EditText改變後各級目錄的得分情況要實時改變。 在EditText獲取焦點的時候點擊關閉二級目錄,或者在E ...
問題說明:
activity中有個三級菜單,三個ListView嵌套,最後一層ListView的item中有EditText控制項。要求EditText不僅能手動輸入,還能點擊加減進行改變。EditText改變後各級目錄的得分情況要實時改變。
在EditText獲取焦點的時候點擊關閉二級目錄,或者在EditText數字改變的時候刷新最外層的adapter時會報錯--java.lang.IllegalArgumentException: parameter must be a descendant of this view。
原因分析:
出現這個bug的前提條件:當listview向下滾動了再返回時會調用HorizontalScrollView的onSizeChanged()方法,在onSizeChanged()方法中調用了findfocus方法得到返回的界面中當前擁有焦點的view。
解決方法:
在關閉二級目錄或刷新adapter之前把焦點轉移,直接落在某一指定的view上,或者在activity中聲明一個空view然後Gone掉,讓焦點落在空view上。
讓EditText失去焦點、關閉軟鍵盤並刷新adapater的代碼參考:
tv_title.setFocusable(true); tv_title.setFocusable(true); tv_title.setFocusableInTouchMode(true); tv_title.requestFocus(); tv_title.findFocus(); InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(getWindow().getDecorView().getWindowToken(), 0); adapter.notifyDataSetChanged();