wake-up-neo.net

Erstellen einer SearchView, die den Richtlinien für das Materialdesign entspricht

Ich bin gerade dabei zu lernen, wie ich meine App in Materialdesign umwandle, und stecke gerade ein bisschen fest. Ich habe die Symbolleiste hinzugefügt und die Navigationsleiste über den gesamten Inhalt gelegt.

Ich versuche jetzt, eine erweiterbare Suche zu erstellen, die der in den Materialrichtlinien entspricht: enter image description here

Das ist es, was ich gerade habe und ich kann nicht herausfinden, wie ich es so mache:
My search

Dies ist meine Menü-XML:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto">
    <item
        Android:id="@+id/action_search"
        Android:icon="@Android:drawable/ic_menu_search"
        Android:title="Search"
        app:showAsAction="always"
        app:actionViewClass="Android.support.v7.widget.SearchView" />
</menu>

Das funktioniert, ich erhalte einen Menüpunkt, der sich zu SearchView erweitert, und ich kann meine Liste gut filtern. Es sieht jedoch nicht so aus wie auf dem ersten Bild.

Ich habe versucht, MenuItemCompat.setOnActionExpandListener() für R.id.action_search Zu verwenden, damit ich das Startseitensymbol in einen Rückwärtspfeil ändern kann, aber das scheint nicht zu funktionieren. Im Listener wird nichts ausgelöst. Selbst wenn das klappen würde, wäre es dem ersten Bild nicht sehr nahe.

Wie erstelle ich eine Suchansicht in der neuen AppCompat-Symbolleiste, die den Materialrichtlinien entspricht?

132
Mike

Nach einer Woche voller Rätsel. Ich glaube, ich habe es herausgefunden.
Ich verwende jetzt nur einen EditText in der Toolbar. Dies wurde mir von oj88 auf reddit vorgeschlagen.

Ich habe jetzt folgendes:
New SearchView

Zuerst habe ich in onCreate () meiner Aktivität den EditText mit einer Bildansicht auf der rechten Seite zur Symbolleiste hinzugefügt:

    // Setup search container view
    searchContainer = new LinearLayout(this);
    Toolbar.LayoutParams containerParams = new Toolbar.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
    containerParams.gravity = Gravity.CENTER_VERTICAL;
    searchContainer.setLayoutParams(containerParams);

    // Setup search view
    toolbarSearchView = new EditText(this);
    // Set width / height / gravity
    int[] textSizeAttr = new int[]{Android.R.attr.actionBarSize};
    int indexOfAttrTextSize = 0;
    TypedArray a = obtainStyledAttributes(new TypedValue().data, textSizeAttr);
    int actionBarHeight = a.getDimensionPixelSize(indexOfAttrTextSize, -1);
    a.recycle();
    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(0, actionBarHeight);
    params.gravity = Gravity.CENTER_VERTICAL;
    params.weight = 1;
    toolbarSearchView.setLayoutParams(params);

    // Setup display
    toolbarSearchView.setBackgroundColor(Color.TRANSPARENT);
    toolbarSearchView.setPadding(2, 0, 0, 0);
    toolbarSearchView.setTextColor(Color.WHITE);
    toolbarSearchView.setGravity(Gravity.CENTER_VERTICAL);
    toolbarSearchView.setSingleLine(true);
    toolbarSearchView.setImeActionLabel("Search", EditorInfo.IME_ACTION_UNSPECIFIED);
    toolbarSearchView.setHint("Search");
    toolbarSearchView.setHintTextColor(Color.parseColor("#b3ffffff"));
    try {
        // Set cursor colour to white
        // https://stackoverflow.com/a/26544231/1692770
        // https://github.com/Android/platform_frameworks_base/blob/KitKat-release/core/Java/Android/widget/TextView.Java#L562-564
        Field f = TextView.class.getDeclaredField("mCursorDrawableRes");
        f.setAccessible(true);
        f.set(toolbarSearchView, R.drawable.edittext_whitecursor);
    } catch (Exception ignored) {
    }

    // Search text changed listener
    toolbarSearchView.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            Fragment mainFragment = getFragmentManager().findFragmentById(R.id.container);
            if (mainFragment != null && mainFragment instanceof MainListFragment) {
                ((MainListFragment) mainFragment).search(s.toString());
            }
        }

        @Override
        public void afterTextChanged(Editable s) {
            // https://stackoverflow.com/a/6438918/1692770
            if (s.toString().length() <= 0) {
                toolbarSearchView.setHintTextColor(Color.parseColor("#b3ffffff"));
            }
        }
    });
    ((LinearLayout) searchContainer).addView(toolbarSearchView);

    // Setup the clear button
    searchClearButton = new ImageView(this);
    Resources r = getResources();
    int px = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 16, r.getDisplayMetrics());
    LinearLayout.LayoutParams clearParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
    clearParams.gravity = Gravity.CENTER;
    searchClearButton.setLayoutParams(clearParams);
    searchClearButton.setImageResource(R.drawable.ic_close_white_24dp); // TODO: Get this image from here: https://github.com/google/material-design-icons
    searchClearButton.setPadding(px, 0, px, 0);
    searchClearButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            toolbarSearchView.setText("");
        }
    });
    ((LinearLayout) searchContainer).addView(searchClearButton);

    // Add search view to toolbar and hide it
    searchContainer.setVisibility(View.GONE);
    toolbar.addView(searchContainer);

