2012-06-28 42 views
3

我有一個應用程序,實現一個自動完成文本視圖內的一個操作欄。我使用的操作欄福爾摩斯,這自動完成由標籤隱藏鍵盤從自動完成在行動酒吧的崩潰行動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

Image Link

  1. 後。
  2. 點擊搜索圖標後(此處調用鍵盤)。
  3. 鍵入一些文字後,自動完成顯示適配器找到的內容。
  4. 點擊自動完成顯示的項目後,自動完成的文本內容將更新爲所選項目的名稱(在本例中,「Apple」爲白色)。
  5. 點擊操作欄後退按鈕後,自動完成文本視圖是隱藏的,但不是鍵盤,甚至調用onBackPressed()(當onOptionsItemSelected()被調用)。
  6. 按下操作欄後退按鈕再次,我們又回到在MainActivity。但即使調用了AutoCompleteActivity的onPaused(),鍵盤仍保留在屏幕上。這怎麼會發生?

怎麼稱呼我解決這個問題?

回答

0

所以我關閉鍵盤時,我按下動作條的後退按鈕

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 

    System.out.println("itemid: " + item.getItemId()); 
    switch (item.getItemId()) { 
    case MENU_SEARCH: 

     item.setActionView(R.layout.searchedittext); 
     filterEdit = (EditText) item.getActionView().findViewById(
       R.id.filtrar2); 

     //Listener que se encarga de registrar los eventos de cuando se expande y se contrae la barra de busqueda en la actionbar 
     item.setOnActionExpandListener(new OnActionExpandListener() { 

      @Override 
      public boolean onMenuItemActionExpand(MenuItem item) { 
       // TODO Auto-generated method stub 
       return true; 
      } 

      //Cerramos el teclado al contraer la barra de busqueda 
      @Override 
      public boolean onMenuItemActionCollapse(MenuItem item) { 
       // TODO Auto-generated method stub 
       InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
       imm.hideSoftInputFromWindow(
         filterEdit.getWindowToken(), 0); 

       return true; 
      } 
     }); 

     break; 
    case android.R.id.home: 

     break; 

    default: 
     break; 
    } 
    return super.onOptionsItemSelected(item); 
}