日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

android已经点击,【已解决】android中点击其他的(如Button等)但是EditText却没有失去焦点...

發布時間:2023/12/2 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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却没有失去焦点...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。