Das hat funktioniert, aber dann bin ich auf ein Problem gestoßen, bei dem onOptionsItemSelected () nicht aufgerufen wurde, als ich auf die Home-Schaltfläche tippte. Daher konnte ich die Suche nicht durch Drücken der Home-Taste abbrechen. Ich habe verschiedene Möglichkeiten ausprobiert, um den Klicklistener auf der Startseite zu registrieren, aber sie haben nicht funktioniert.

Irgendwann stellte ich fest, dass der ActionBarDrawerToggle, den ich hatte, Probleme mit den Dingen hatte, und entfernte ihn. Dieser Listener fing dann an zu arbeiten:

    toolbar.setNavigationOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // toolbarHomeButtonAnimating is a boolean that is initialized as false. It's used to stop the user pressing the home button while it is animating and breaking things.
            if (!toolbarHomeButtonAnimating) {
                // Here you'll want to check if you have a search query set, if you don't then hide the search box.
                // My main fragment handles this stuff, so I call its methods.
                FragmentManager fragmentManager = getFragmentManager();
                final Fragment fragment = fragmentManager.findFragmentById(R.id.container);
                if (fragment != null && fragment instanceof MainListFragment) {
                    if (((MainListFragment) fragment).hasSearchQuery() || searchContainer.getVisibility() == View.VISIBLE) {
                        displaySearchView(false);
                        return;
                    }
                }
            }

            if (mDrawerLayout.isDrawerOpen(findViewById(R.id.navigation_drawer)))
                mDrawerLayout.closeDrawer(findViewById(R.id.navigation_drawer));
            else
                mDrawerLayout.openDrawer(findViewById(R.id.navigation_drawer));
        }
    });

So kann ich jetzt die Suche mit der Home-Taste abbrechen, aber ich kann die Zurück-Taste noch nicht drücken, um sie abzubrechen. Also habe ich dies zu onBackPressed () hinzugefügt:

    FragmentManager fragmentManager = getFragmentManager();
    final Fragment mainFragment = fragmentManager.findFragmentById(R.id.container);
    if (mainFragment != null && mainFragment instanceof MainListFragment) {
        if (((MainListFragment) mainFragment).hasSearchQuery() || searchContainer.getVisibility() == View.VISIBLE) {
            displaySearchView(false);
            return;
        }
    }

Ich habe diese Methode erstellt, um die Sichtbarkeit von EditText und Menüpunkt umzuschalten:

public void displaySearchView(boolean visible) {
    if (visible) {
        // Stops user from being able to open drawer while searching
        mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);

        // Hide search button, display EditText
        menu.findItem(R.id.action_search).setVisible(false);
        searchContainer.setVisibility(View.VISIBLE);

        // Animate the home icon to the back arrow
        toggleActionBarIcon(ActionDrawableState.ARROW, mDrawerToggle, true);

        // Shift focus to the search EditText
        toolbarSearchView.requestFocus();

        // Pop up the soft keyboard
        new Handler().postDelayed(new Runnable() {
            public void run() {
                toolbarSearchView.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN, 0, 0, 0));
                toolbarSearchView.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_UP, 0, 0, 0));
            }
        }, 200);
    } else {
        // Allows user to open drawer again
        mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED);

        // Hide the EditText and put the search button back on the Toolbar.
        // This sometimes fails when it isn't postDelayed(), don't know why.
        toolbarSearchView.postDelayed(new Runnable() {
            @Override
            public void run() {
                toolbarSearchView.setText("");
                searchContainer.setVisibility(View.GONE);
                menu.findItem(R.id.action_search).setVisible(true);
            }
        }, 200);

        // Turn the home button back into a drawer icon
        toggleActionBarIcon(ActionDrawableState.BURGER, mDrawerToggle, true);

        // Hide the keyboard because the search box has been hidden
        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(toolbarSearchView.getWindowToken(), 0);
    }
}

