2013-03-15 5 views
20

Come creare ActionBar con la visualizzazione di ricerca comprimibile visibile con la singola azione, quando la visualizzazione della ricerca è espansa? Per essere più descrittivo, questo è quello che mi serve:ActionBar Android: SearchView abbattibile con pulsante di azione

enter image description here noti che ci sono altre voci di menu e android:uiOptions="splitActionBarWhenNarrow" è definito in AndroidManifest.xml.

ho cercato di impostare il layout personalizzato tema:

menu.xml

<item 
    android:id="@+id/menu_search" 
    android:actionLayout="@layout/actionbar_search" 
    android:icon="@drawable/action_search" 
    android:showAsAction="always|collapseActionView" 
    android:title="@string/search" /> 

actionbar_search.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:gravity="right" 
    android:orientation="horizontal" > 

    <com.actionbarsherlock.widget.SearchView 
     android:id="@+id/search_view" 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     android:iconifiedByDefault="false" 
     android:queryHint="@string/search_hint" /> 

    <ImageButton 
     android:id="@+id/add_item" 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     style="@style/Widget.Sherlock.ActionButton" 
     android:src="@drawable/content_new"/> 

</LinearLayout> 

Ma defaul t la vista di ricerca occupa tutta la larghezza disponibile e il pulsante non è visibile. Non so come forzare SearchView per riempire tutto lo spazio disponibile tra l'icona dell'app e la voce di menu. Tutto quello che ho trovato è la proprietà android:maxWidth, ma questo consente solo la dimensione hardcoded e sto cercando una soluzione più flessibile. Ho provato anche a RelativeLayout con android:layout_toRightOf="@id/search_view" senza fortuna.

risposta

9

Dopo aver considerato le proposte da commenti, molti googling e test riusciti ad ottenere l'effetto desiderato. Non sono orgoglioso di questa soluzione, ma funziona, non è troppo complicato e dovrebbe essere sufficiente per questo caso.

Nella ripresa quello che ho fatto:

  1. collocato SearchView con l'abitudine pulsante "voce di aggiungere" in customView di ActionBar.
  2. Rimosso collapseActionView e android:actionLayout dalla voce di ricerca in menu.xml
  3. Crollare/espansione SearchView programmazione.

Alcuni codici per capire meglio cosa ho fatto. Forse questo può essere utile per qualcuno.

menu.xml

<item 
    android:id="@+id/menu_search" 
    android:icon="@drawable/action_search" 
    android:showAsAction="always" 
    android:title="@string/search" /> 

// ... other menu items 

actionbar_search.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:gravity="right" 
    android:orientation="horizontal"> 

    <com.actionbarsherlock.widget.SearchView 
     android:id="@+id/search_view" 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     android:iconifiedByDefault="false" 
     android:queryHint="@string/search_hint" 
     android:visibility="invisible" /> 

    <ImageButton 
     android:id="@+id/add_item" 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     style="@style/Widget.Sherlock.ActionButton" 
     android:src="@drawable/content_new" 
     android:title="@string/add_item" /> 

</LinearLayout> 

MainActivity.java

@Override 
public void onCreate(Bundle savedInstanceState) { 
    // ... 
    actionBar.setCustomView(R.layout.actionbar_search); 
    actionBarCustomView = ab.getCustomView(); 
    searchView = ((SearchView) actionBarCustomView.findViewById(R.id.search_view)); 
    searchView.setOnCloseListener(new SearchView.OnCloseListener() { 
     @Override 
     public boolean onClose() { 
      searchView.setVisibility(View.INVISIBLE); 
      return false; 
     } 
    }); 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
     // ... 
     case R.id.menu_search: 
      if (searchView.getVisibility() == View.VISIBLE) { 
       searchView.setIconified(true); 
       searchView.setVisibility(View.INVISIBLE); 
      } else { 
       searchView.setMaxWidth(abCustomView.getWidth() - addButton.getWidth()); 
       searchView.setVisibility(View.VISIBLE); 
       searchView.setIconified(false); 
      } 
      break; 
     // ... 
    } 
    return true; 
} 

