2013-03-15 5 views
20

Wie ActionBar mit reduzierbaren Suchansicht mit einzelnen Aktionselement sichtbar, wenn Suchansicht erweitert wird? Um genauer zu sein beschreibend, ist es das, was ich brauche:Android ActionBar: reduzierbare SearchView mit Aktionstaste

enter image description here Hinweis, dass es andere Menüpunkte und android:uiOptions="splitActionBarWhenNarrow" in AndroidManifest.xml definiert.

Ich habe versucht, individuelle Artikel Layout einzurichten:

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> 

Aber defaul t Suchansicht nimmt alle verfügbaren Breite und Schaltfläche ist nicht sichtbar. Ich weiß nicht, wie man SearchView erzwingt, um den gesamten verfügbaren Platz zwischen App-Symbol und Menüelement zu füllen. Alles, was ich gefunden habe, ist android:maxWidth Eigenschaft, aber das erlaubt nur hardcoded Dimension, und ich bin auf der Suche nach etwas mehr flexible Lösung. Ich versuchte auch RelativeLayout mit android:layout_toRightOf="@id/search_view" ohne Glück.

Antwort

9

Nach Prüfung der Vorschläge von Kommentaren, gelang es vielen googeln und Tests, um die gewünschte Wirkung zu erhalten: Ihre menu.xml sollte wie folgt aussehen. Ich bin nicht stolz auf diese Lösung, aber es funktioniert, es ist nicht zu kompliziert und sollte für diesen Fall ausreichen.

Im Lebenslauf, was ich tat:

  1. Platziert SearchView mit custom "Add Item" Button in customView von ActionBar.
  2. collapseActionView und android:actionLayout von Suchbegriff entfernt menu.xml in
  3. /Einstürzen SearchView programmatisch erweitert.

Einige Code, um besser zu verstehen, was ich getan habe. Vielleicht kann das für jemanden nützlich sein.

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

Hallo, ich habe Ihre obige Lösung versucht, aber es funktioniert überhaupt nicht. Tatsächlich kann ich nichts von dem Action Item sehen. – AndoAiron

+0

Können Sie Fragmente Ihres Codes (z. B. gist) posten? Ich habe einige Tage damit verbracht, es herauszufinden und zu testen, denke, ich kann helfen. –

+0

Wo sollte ich mein Code-Fragment posten? Ich kann meinen Problemcode hier nicht als Kommentar posten. Könnten Sie mir bitte helfen, dies zu erreichen: http://stackoverflow.com/questions/15947557/sherlockactionbar-with-autocompletetextview-and-other-items?noredirect=1#comment22723847_15947557 – AndoAiron

2

Sie können dies nur mit yourmenu.xml tun.

Legen Sie fest, dass das andere Menüsymbol immer als Aktion angezeigt wird.

<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

Dieser Ansatz versucht. Wie ich bereits erwähnt habe, gibt es andere Menüpunkte und alle überlaufen die untere Aktionsleiste. Und ich brauche diese Add Action immer in der rechten oberen Ecke. –

+1

Das Detail in diesem Fall ist die geteilte Aktionsleiste, nicht die zusammenklappbare Suchansicht. Überprüfen Sie den folgenden Link. Es ist nicht möglich, dieses Verhalten mithilfe nativer Objekte festzulegen. Sie müssen Ihre eigene benutzerdefinierte Aktionsleiste erstellen. http://stackoverflow.com/questions/8571754/android-split-action-bar-with-action-items-on-the-top-and-bottom – JPMagalhaes

+0

Vielen Dank für den Rat, aber ich habe bereits versucht, auch dieses. Benutzerdefinierte ActionBar gibt mir benutzerdefinierte Ansicht, wenn SearchView minimiert ist. Dann habe ich meine einzige Taste an der oberen Leiste und diese Form menu.xml am unteren Rand. Das Problem ist, wenn SearchView erweitert ist. Ich muss es zwingen, den gesamten verfügbaren Platz zwischen App-Icon und Single-Action-Item zu füllen. Ich habe versucht zu verstehen, was in 'onMeasure()' der SearchView-Klasse passiert, verstehe aber nicht genau, was ich damit tun kann, und wenn es überhaupt eine richtige Richtung ist. Jede Hilfe wäre willkommen. –

1

einfach können Sie es tun wie dieses

@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; 
} 

Und Suchbegriff in menu.xml

showAsAction = "always"

Hinweis machen: Ich benutze android.support.v7.widget.SearchView, aber in Ihrem Fall ist es egal

+1

funktioniert nicht für mich: (( –

+0

) Ist dieser Code veraltet? – HMagdy

+0

@salma ja Sie Recht android.support.v7.widget.SearchView und android.widget.searchview seine Angelegenheit eine Menge –

0

Nur ein Änderungsmenü xml. showaction-Präfix zu Ihrem App-Namen

<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>