Wie kann man ActionBar
mit reduzierbarer Suchansicht mit sichtbarem Einzelaktionselement erstellen, wenn die Suchansicht erweitert ist? Um es genauer zu beschreiben, brauche ich Folgendes:
Beachten Sie, dass es andere Menüelemente gibt und
Android:uiOptions="splitActionBarWhenNarrow"
in AndroidManifest.xml
definiert ist.
Ich habe versucht, ein benutzerdefiniertes Layout für Suchartikel 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>
Standardmäßig nimmt die Suchansicht jedoch die gesamte verfügbare Breite ein und die Schaltfläche ist nicht sichtbar. Ich weiß nicht, wie ich SearchView
zwingen soll, den gesamten verfügbaren Platz zwischen App-Symbol und Menüelement zu füllen. Alles, was ich gefunden habe, ist Android:maxWidth
-Eigenschaft, aber dies erlaubt nur eine fest codierte Dimension und ich suche nach einer flexibleren Lösung. Ich habe auch RelativeLayout
mit Android:layout_toRightOf="@id/search_view"
ohne Erfolg ausprobiert.
Nach Überlegung der Vorschläge aus Kommentaren gelang es vielen Googeln und Testen, die gewünschte Wirkung zu erzielen. Ich bin nicht stolz auf diese Lösung, aber sie funktioniert, es ist nicht zu kompliziert und sollte für diesen Fall ausreichen.
Was ich getan habe:
SearchView
mit benutzerdefinierter Schaltfläche "Element hinzufügen" in customView
von ActionBar
. collapseActionView
und Android:actionLayout
aus dem Suchelement in menu.xml
entferntSearchView
programmatisch einklappen/erweitern.Etwas 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>
Hauptaktivität.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;
}
// ...
}
Sie können dies nur mit yourmenu.xml tun.
Stellen Sie Ihr anderes Menüsymbol so ein, dass es 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"
/>
Sie können es einfach so machen
@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 bei Suchpunkt in menu.xml machen
showAsAction = "immer"
Hinweis: Ich verwende Android.support.v7.widget.SearchView, aber in Ihrem Fall ist es egal
Nur eine Ä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>