2012-10-13 11 views
5

Ho usato ActionBarSherlock per creare ActionBar ha un pulsante di ricerca che mostra un AutoCompleteEditText (SHOW_AS_COLLAPSIBLE_ACTION_VIEW) Quando il pulsante Search viene cliccato, EditText viene mostrato, voglio EditText per ottenere attenzione e mostrare la tastiera virtuale in tal modo, come è ampliato questo è il codiceCome mettere a fuoco e mostrare la tastiera virtuale quando viene visualizzato EditText nella barra delle azioni?

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getSupportMenuInflater().inflate(R.menu.activity_main, menu); 

    boolean isLight = true; 
    // Add Search button 
    int menuItemId = menu 
      .add("Search") 
      .setIcon(
        isLight ? R.drawable.ic_search_inverse 
          : R.drawable.ic_search) 
      .setActionView(R.layout.collapsible_edittext) 
      .setShowAsActionFlags(
        MenuItem.SHOW_AS_ACTION_ALWAYS 
          | MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW) 
      .getItemId(); 
    // Add Search Topic (Sub Menu) 
    SubMenu subMenu1 = menu.addSubMenu("Topic"); 
    subMenu1.add(Menu.NONE, 10, 0, "All Topics"); 
    subMenu1.add(Menu.NONE, 11, 1, "Adult"); 
    subMenu1.add(Menu.NONE, 12, 2, "Pediatric"); 
    subMenu1.add(Menu.NONE, 13, 13, "Drug"); 

    MenuItem subMenu1Item = subMenu1.getItem(); 
    subMenu1Item.setIcon(R.drawable.abs__ic_menu_moreoverflow_holo_light); 
    subMenu1Item.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); 

    searchBar = (AutoCompleteTextView) menu.findItem(menuItemId) 
      .getActionView().findViewById(R.id.etSearch); 

    setSearchSettings(searchMenuID); 

    // get instance of Search Button 
    searchWidgetItem = menu.findItem(menuItemId); 

    searchBar 
      .setOnEditorActionListener(new EditText.OnEditorActionListener() { 


       @Override 
       public boolean onEditorAction(TextView v, int actionId, 
         KeyEvent event) { 
        if (actionId == EditorInfo.IME_ACTION_SEARCH) { 

         // Perform a Search 
         performSearch(v.getText().toString(), 
           (searchMenuID < 0) ? 3 : searchMenuID); 

         imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
         imm.hideSoftInputFromWindow(v.getWindowToken(), 0); 

         // Collapse the ActionView (Search Bar) 
         searchWidgetItem.collapseActionView(); 

         // Clear the TextEdit 
         v.setText(""); 

         return true; 
        } 
        return false; 
       } 
      }); 
    return true; 
} 

ho cercato di impostare un OnFocusChangeListener su EditText e mostrare soft keboard se è attivo, ma che non ha ancora funzionato:

searchBar.setOnFocusChangeListener(new OnFocusChangeListener() { 

      @Override 
      public void onFocusChange(View v, boolean hasFocus) { 
       if (hasFocus) { 
        imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
        imm.showSoftInput(v, InputMethodManager.SHOW_FORCED); 
       } 
      } 
     }); 

Come fare questo?

risposta

5

trovato la soluzione:

searchWidgetItem.setOnActionExpandListener(new OnActionExpandListener() { 

      @Override 
      public boolean onMenuItemActionExpand(MenuItem item) { 
       searchBar.post(new Runnable() { 
        @Override 
        public void run() { 
         searchBar.requestFocus(); 
         imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
         imm.showSoftInput(searchBar, 
           InputMethodManager.SHOW_IMPLICIT); 
        } 
       }); 
       return true; 
      } 

      @Override 
      public boolean onMenuItemActionCollapse(MenuItem item) { 

       return true; 
      } 
}); 
+0

Perché avete bisogno di inviare un Runnable ? –

4

Se avete ancora il problema, in modo da chiamare il seguente metodo

imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY); 

invece di

imm.showSoftInput(searchBar, InputMethodManager.SHOW_IMPLICIT); 
+0

Ho provato un sacco di cose, ma l'aggiunta di "HIDE_IMPLICIT_ONLY" ha fatto la differenza per me. – kaka

Problemi correlati