web-dev-qa-db-ja.com

ソフトキーボードのActionBar SearchViewを自動的に閉じる

現在、ActionBarメニュー項目を使用して、アクションバーにSearchViewを表示しています。検索メニュー項目が展開されると、ソフトキーボードが表示されます。ユーザーが戻るボタンを押してソフトキーボードを閉じると、アクションバーのSearchViewも折りたたむようになりました。

次のリスナーOnKeyListenerとOnFocusChangeListenerをMenuItemとActionViewに実装してみました。また、アクティビティでOnBackPressed()を使用してみました。上記のどれも、戻るボタンがソフトキーボードを閉じるために使用されるとき、検出しません。

何か案は?

SearchViewがいつ表示されるかを知るために、OnActionExpandListenerを実装しました。

76
user1258568

怠け者に対する@ user1258568の答えを拡張します。これは私のために働いた。フォーカスが失われると、クエリがクリアされることに注意してください。

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);
        }
    }
});
99
Jon Willis

より良い解決策を見つけました。

searchView.setOnQueryTextFocusChangeListener(). 

OnQueryTextFocusChangeListenerは、キーボードが表示または非表示になったときに呼び出されます。キーボードが表示され、検索ビューにフォーカスがあるときに最初に呼び出されます。 keyboardが非表示になり、検索ビューがフォーカスを失うと、再度呼び出されますclose search viewthenを使用

menuItem.collapseActionView().
37
user1258568

次のようにonBackPressedをオーバーライドします。

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

onCreateOptionsMenuは、mSearchViewを次のように膨らませます。

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

次のようにクラスを実装してください:

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

あなたも必要になります:

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

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

「mSearchView」と「isClosed」の両方をアクティビティのグローバル変数にする必要があります。

10
Codeversed

メニューレイアウトに「collapseActionView」属性を配置するだけです

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

クエリを送信したら、SearchViewでメソッド「clearFocus」を呼び出してキーボードを閉じることを忘れないでください。

2
Rodrigo de Blas

ジョン・ウィリスからの答えは素晴らしいです。これは彼の答えの改善です。

最初に、View.OnFocusChangeListenerを実装する新しいクラスを作成します。

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

}

次に、SearchViewにリスナーを設定します。

searchView.setOnQueryTextFocusChangeListener(new SearchViewFocusListener(menuItem));
2
Jared Rummler

次のように達成できます。

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

イベントが起動されなかったため、setOnQueryTextFocusChangeListener()に基づくソリューションは機能しませんでした-検索ビューを含む同じアクティビティで検索を実行した可能性があるため、送信時にsearchViewがフォーカスを失いませんでした。

とにかく、OnQueryTextListenerを使用する方が、テキストを送信するイベントをより正確に記述するため、より正確だと思います。

1
GaRRaPeTa

これは、キーボードを消すために私がしたことです。これがあなたのために働くかどうか確かめることを試みることができます。 searchViewを非表示に設定してから、再び表示に設定しました。

    //set query change listener
     searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener(){
        @Override
        public boolean onQueryTextChange(String newText) {
            // TODO Auto-generated method stub
            return false;
        }

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

     });
1
Parnit

ユーザーがキーボードの検索アイコンをクリックしたときにキーボードを折りたたむ場合、これは簡単な方法で実現できます

_inside onquerytextsubmitted {_

searchView.clearfocus()

_}_

0
geniushkg
@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);
    }
0
confucius

何らかの理由で、menuItem.collapseActionView()が機能しなかったため、代わりにsearchView.setIconified(true)を使用しました。

これにより、コードサンプルとして以下の結果が得られます。

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);
        }
    }
});
0
bastien

SetIconifiedを2回呼び出す必要があります。

検索ビューを実際に折りたたみ、キーボードを閉じます。
最初の呼び出しでは、検索ビューのテキストは2番目の呼び出しキーボードでクリアされ、検索ビューは閉じられます。

0
nosaiba darwish