Ich brauchte eine Möglichkeit, die Home-Schaltfläche in der Symbolleiste zwischen dem Schubladensymbol und der Zurück-Schaltfläche umzuschalten. Ich fand schließlich die Methode unten in this SO answer . Obwohl ich sie leicht modifiziert habe, um mir mehr Sinn zu machen:

private enum ActionDrawableState {
    BURGER, ARROW
}

/**
 * Modified version of this, https://stackoverflow.com/a/26836272/1692770<br>
 * I flipped the start offset around for the animations because it seemed like it was the wrong way around to me.<br>
 * I also added a listener to the animation so I can find out when the home button has finished rotating.
 */
private void toggleActionBarIcon(final ActionDrawableState state, final ActionBarDrawerToggle toggle, boolean animate) {
    if (animate) {
        float start = state == ActionDrawableState.BURGER ? 1.0f : 0f;
        float end = Math.abs(start - 1);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
            ValueAnimator offsetAnimator = ValueAnimator.ofFloat(start, end);
            offsetAnimator.setDuration(300);
            offsetAnimator.setInterpolator(new AccelerateDecelerateInterpolator());
            offsetAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                @Override
                public void onAnimationUpdate(ValueAnimator animation) {
                    float offset = (Float) animation.getAnimatedValue();
                    toggle.onDrawerSlide(null, offset);
                }
            });
            offsetAnimator.addListener(new Animator.AnimatorListener() {
                @Override
                public void onAnimationStart(Animator animation) {

                }

                @Override
                public void onAnimationEnd(Animator animation) {
                    toolbarHomeButtonAnimating = false;
                }

                @Override
                public void onAnimationCancel(Animator animation) {

                }

                @Override
                public void onAnimationRepeat(Animator animation) {

                }
            });
            toolbarHomeButtonAnimating = true;
            offsetAnimator.start();
        }
    } else {
        if (state == ActionDrawableState.BURGER) {
            toggle.onDrawerClosed(null);
        } else {
            toggle.onDrawerOpened(null);
        }
    }
}

Das funktioniert, ich habe es geschafft, ein paar Bugs herauszufinden, die ich auf dem Weg gefunden habe. Ich denke nicht, dass es 100% ist, aber es funktioniert gut genug für mich.

BEARBEITEN: Wenn Sie die Suchansicht in XML anstelle von Java hinzufügen möchten, gehen Sie folgendermaßen vor:

toolbar.xml:

<Android.support.v7.widget.Toolbar 
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto"
    Android:id="@+id/toolbar"
    contentInsetLeft="72dp"
    contentInsetStart="72dp"
    Android:layout_width="match_parent"
    Android:layout_height="?attr/actionBarSize"
    Android:background="?attr/colorPrimary"
    Android:elevation="4dp"
    Android:minHeight="?attr/actionBarSize"
    app:contentInsetLeft="72dp"
    app:contentInsetStart="72dp"
    app:popupTheme="@style/ActionBarPopupThemeOverlay"
    app:theme="@style/ActionBarThemeOverlay">

    <LinearLayout
        Android:id="@+id/search_container"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        Android:gravity="center_vertical"
        Android:orientation="horizontal">

        <EditText
            Android:id="@+id/search_view"
            Android:layout_width="0dp"
            Android:layout_height="?attr/actionBarSize"
            Android:layout_weight="1"
            Android:background="@Android:color/transparent"
            Android:gravity="center_vertical"
            Android:hint="Search"
            Android:imeOptions="actionSearch"
            Android:inputType="text"
            Android:maxLines="1"
            Android:paddingLeft="2dp"
            Android:singleLine="true"
            Android:textColor="#ffffff"
            Android:textColorHint="#b3ffffff" />

        <ImageView
            Android:id="@+id/search_clear"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:layout_gravity="center"
            Android:paddingLeft="16dp"
            Android:paddingRight="16dp"
            Android:src="@drawable/ic_close_white_24dp" />
    </LinearLayout>
