10

アクションバーを使用して、それにsearchViewを追加しています。searchView.onCLoseListenerを実装しましたが、これが呼び出されていないようです。助言がありますか ?

私のコードは次のようになります:

SearchView searchView = new SearchView(getContext());
searchView.setOnCloseListener(new OnCloseListener() {

  public boolean onClose() {
    searchView.setVisibility(SearchView.GONE);
    // Do Something

    return true;
  }
});
4

9 に答える 9

40

私はアンドロイド4.1.1で同じ問題に遭遇しました。既知のバグのようです:https ://code.google.com/p/android/issues/detail?id = 25758

とにかく、回避策として、状態変更リスナーを使用しました(SearchViewがアクションバーから切り離されると、明らかに閉じられます)。

view.addOnAttachStateChangeListener(new OnAttachStateChangeListener() {

    @Override
    public void onViewDetachedFromWindow(View arg0) {
        // search was detached/closed
    }

    @Override
    public void onViewAttachedToWindow(View arg0) {
        // search was opened
    }
});

上記のコードは私の場合はうまくいきました。

于 2014-07-04T11:27:30.263 に答える
5

SearchView.OnCloseListenerからonClose()メソッドを呼び出すために。私はそれを次のように機能させました。これを検索ビューに追加します

searchView.setIconifiedByDefault(true);
searchView.setOnCloseListener(this);

次に、このonclickリスナーを実装します

  searchView.findViewById(R.id.search_close_btn)
                .setOnClickListener(new View.OnClickListener() {
                    @Override
                public void onClick(View v) {
                    Log.d("called","this is called.");
                    searchView.setQuery("",false);
                    searchView.setIconified(true);

                }
            });

これは私のために働いた。他の人にも役立つように共有する。ありがとう

于 2017-01-22T16:58:55.640 に答える
2

Ok。間違えました。searchCommandを追加して実行することはできません

setShowAsAction(MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW)

これを行うと、searchTextがあれば削除されるため、onClose()を実行できません。

于 2013-01-31T09:12:29.520 に答える
2

「x」アイコンがクリックされたときに通知を受け取るために、SearchViewの「x」ボタンにクリックリスナーを追加しました。

IDでSearchView'x'ボタンを見つけ、OnClickListenerをアタッチします。

mSearchView.findViewById(R.id.search_close_btn)
    .setOnClickListener(this);

ビューsearch_close_btnは、Androidフレームワークによって提供されるSearchViewレイアウトに存在します。

于 2016-12-22T15:50:40.320 に答える
2
    MenuItemCompat.OnActionExpandListener expandListener = new MenuItemCompat.OnActionExpandListener() {
        @Override
        public boolean onMenuItemActionCollapse(MenuItem item) {
            // Do something when action item collapses
            /*Hiding the mic on search visibility*/
                myMenu.findItem(R.id.action_speak).setVisible(false);
            Log.v("test","colllapse");
            return true;  // Return true to collapse action view
        }

        @Override
        public boolean onMenuItemActionExpand(MenuItem item) {
            // Do something when expanded
            Log.v("test","expand");
            return true;  // Return true to expand action view
        }
    };

    //Searchview Initilisation
    MenuItem searchViewItem = menu.findItem(R.id.action_search);
    // Assign the listener to that action item
    MenuItemCompat.setOnActionExpandListener(searchViewItem, expandListener);

ここからの詳細情報:https ://developer.android.com/training/appbar/action-views.html

于 2017-04-06T10:51:10.470 に答える
1

同様の問題を解決するために私がしたことは、SearchViewを拡張する新しいクラスを作成したことです。

public class EnglishVerbSearchView extends SearchView {

OnSearchViewCollapsedEventListener mSearchViewCollapsedEventListener;

public EnglishVerbSearchView(Context context) {
    super(context);
}

@Override
public void onActionViewCollapsed() {
    if (mSearchViewCollapsedEventListener != null)
        mSearchViewCollapsedEventListener.onSearchViewCollapsed();
    super.onActionViewCollapsed();
}

public interface OnSearchViewCollapsedEventListener{
    public void onSearchViewCollapsed();
}

public void setOnSearchViewCollapsedEventListener(OnSearchViewCollapsedEventListener eventListener) {
    mSearchViewCollapsedEventListener = eventListener;
}

}

その後、メニューxmlファイルでSearchViewの代わりにこのクラスを使用できます。

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:yourapp="http://schemas.android.com/apk/res-auto" >
    <item android:id="@+id/action_search"
      android:title="@string/action_search"
      android:icon="@drawable/action_search"
      yourapp:showAsAction="ifRoom|collapseActionView"
      yourapp:actionViewClass="com.szymontrapp.englishverbs.EnglishVerbSearchView" />
</menu>

次に、アクティビティにリスナーを追加できます。

    getMenuInflater().inflate(R.menu.dictionary, menu);
    MenuItem searchItem = menu.findItem(R.id.action_search);
    EnglishVerbSearchView searchView = (EnglishVerbSearchView)      MenuItemCompat.getActionView(searchItem);       

    // Get the SearchView and set the searchable configuration
    SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
    // Assumes current activity is the searchable activity
    searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
    searchView.setIconifiedByDefault(false); // Do not iconify the widget; expand it by default

    searchView.setOnSearchViewCollapsedEventListener(listener);

SearchViewを置き換えるクラス内の他のメソッドをオーバーライドして、他の目標を達成することもできます。

于 2013-08-17T06:27:36.743 に答える
0

app:showAsAction常にに設定してメニュー項目を作成します。

<item   
 android:id="@+id/action_search"  
 android:title="..."  
 android:icon="..."  
 app:actionViewClass="android.support.v7.widget.SearchView"  
 app:showAsAction="always"/>

メソッドでを作成するときはSearchView、次のonCreateOptionsMenuようにします

inflater.inflate(R.menu.menu_search, menu);
final MenuItem item = menu.findItem(R.id.action_search);
final SearchView search = (SearchView) item.getActionView();
search.setQueryHint(getString(R.string.search_brand_item));
search.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
  @Override
  public boolean onQueryTextSubmit(String query) {
    // add your code
    return false;
  }

  @Override
  public boolean onQueryTextChange(String newText) {
    // add your code 
    return false;
  }
});
search.setOnCloseListener(new SearchView.OnCloseListener() {
  @Override
  public boolean onClose() {
    // add your code here
    return false;
  }
});
search.setIconifiedByDefault(true); // make sure to set this to true

上記で作成したメソッドを呼び出すsearch.setIconifiedByDefault(true)ように設定する必要があります。trueonClose()SearchView.OnCloseListener()

于 2017-10-13T22:45:44.280 に答える
0

私もこの問題を見つけました。解決策は非常に簡単です!SearchViewビューをプライベート変数に保存するだけです。次に、

  • isShownビューが展開されたかどうかを確認する方法、
  • searchview.addOnLayoutChangeブロックがアクションを実行した後にsearchview使用を開始するかどうかを決定するには、isShown
  • ユーザーが戻るボタンをクリックしたときにアクションを実行するonBackPressed場合は、オーバーライドします。block(searchView !=null && searchView.isShown()
  • home(back)ボタンリスナーonOptionsItemSelectedisShownブロックでオーバーライドします。注:メニュー項目のxmlファイルで、app:showAsActioncollapseActionViewフラグを削除します。
于 2020-05-03T06:21:05.580 に答える
-1

を設定した場合

searchView.setIconifiedByDefault(false)

その後、searchViewは常に拡張モードであるため、閉じることはありません。これが、onClose()が呼び出されない理由です。

于 2017-05-18T09:06:44.213 に答える