android - windowsoftinputmode - Auto Collapse ActionBar SearchView auf der weichen Tastatur schließen



check if soft keyboard is open android (8)

Überbrücken Sie OnBackPressed einfach so:

@Override
    public void onBackPressed() {
        if (searchView.isShown()){
            searchView.onActionViewCollapsed();  //collapse your ActionView
            searchView.setQuery("",false);       //clears your query without submit
            isClosed = true;                     //needed to handle closed by back
        } else{
            super.onBackPressed();
        }
    }

und Ihr onCreateOptionsMenu würde die mSearchView wie folgt aufblasen:

@Override
    public boolean onCreateOptionsMenu(Menu menu) {
        super.onCreateOptionsMenu(menu);
        getMenuInflater().inflate(R.menu.menu_search, menu);
        mSearchView = (SearchView) menu.findItem(R.id.menu_action_search).getActionView();
        mSearchView.setOnQueryTextListener(this);
        mSearchView.setOnSearchClickListener(this);
        mSearchView.setOnCloseListener(this);
        isClosed = true;
        return true;
    }

Haben Sie Klasse wie folgt implementieren:

public class myActivity extends FragmentActivity implements
    SearchView.OnQueryTextListener, View.OnClickListener, SearchView.OnCloseListener {

was du auch brauchst:

@Override
public void onClick(View view) {
    isClosed = false;
}

@Override
public boolean onClose() {
    isClosed = true;
    return false;
}

Sie müssen die beiden globalen Variablen "mSearchView" und "isClosed" zur Aktivität hinzufügen.

https://code.i-harness.com

Ich verwende derzeit einen ActionBar-Menüeintrag, um in der Aktionsleiste ein SearchView anzuzeigen. Wenn der Suchmenüpunkt erweitert wird, wird die Soft-Tastatur angezeigt, was ich möchte. Jetzt, wenn der Benutzer die Zurück-Taste drückt, um die Soft-Tastatur zu schließen, möchte ich auch die SearchView in der Aktionsleiste ausblenden.

Ich habe versucht, die folgenden Listener OnKeyListener und OnFocusChangeListener auf dem MenuItem und dem ActionView zu implementieren. Ich habe auch versucht, OnBackPressed () in der Aktivität zu verwenden. Keine der oben genannten Funktionen erkennt, wenn die Zurück-Taste zum Schließen der Soft-Tastatur verwendet wird.

Irgendwelche Ideen?

Ich habe OnActionExpandListener implementiert, um zu wissen, wann das SearchView sichtbar ist.


Aus irgendeinem Grund menuItem.collapseActionView() nicht, also habe ich stattdessen searchView.setIconified(true) verwendet.

Dies ergibt das folgende Ergebnis als Codebeispiel.

final MenuItem searchItem = (MenuItem) menu.findItem(R.id.menu_item_search);
final SearchView searchView = (SearchView) searchItem.getActionView();

searchView.setOnQueryTextFocusChangeListener(new SearchView.OnFocusChangeListener() {
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if (!hasFocus) {
            searchView.setIconified(true);
        }
    }
});

Die Antwort von Jon Willis funktioniert großartig. Dies ist eine Verbesserung seiner Antwort.

Erstellen Sie zuerst eine neue Klasse, die View.OnFocusChangeListener implementiert:

public class SearchViewFocusListener implements View.OnFocusChangeListener {

    private final MenuItem mMenuItem;

    public SearchViewFocusListener(MenuItem menuItem) {
        mMenuItem = menuItem;
    }

    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if (!hasFocus) {
            mMenuItem.collapseActionView();
            if (v instanceof SearchView) {
                ((SearchView) v).setQuery("", false);
            }
        }
    }

}

Als nächstes setze den Listener auf deine SearchView :

searchView.setOnQueryTextFocusChangeListener(new SearchViewFocusListener(menuItem));

