我有一個應用程序,實現一個自動完成文本視圖內的一個操作欄。我使用的操作欄福爾摩斯,這自動完成由標籤隱藏鍵盤從自動完成在行動酒吧的崩潰行動Sherlock不起作用
android:actionLayout="@layout/field_search"
從XML的菜單項的
顯示,如下圖所示。
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="@+id/autocomplete_menu_item"
android:showAsAction="always|collapseActionView"
android:actionLayout="@layout/field_search"
android:icon="@drawable/ic_search"
/>
</menu>
當單擊搜索圖標時,顯示用戶的鍵盤。當用戶選擇和項目時,將爲所選項目名稱修改自動完成文本視圖內容,並隱藏鍵盤。那麼這部分工作正常。
什麼不起作用的是鍵盤只在自動完成的點擊事件中被隱藏。因此,如果我點擊搜索項並且不選擇自動完成文本視圖的項目,然後單擊操作欄的主頁按鈕(關閉當前活動),則鍵盤不會關閉。它仍然打開。
我設置了home鍵(操作欄中的)可通過如下方法點擊:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
// Action bar back button.
case android.R.id.home:
onBackPressed();
return true;
case R.id.autocomplete_menu_item:
initializeAutoComplete();
return true;
// Default.
default:
return super.onOptionsItemSelected(item);
}
}
因此,onBackPressed()方法被調用。但鍵盤沒有關閉。
然後,我試圖在的onPause()方法來關閉鍵盤,如下所示:
@Override
protected void onPause() {
super.onPause();
// Closes keyboard before exit.
if (mKeyboardShown)
hideKeyboard(mAutoComplete);
}
再次,鍵盤沒有被關閉。
打開和關閉鍵盤的方法如下所示:
/**
* Shows the keyboard.
*
* @param view
*/
public void showKeyboard(View view) {
Context context = view.getContext();
InputMethodManager imm = (InputMethodManager)context.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY);
}
/**
* Hides the keyboard.
*
* @param view
*/
public void hideKeyboard(View view) {
Context context = view.getContext();
InputMethodManager imm = (InputMethodManager)context.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
管理自動完成如下所示的方法。
/**
* Calls the auto complete text view.
*/
public boolean initializeAutoComplete() {
if (mAutoComplete == null) return false;
// Cleans text.
mAutoComplete.setText("");
// Invoke virtual keyboard.
mAutoComplete.requestFocus();
showKeyboard(mAutoComplete);
mKeyboardShown = true;
// Creates an array adapter to display the school units from the auto complete text view.
final AutoCompleteAdapter adapter = new AutoCompleteAdapter(this, mList);
// Sets the click listener of the auto complete text view, to show the keyboard when the auto complete
// text view has shown the keyboard and this keyboard was closed (so the auto complete text view is been
// shown, but the keyboard don't, so we need to show it).
mAutoComplete.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
showKeyboard(mAutoComplete);
mKeyboardShown = true;
}
});
// Sets the click listener of the auto complete text view, to set the adapter.
mAutoComplete.setOnKeyListener(new OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
// Populate list with our static array of titles.
mAutoComplete.setAdapter(adapter);
return false;
}
});
// Sets the item click listener of the auto complete text view, to set the auto complete text view name,
// hide the keyboard, and hide the auto complete drop down.
mAutoComplete.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
// Get id of the unit from the adapter tag.
Integer nameId = (Integer)view.getTag();
// Get clicked id of the auto complete text view.
Data data = getDataById(nameId);
if (data != null) mAutoComplete.setText(data.getName());
else mAutoComplete.setText("Data not found.");
// Hide keyboard and hide auto complete drop down.
hideKeyboard(mAutoComplete);
mKeyboardShown = false;
mAutoComplete.setDropDownHeight(0);
}
});
return true;
}
因此,鍵盤顯示每次我打電話showKeyboard(時間),但只有當我在自動完成文本視圖的單擊事件中調用hideKeyboard()被隱藏。
看起來hideKeyboard()只在調用click事件時纔會得到「窗口標記」。但是我需要關閉鍵盤,而不僅僅是點擊事件。
在這個應用程序中有兩個活動:MainActivity和AutoCompleteActivity。下面我顯示1圖像中的6幀分割(從左至右/從上到下),示出了以下操作:輸入AutoCompleteActivity
- 後。
- 點擊搜索圖標後(此處調用鍵盤)。
- 鍵入一些文字後,自動完成顯示適配器找到的內容。
- 點擊自動完成顯示的項目後,自動完成的文本內容將更新爲所選項目的名稱(在本例中,「Apple」爲白色)。
- 點擊操作欄後退按鈕後,自動完成文本視圖是隱藏的,但不是鍵盤,甚至調用onBackPressed()(當onOptionsItemSelected()被調用)。
- 按下操作欄後退按鈕再次,我們又回到在MainActivity。但即使調用了AutoCompleteActivity的onPaused(),鍵盤仍保留在屏幕上。這怎麼會發生?
怎麼稱呼我解決這個問題?