</Android.support.v7.widget.Toolbar>

onCreate () Ihrer Aktivität:

    searchContainer = findViewById(R.id.search_container);
    toolbarSearchView = (EditText) findViewById(R.id.search_view);
    searchClearButton = (ImageView) findViewById(R.id.search_clear);

    // Setup search container view
    try {
        // Set cursor colour to white
        // https://stackoverflow.com/a/26544231/1692770
        // https://github.com/Android/platform_frameworks_base/blob/KitKat-release/core/Java/Android/widget/TextView.Java#L562-564
        Field f = TextView.class.getDeclaredField("mCursorDrawableRes");
        f.setAccessible(true);
        f.set(toolbarSearchView, R.drawable.edittext_whitecursor);
    } catch (Exception ignored) {
    }

    // Search text changed listener
    toolbarSearchView.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            Fragment mainFragment = getFragmentManager().findFragmentById(R.id.container);
            if (mainFragment != null && mainFragment instanceof MainListFragment) {
                ((MainListFragment) mainFragment).search(s.toString());
            }
        }

        @Override
        public void afterTextChanged(Editable s) {
        }
    });

    // Clear search text when clear button is tapped
    searchClearButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            toolbarSearchView.setText("");
        }
    });

    // Hide the search view
    searchContainer.setVisibility(View.GONE);
83
Mike

Dies ist eigentlich ganz einfach, wenn Sie die Bibliothek Android.support.v7 Verwenden.

Schritt 1

Deklarieren Sie einen Menüpunkt

<item Android:id="@+id/action_search"
    Android:title="Search"
    Android:icon="@drawable/abc_ic_search_api_mtrl_alpha"
    app:showAsAction="ifRoom|collapseActionView"
    app:actionViewClass="Android.support.v7.widget.SearchView" />

Schritt 2

Erweitern Sie AppCompatActivity und richten Sie im onCreateOptionsMenu den SearchView ein.

import Android.support.v7.widget.SearchView;

...

public class YourActivity extends AppCompatActivity {

    ...

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_home, menu);
        // Retrieve the SearchView and plug it into SearchManager
        final SearchView searchView = (SearchView) MenuItemCompat.getActionView(menu.findItem(R.id.action_search));
        SearchManager searchManager = (SearchManager) getSystemService(SEARCH_SERVICE);
        searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
        return true;
    }

    ... 

}

Ergebnis

enter image description here

enter image description here

152
Subin Sebastian

Ich weiß, dass es ein alter Thread ist, aber ich poste immer noch die Bibliothek, die ich gerade erstellt habe. Hoffe das könnte jemandem helfen.

https://github.com/Shahroz16/material-searchview

Meterial Search View

21
ShahrozKhan91

Der erste Screenshot in Ihrer Frage ist kein öffentliches Widget. Der Support von SearchView ( Android.support.v7.widget.SearchView ) imitiert Android 5.0 Lollipop's SearchView ( Android.widget.SearchView ). Ihr zweiter Screenshot wird von anderen von Material gestalteten Apps wie Google Play verwendet.

Die SearchView in Ihrem ersten Screenshot wird in Drive, YouTube und anderen Closed-Source-Google Apps verwendet. Glücklicherweise wird es auch im Android 5.0 Dialer verwendet. Sie können versuchen, die Ansicht zurück zu portieren, es werden jedoch einige 5.0-APIs verwendet.

Die Klassen, die Sie sich ansehen möchten, sind:

SearchEditTextLayout , AnimUtils und DialtactsActivity um zu verstehen, wie die Ansicht verwendet wird. Sie benötigen auch Ressourcen von ContactsCommon .

Viel Glück.

19
Jared Rummler

Hier ist mein Versuch, dies zu tun:

Schritt 1: Erstellen Sie einen Stil mit dem Namen SearchViewStyle