@Override 
public void onBackPressed() { 

    if (searchView.getVisibility() == View.VISIBLE) { 
     searchView.setIconified(true); 
     searchView.setVisibility(View.INVISIBLE); 
     return; 
    } 

    // ... 
} 
+0

Ciao, ho provato la tua soluzione di cui sopra ma non funziona affatto. In effetti, non sono in grado di vedere alcun elemento dell'azione. – AndoAiron

+0

Puoi pubblicare frammenti del tuo codice (ad esempio come gist)? Ho passato alcuni giorni a capire e testare, penso di poterti aiutare. –

+0

dove dovrei pubblicare il mio frammento di codice ?? Non posso pubblicare il mio codice problema qui come commento. Inoltre, potresti aiutarmi per ottenere questo: http://stackoverflow.com/questions/15947557/sherlockactionbar-with-autocompletetextview-and-other-items?noredirect=1#comment22723847_15947557 – AndoAiron

2

È possibile farlo solo utilizzando yourmenu.xml.

Imposta l'altra icona del menu per mostrare sempre come azione. tuo menu.xml dovrebbe essere simile a questo:

<item 
    android:id="@+id/menu_search" 
    android:actionLayout="@layout/actionbar_search" 
    android:icon="@drawable/action_search" 
    android:showAsAction="always|collapseActionView" 
    android:title="@string/search" 
/> 
<item 
    android:id="@+id/your_other_menu_id" 
    android:showAsAction="always" 
    android:icon="@android:drawable/your_other_menu_ic" 
/> 
+0

Provato questo approccio. Come ho già detto, ci sono altre voci di menu e tutte sono sovrasfruttate nella barra delle azioni in basso. E ho bisogno di questa azione aggiunta sempre posizionata nell'angolo in alto a destra. –

+1

Il dettaglio in questo caso è la barra di azione divisa, non la vista di ricerca comprimibile. Controllare il collegamento qui sotto. Non è possibile impostare questo comportamento usando oggetti nativi. Dovrai creare la tua barra delle azioni personalizzata. http://stackoverflow.com/questions/8571754/android-split-action-bar-with-action-items-on-the-top-and-bottom – JPMagalhaes

+0

Grazie per il consiglio, ma ho già provato anche questo. Custom ActionBar mi dà una vista personalizzata quando SearchView è compresso. Poi ho il mio singolo pulsante nella barra in alto e quelli in menu menu.xml in fondo. Il problema si verifica quando SearchView è espanso. Devo forzarlo a riempire tutto lo spazio disponibile tra l'icona dell'app e la singola azione. Ho provato a capire cosa sta succedendo in 'onMeasure()' della classe SearchView ma non capisco esattamente cosa posso fare con questo, e se è, assolutamente, una giusta direzione. Qualsiasi aiuto sarebbe apprezzato. –

1

Semplicemente si può fare in questo modo

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.main, menu); 
    MenuItem searchItem = menu.findItem(R.id.action_search); 
    searchView = (SearchView) MenuItemCompat.getActionView(searchItem); 
    searchView.setIconified(true); //to be opened collapsed 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch(item.getItemId()){ 

     case R.id.action_search: 
      searchView.setIconified(false);// to Expand the SearchView when clicked 
      return true; 
    }  
    return false; 
} 

E in tema di menu.xml fanno

showAsAction = "always"

Nota: Sto usando android.support.v7.widget.SearchView ma nel tuo caso non importa

+1

non funziona per me: (( –

+0

Questo codice è deprecato? – HMagdy

+0

@salma si hai ragione android.support.v7.widget.SearchView e android.widget.searchview la sua questione molto –

0

Solo un menu di modifica xml. prefisso showaction al nome della tua app

<menu xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" > 

<item 
    android:id="@+id/menu_search" 
    android:actionLayout="@layout/actionbar_search" 
    android:icon="@drawable/action_search" 
    app:showAsAction="always|collapseActionView" 
    android:title="@string/search" 
/> 

</menu>