Es ist erreichbar wie folgt:

   private void setupSearchView(Menu menu) {
        final MenuItem searchMenuItem = menu.findItem(R.id.action_search);
        final SearchView searchView = (SearchView) searchMenuItem.getActionView();

        [...]

        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                searchMenuItem.collapseActionView();
                return false;
            }
            @Override
            public boolean onQueryTextChange(String newText) {
                return true;
            }
        });
    }

Lösungen, die auf setOnQueryTextFocusChangeListener () basieren, funktionierten nicht für mich, weil das Ereignis nicht gestartet wurde - die searchView verlor den Fokus nicht, wenn sie gesendet wurde, wahrscheinlich weil ich die Suche in derselben Aktivität mit der Suchansicht ausführte.

Wie auch immer, ich denke, die Verwendung von OnQueryTextListener ist korrekter, da es das Ereignis beschreibt, Text genauer zu übermitteln.


Ich werde auf @ user1258568 die Antwort für die faulen erweitern. Das hat für mich funktioniert. Beachten Sie, dass die Abfrage gelöscht wird, wenn der Fokus verloren geht.

final MenuItem searchMenuItem = optionsMenu.findItem(R.id.search);
final SearchView searchView = (SearchView) searchMenuItem.getActionView();

searchView.setOnQueryTextFocusChangeListener(new View.OnFocusChangeListener() {
    @Override
    public void onFocusChange(View view, boolean queryTextFocused) {
        if(!queryTextFocused) {
            searchMenuItem.collapseActionView();
            searchView.setQuery("", false);
        }
    }
});

Sie müssen nur das Attribut "collapseActionView" im Menülayout platzieren

<menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:app="http://schemas.android.com/apk/res-auto">
    <item
        android:id="@+id/menu_item_search"
        android:title="@string/search"
        android:iconifiedByDefault="true"
        android:icon="@drawable/ic_action_search" 
        app:actionViewClass="android.support.v7.widget.SearchView"
        app:showAsAction="ifRoom|collapseActionView"/> <--this one
</menu>

Das gibt Ihnen die Funktionalität, nach der Sie selbst suchen. Vergessen Sie nicht, die Methode "clearFocus" auf dem SearchView aufzurufen, um die Tastatur zu schließen, sobald Sie die Abfrage gesendet haben.


Wenn Sie die Tastatur ausblenden möchten, wenn der Benutzer auf das Suchsymbol auf der Tastatur klickt, kann dies einfach erreicht werden

inside onquerytextsubmitted {

searchView.clearfocus()

}


@Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getSupportMenuInflater().inflate(R.menu.home_screen, menu);

        SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
        final MenuItem searchMenuItem = menu.findItem(R.id.menu_search);
        final SearchView searchView = (SearchView) searchMenuItem
                .getActionView();
        searchView.setIconifiedByDefault(false);
        if (searchManager != null && searchView != null) {
            searchView.setSearchableInfo(searchManager
                    .getSearchableInfo(getComponentName()));

            searchView
                    .setOnQueryTextFocusChangeListener(new View.OnFocusChangeListener() {

                        @Override
                        public void onFocusChange(View v, boolean hasFocus) {

                            if (!hasFocus) {
                                if (searchMenuItem != null) {
                                    searchMenuItem.collapseActionView();
                                }// end if
                                if (searchView != null) {
                                    searchView.setQuery("", false);

                                }// end if
                            }// end if

                        }
                    });

            searchView
                    .setOnQueryTextListener(new SearchView.OnQueryTextListener() {

                        @Override
                        public boolean onQueryTextSubmit(String query) {
                            /**
                             * hides and then unhides search tab to make sure
                             * keyboard disappears when query is submitted
                             */
                            if (searchView != null) {
                                searchView.setVisibility(View.INVISIBLE);
                                searchView.setVisibility(View.VISIBLE);

                            }
                            return false;
                        }

                        @Override
                        public boolean onQueryTextChange(String newText) {
                            // TODO Auto-generated method stub
                            return false;
                        }
                    });

        }

        return super.onCreateOptionsMenu(menu);
    }




android-softkeyboard