android已经点击,【已解决】android中点击其他的(如Button等)但是EditText却没有失去焦点...
【問題】
android的app中,在對于EditText已經實現了:OnFocusChangeListener mFocusChangedListener;
EditText variableValueView = (EditText) variableLayout.findViewById(R.id.variableValue);
EditText variableValueView = (EditText) variableLayout.findViewById(R.id.variableValue);
mFocusChangedListener = new OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if(hasFocus){
}else {
}
}
};
而且也是達到預期的,當點擊可編輯的EditText時,得到focus,
點擊其他(已經被設置為不可編輯,但是可點擊,可以獲得焦點的)EditText時,焦點是可以失去的。
但是有個問題:
當點擊其他(菜單)按鈕時,EditText卻沒有像所希望的失去焦點。
【解決過程】
1.搜:
android edittext not lose focus when click other button
和:
edittext click other not lost focus
參考:
倒是想到:
對于此處,希望的是,點擊Menu的菜單的話,則可以對于那些Button或Menu,去復寫對應的onClick
事件,然后其中取消掉當前的EditText的焦點(如果當前的焦點是處于在某個EditText上面的話)
應該就可以了。
2.不過,對于此種做法,對于我當前的app來說,還不是最優的做法。
所以,還要先去試試:
把EditText中的值,如果有任何改動,就都調用我此處程序中的validate,然后同時獲得反饋,并更新對應的UI(即variable的status)
這樣,就不用關系EditText是否獲得或失去focus了。
所以去:
3.但是由于此處程序的邏輯有些特殊,會導致死循環,所以暫時放棄上面辦法,還是繼續此處的辦法:
當EditText點擊到別的Button或Menu時,讓其失去焦點,從而使得變量值可以得到校驗是否有效。
然后去看了看,此處不是button,所以沒法復寫onClick,然后只能在原先的menu的onOptionsItemSelected中去加代碼,如下:@Override
public boolean onOptionsItemSelected(MenuItem item) {
//clear current var value EditText focus
View curView = getCurrentFocus();
//if((null != curView) && (curView instanceof EditText) && (curView.isEnabled())){
if(isEditableEditText(curView)){
//being in Edit Mode
curView.clearFocus();
}
// Handle item selection
switch (item.getItemId()) {
case R.id.menu_discard:
...
return true;
case R.id.menu_send:
...
return true;
case R.id.menu_settings:
...
return true;
default:
return super.onOptionsItemSelected(item);
}
}
但是還是不能解決我此處問題:
希望是,在點擊了Menu后,在onOptionsItemSelected之前,就能夠clear掉之前EditText的focus,
這樣才能有機會去validate,然后接著調用到onOptionsItemSelected時,對于R.id.menu_send,才能去執行對應的send的動作,去寫入新的值。
4.所以還要再去,找到如何在Menu的onOptionsItemSelected之前,就將EditText的焦點的辦法。
搜:
android activity click
和:
android activity onclick event
參考:
另外通過:
找到官網的:
但是卻沒有找到任何和click有關的
5.參考:
去嘗試給ActionBarActionBar(?)中,加上onClick
但是另外搜:
android menu onclick
參考:
是可以給每個menu的item的xml中加上:android:onClick="doThis"
但是很明顯,對于每個都加,顯得效率很低。
所以暫時不用這個辦法。
6.參考:
中的解釋:
對于來說,有個:
android:onClickMethod name. The method to call when this menu item is clicked. The method must be declared in the activity as public and accept a
以及對應的示例代碼:
android:title="@string/item1"
android:icon="@drawable/group_item1_icon"
android:showAsAction="ifRoom|withText"/>
android:onClick="onGroupItemClick"
android:title="@string/group_item1"
android:icon="@drawable/group_item1_icon" />
android:onClick="onGroupItemClick"
android:title="@string/group_item2"
android:icon="@drawable/group_item2_icon" />
android:title="@string/submenu_title"
android:showAsAction="ifRoom|withText" >
android:title="@string/submenu_item1" />
和:public void onGroupItemClick(MenuItem item) {
// One of the group items (using the onClick attribute) was clicked
// The item parameter passed here indicates which item it is
// All other menu item clicks are handled by onOptionsItemSelected()
}
所以此處就可以去:
將我此處所關心的幾個menu的item,弄到一個group中,
然后對于整個的group,弄一個onClick
在其中,做自己需要的處理:clear掉當前EditText的focus
這樣估計就可以了。
去試試:
android:id="@+id/menu_discard"
android:icon="@drawable/error_white"
android:orderInCategory="1"
android:showAsAction="ifRoom|withText"
android:onClick="onMenuGroupEditClick"
android:title="@string/discard"/>
android:id="@+id/menu_send"
android:icon="@drawable/forward_white"
android:orderInCategory="2"
android:showAsAction="ifRoom|withText"
android:onClick="onMenuGroupEditClick"
android:title="@string/send"/>
android:id="@+id/menu_settings"
android:icon="@drawable/settings"
android:orderInCategory="3"
android:showAsAction="ifRoom|withText"
android:title="@string/settings"/>
然后去實現。
但是折騰期間,結果發現問題:
代碼中的注釋:// One of the group items (using the onClick attribute) was clicked
// The item parameter passed here indicates which item it is
// All other menu item clicks are handled by onOptionsItemSelected()
的含義很清楚:
如果此處menu的item實現了自己的onClick,那么,其的確是先于
onOptionsItemSelected
去處理的,但是卻導致
onOptionsItemSelected不會被調用了。。。
只會被你自己的onClick事件所處理
所以導致結果是:
即使此處實現了group中的item的onClick事件,那么其中要處理的內容(取消EditText的focus)和后續
類似于onOptionsItemSelected中的switch..case中處理對應item的內容,
也是先后順序就執行了,中間就沒有間隔了。
而這不是我要的,我要的是,先(取消EditText的focus)后(更新對應的值)
中間必須有間隔才行的。。。
7.目前實在很無奈的是,只能去試試:@Override
public boolean onOptionsItemSelected(MenuItem item) {
//clear current var value EditText focus
View curView = getCurrentFocus();
//if((null != curView) && (curView instanceof EditText) && (curView.isEnabled())){
if(isEditableEditText(curView)){
curView.clearFocus();
}
// Handle item selection
switch (item.getItemId()) {
case R.id.menu_discard:
//Toast.makeText(MainActivity.this, "Menu Discard cliked", Toast.LENGTH_SHORT).show();
clearEditedVarValues();
return true;
case R.id.menu_send:
//Toast.makeText(MainActivity.this, "Menu Send cliked", Toast.LENGTH_SHORT).show();
writeEditedVarValues();
return true;
case R.id.menu_settings:
return true;
default:
return super.onOptionsItemSelected(item);
}
}
中的clearFocus,能否直接觸發系統事件,從而導致別的相關代碼(EditText的OnFocusChangeListener)被調用
然后再回來繼續去執行對應的writeEditedVarValues等內容。
結果發現是可以的:
當執行了:curView.clearFocus();
接著會執行到對應的EditText的OnFocusChangeListener的,其中會去執行validate
然后接著可以再執行onOptionsItemSelected中的writeEditedVarValues了。
【總結】
此處,是間接實現最原始的目的:
當點擊Menu中的一個子菜單item時,原先的EditText并沒有失去焦點
的,辦法是:
當點擊了Menu的item時,此時去獲得當前焦點,判斷是所關心的EditText時,再去調用clearFocus去主動失去焦點,即可。
總結
以上是生活随笔為你收集整理的android已经点击,【已解决】android中点击其他的(如Button等)但是EditText却没有失去焦点...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 飞书app是做什么的(网易游戏飞飞为什么
- 下一篇: 备案iso(备案isp)