web-dev-qa-db-ger.com

Android ActionBar: reduzierbare Suchansicht mit Aktionsschaltfläche

Wie kann man ActionBar mit reduzierbarer Suchansicht mit sichtbarem Einzelaktionselement erstellen, wenn die Suchansicht erweitert ist? Um es genauer zu beschreiben, brauche ich Folgendes: 

enter image description here 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.

20
Rafal Gałka

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: 

  1. Platzierte SearchView mit benutzerdefinierter Schaltfläche "Element hinzufügen" in customView von ActionBar
  2. collapseActionView und Android:actionLayout aus dem Suchelement in menu.xml entfernt
  3. SearchView 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;
    }

    // ...
}
9
Rafal Gałka

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"
 />
2
JPMagalhaes

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

1
Salma

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