<style name="SearchViewStyle" parent="Widget.AppCompat.SearchView">
    <!-- Gets rid of the search icon -->
    <item name="searchIcon">@drawable/search</item>
    <!-- Gets rid of the "underline" in the text -->
    <item name="queryBackground">@null</item>
    <!-- Gets rid of the search icon when the SearchView is expanded -->
    <item name="searchHintIcon">@null</item>
    <!-- The hint text that appears when the user has not typed anything -->
    <item name="queryHint">@string/search_hint</item>
</style>

Schritt 2: Erstellen Sie ein Layout mit dem Namen simple_search_view_item.xml

<?xml version="1.0" encoding="utf-8"?>
<Android.support.v7.widget.SearchView
    Android:layout_gravity="end"
    Android:layout_height="wrap_content"
    Android:layout_width="match_parent"
    style="@style/SearchViewStyle"
    xmlns:Android="http://schemas.Android.com/apk/res/Android" />  

Schritt 3: Erstellen Sie einen Menüpunkt für diese Suchansicht

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto">
    <item
        app:actionLayout="@layout/simple_search_view_item"
        Android:title="@string/search"
        Android:icon="@drawable/search"
        app:showAsAction="always" />
</menu>  

Schritt 4: Pumpen Sie das Menü auf

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.menu_searchable_activity, menu);
    return true;
}  

Ergebnis:

enter image description here

Das einzige, was ich nicht tun konnte, war, es die gesamte Breite des Toolbar ausfüllen zu lassen. Wenn mir jemand dabei helfen könnte, wäre das Gold wert.

18
Little Child

Um das gewünschte Erscheinungsbild von SearchView zu erzielen, können Sie Stile verwenden.

Zuerst müssen Sie style für Ihre SearchView erstellen, was ungefähr so ​​aussehen sollte:

<style name="CustomSearchView" parent="Widget.AppCompat.SearchView">
    <item name="searchIcon">@null</item>
    <item name="queryBackground">@null</item>
</style>

Eine vollständige Liste der Attribute finden Sie unter this article im Abschnitt "SearchView".

Zweitens müssen Sie ein style für Ihr Toolbar erstellen, das als ActionBar verwendet wird:

<style name="ToolbarSearchView" parent="Base.ThemeOverlay.AppCompat.Dark.ActionBar">
    <item name="searchViewStyle">@style/CustomSearchView</item>
</style>

Und schließlich müssen Sie Ihr Toolbar-Designattribut folgendermaßen aktualisieren:

<Android.support.v7.widget.Toolbar xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto"
    Android:id="@+id/toolbar"
    Android:layout_width="match_parent"
    Android:layout_height="?attr/actionBarSize"
    app:theme="@style/ToolbarSearchView" />

Ergebnis:

enter image description here

HINWEIS: Sie müssen Ihr Toolbar -Designattribut direkt ändern. Wenn Sie nur Ihr Hauptthema-Attribut searchViewStyle aktualisieren, hat dies keine Auswirkungen auf Ihr Toolbar.

10
Artem

Eine andere Möglichkeit, den gewünschten Effekt zu erzielen, ist die Verwendung von Bibliothek der Materialsuchansicht . Das Suchprotokoll wird automatisch verarbeitet, und es ist auch möglich, Suchvorschläge für die Ansicht bereitzustellen.

Beispiel: (Es wird in Portugiesisch gezeigt, funktioniert aber auch in Englisch und Italienisch).

Sample

Konfiguration

Bevor Sie diese Bibliothek verwenden können, müssen Sie eine Klasse mit dem Namen MsvAuthority in das Paket br.com.mauker Ihres App-Moduls implementieren. Sie muss eine öffentliche statische Zeichenfolgenvariable mit dem Namen CONTENT_AUTHORITY Enthalten. . Geben Sie den gewünschten Wert ein und vergessen Sie nicht , den gleichen Namen in Ihre Manifestdatei aufzunehmen. Die Bibliothek verwendet diese Datei, um die Berechtigung des Inhaltsanbieters festzulegen.

Beispiel:

MsvAuthority.Java

package br.com.mauker;

public class MsvAuthority {
    public static final String CONTENT_AUTHORITY = "br.com.mauker.materialsearchview.searchhistorydatabase";
}

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest ...>

    <application ... >
        <provider
        Android:name="br.com.mauker.materialsearchview.db.HistoryProvider"
        Android:authorities="br.com.mauker.materialsearchview.searchhistorydatabase"
        Android:exported="false"
        Android:protectionLevel="signature"
        Android:syncable="true"/>
    </application>

</manifest>

Verwendungszweck

Fügen Sie dazu die Abhängigkeit hinzu:

compile 'br.com.mauker.materialsearchview:materialsearchview:1.2.0'

Fügen Sie dann in Ihrer Layoutdatei Activity Folgendes hinzu:

<br.com.mauker.materialsearchview.MaterialSearchView
    Android:id="@+id/search_view"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"/>

Danach müssen Sie nur noch die Referenz MaterialSearchView mit getViewById() abrufen und mit MaterialSearchView#openSearch() und MaterialSearchView#closeSearch() öffnen oder schließen.

P.S.: Es ist möglich, die Ansicht nicht nur vom Toolbar aus zu öffnen und zu schließen. Sie können die Methode openSearch() grundsätzlich für jedes Button verwenden, z. B. für eine schwebende Aktionsschaltfläche.

// Inside onCreate()
MaterialSearchView searchView = (MaterialSearchView) findViewById(R.id.search_view);
Button bt = (Button) findViewById(R.id.button);

bt.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            searchView.openSearch();
        }
    });

Sie können die Ansicht auch über die Schaltfläche "Zurück" schließen. Gehen Sie dazu folgendermaßen vor:

@Override
public void onBackPressed() {
    if (searchView.isOpen()) {
        // Close the search on the back button press.
        searchView.closeSearch();
    } else {
        super.onBackPressed();
    }
}

Weitere Informationen zur Verwendung der lib finden Sie unter überprüfen Sie die Github-Seite .

5
Mauker

Im Folgenden wird eine SearchView erstellt, die mit der in Google Mail identisch ist, und der angegebenen Toolbar hinzugefügt. Sie müssen nur Ihre eigene "ViewUtil.convertDpToPixel" -Methode implementieren.

private SearchView createMaterialSearchView(Toolbar toolbar, String hintText) {

    setSupportActionBar(toolbar);
    ActionBar actionBar = getSupportActionBar();
    actionBar.setDisplayHomeAsUpEnabled(true);
    actionBar.setDisplayShowCustomEnabled(true);
    actionBar.setDisplayShowTitleEnabled(false);

    SearchView searchView = new SearchView(this);
    searchView.setIconifiedByDefault(false);
    searchView.setMaxWidth(Integer.MAX_VALUE);
    searchView.setMinimumHeight(Integer.MAX_VALUE);
    searchView.setQueryHint(hintText);

    int rightMarginFrame = 0;
    View frame = searchView.findViewById(getResources().getIdentifier("Android:id/search_edit_frame", null, null));
    if (frame != null) {
        LinearLayout.LayoutParams frameParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
        rightMarginFrame = ((LinearLayout.LayoutParams) frame.getLayoutParams()).rightMargin;
        frameParams.setMargins(0, 0, 0, 0);
        frame.setLayoutParams(frameParams);
    }

    View plate = searchView.findViewById(getResources().getIdentifier("Android:id/search_plate", null, null));
    if (plate != null) {
        plate.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
        plate.setPadding(0, 0, rightMarginFrame, 0);
        plate.setBackgroundColor(Color.TRANSPARENT);
    }

    int autoCompleteId = getResources().getIdentifier("Android:id/search_src_text", null, null);
    if (searchView.findViewById(autoCompleteId) != null) {
        EditText autoComplete = (EditText) searchView.findViewById(autoCompleteId);
        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(0, (int) ViewUtil.convertDpToPixel(36));
        params.weight = 1;
        params.gravity = Gravity.CENTER_VERTICAL;
        params.leftMargin = rightMarginFrame;
        autoComplete.setLayoutParams(params);
        autoComplete.setTextSize(16f);
    }

    int searchMagId = getResources().getIdentifier("Android:id/search_mag_icon", null, null);
    if (searchView.findViewById(searchMagId) != null) {
        ImageView v = (ImageView) searchView.findViewById(searchMagId);
        v.setImageDrawable(null);
        v.setPadding(0, 0, 0, 0);
        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
        params.setMargins(0, 0, 0, 0);
        v.setLayoutParams(params);
    }

    toolbar.setTitle(null);
    toolbar.setContentInsetsAbsolute(0, 0);
    toolbar.addView(searchView);

    return searchView;
}
2
user901309