web-dev-qa-db-ja.com

SearchViewのOnCloseListenerが機能しない

Android 3.0+ ActionBarでSearchViewのサポートを追加しようとしていますが、OnCloseListenerが機能しません。

ここに私のコードがあります:

_@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.menu, menu);
    searchView = (SearchView) menu.findItem(R.id.search_textbox).getActionView();
    searchView.setOnQueryTextListener(new OnQueryTextListener() {
        @Override
        public boolean onQueryTextChange(String newText) {
            searchLibrary(newText);
            return false;
        }
        @Override
        public boolean onQueryTextSubmit(String query) { return false; }
    });
    searchView.setOnCloseListener(new OnCloseListener() {
        @Override
        public boolean onClose() {
            System.out.println("Testing. 1, 2, 3...");
            return false;
        }
    });
    return true;
}
_

検索はうまく機能し、OnCloseListenerを除くすべてが機能しています。 Logcatには何も出力されません。 「閉じる」ボタンを押したときのLogcatは次のとおりです。

_02-17 13:01:52.914: I/TextType(446): TextType = 0x0
02-17 13:01:57.344: I/TextType(446): TextType = 0x0
02-17 13:02:02.944: I/TextType(446): TextType = 0x0
_

ドキュメント とサンプルに目を通しましたが、何も変更するようには見えませんでした。私はAsus Transformer PrimeとGalaxy Nexusでアイスクリームサンドイッチを使って実行しています。何か案は?

更新:

はい-System.out.println()doesは機能します。ここに証拠があります:

_   @Override
 public boolean onQueryTextChange(String newText) {
    System.out.println(newText + "hello");
    searchLibrary(newText);
    return false;
 }
_

このLogcatの結果:

_02-17 13:04:20.094: I/System.out(21152): hello
02-17 13:04:24.914: I/System.out(21152): thello
02-17 13:04:25.394: I/System.out(21152): tehello
02-17 13:04:25.784: I/System.out(21152): teshello
02-17 13:04:26.064: I/System.out(21152): testhello
_
95
Michell Bak

私もこの問題に出会い、「oncloselistener」をあきらめざるを得ません。代わりに、menuItemを取得してからsetOnActionExpandListenerを取得できます。次に、unimplentsメソッドをオーバーライドします。

@Override
public boolean onMenuItemActionExpand(MenuItem item) {
    // TODO Auto-generated method stub
    Log.d("*******","onMenuItemActionExpand");
    return true;
}

@Override
public boolean onMenuItemActionCollapse(MenuItem item) {
    //do what you want to when close the sesarchview
    //remember to return true;
    Log.d("*******","onMenuItemActionCollapse");
    return true;
}
139
niki huang

Android API 14+(ICS以降)の場合、このコードを使用します:

// When using the support library, the setOnActionExpandListener() method is
// static and accepts the MenuItem object as an argument
MenuItemCompat.setOnActionExpandListener(menuItem, new OnActionExpandListener() {
    @Override
    public boolean onMenuItemActionCollapse(MenuItem item) {
        // Do something when collapsed
        return true;  // Return true to collapse action view
    }

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

詳細: http://developer.Android.com/guide/topics/ui/actionbar.html#ActionView

参照: onActionCollapse/onActionExpand

60
lomza

この問題のために、私はこのようなものを思いつきました、

private SearchView mSearchView;

@TargetApi(14)
@Override
public boolean onCreateOptionsMenu(Menu menu)
{

    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.conversation_index_activity_menu, menu);

    mSearchView = (SearchView) menu.findItem(R.id.itemSearch).getActionView();

    MenuItem menuItem = menu.findItem(R.id.itemSearch);

    int currentapiVersion = Android.os.Build.VERSION.SDK_INT;
    if (currentapiVersion >= Android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH)
    {
        menuItem.setOnActionExpandListener(new OnActionExpandListener()
        {

            @Override
            public boolean onMenuItemActionCollapse(MenuItem item)
            {
                // Do something when collapsed
                Log.i(TAG, "onMenuItemActionCollapse " + item.getItemId());
                return true; // Return true to collapse action view
            }

            @Override
            public boolean onMenuItemActionExpand(MenuItem item)
            {
                // TODO Auto-generated method stub
                Log.i(TAG, "onMenuItemActionExpand " + item.getItemId());
                return true;
            }
        });
    } else
    {
        // do something for phones running an SDK before froyo
        mSearchView.setOnCloseListener(new OnCloseListener()
        {

            @Override
            public boolean onClose()
            {
                Log.i(TAG, "mSearchView on close ");
                // TODO Auto-generated method stub
                return false;
            }
        });
    }


    return super.onCreateOptionsMenu(menu);

}
28
Ben Benson

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

私の場合、上記のコードはうまく機能しました。


私はここに同じ答えを投稿します: https://stackoverflow.com/a/24573266/2162924

18
Dario

最終的には少しハックを使用しましたが、それは私の目的にはうまく機能します-すべての目的で機能するかどうかはわかりません。とにかく、検索クエリが空かどうかを確認するためにチェックしています。ただし、これはSearchViewOnCloseListenerとは実際には関係ありません-それでも動作しません!

searchView.setOnQueryTextListener(new OnQueryTextListener() {
            @Override
            public boolean onQueryTextChange(String newText) {
                if (newText.length() > 0) {
                    // Search
                } else {
                    // Do something when there's no input
                }
                return false;
            }
            @Override
            public boolean onQueryTextSubmit(String query) { return false; }
        });
10
Michell Bak

まあ、これは私の問題を解決しました:

showAsAction="always"のメニュー項目

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

そして活動中

searchView.setOnCloseListener(new OnCloseListener() {

        @Override
        public boolean onClose() {

            Log.i("SearchView:", "onClose");
            searchView.onActionViewCollapsed();
            return false;
        }
    });
6
Sushant

OnCloseListenerを機能させるには、検索メニュー項目でshowAsActionalwaysに設定されていることを確認してください。

<menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
      xmlns:app="http://schemas.Android.com/apk/res-auto"
      xmlns:tools="http://schemas.Android.com/tools"
      tools:context=".SearchActivity">

    <item
        Android:id="@+id/search"
        Android:title="@string/search"
        Android:icon="@drawable/ic_search_toolbar"
        app:showAsAction="always"
        app:actionViewClass="Android.support.v7.widget.SearchView"/>
</menu>
2
Julio Betta

SearchViewを呼び出さないonCloseListenerで同じ問題が発生しました。 25758 で発生したバグの問題と、私が読んだいくつかの投稿を理解して、onCloseListenerを呼び出すには、以下を設定する必要があります。

searchView.setIconifiedByDefault(true);

しかし、私の場合、検索ビューを開いて、常にアイコン化しないようにしたかったのです。下にもう1行追加して、この問題を解決します。

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.search_bar, menu);
    SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
    searchView = (SearchView) menu.findItem(R.id.search).getActionView();
    searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
    searchView.setOnQueryTextListener(queryTextListener);
    searchView.setIconifiedByDefault(true);
    searchView.setIconified(false);
    return true;
}

SearchView.setIconified(false)を使用すると、前の行でデフォルトをiconifiedにtrueに設定しているにもかかわらず、searchViewが開きます。このようにして、常に開くSearchViewと、onCloseListenerを呼び出すようにすることができました。

2
gkl

MenuItemCompat問題の場合、可視性状態を追跡するためにViewTreeObserverを追加しました。ここで私の答えを確認できます: https://stackoverflow.com/a/28762632/1633609

_app:showAsAction_をalwaysに設定してメニュー項目を作成します。

_<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)trueに設定して、上記で作成したonClose()SearchView.OnCloseListener()メソッドを呼び出す必要があります。

1
Ray Hunter

それは回避策ですが、私のために働いています

  searchView.setOnQueryTextListener(new Android.widget.SearchView.OnQueryTextListener() {

                String lastText;

                @Override
                public boolean onQueryTextChange(final String newText) {
                    if (lastText != null && lastText.length() > 1 && newText.isEmpty()) {
                        // close ctn clicked

                        return true;
                    }
}
0
Nativ

すでに古いスレッドのようですが、最初の初めに同じ問題API 18が発生したと思いました。グーグルで探してこのスレッドを見つけた後、javadocで完全に理解していないふりをしてjavadocが試し、エラーになったのを読んで、次の作業を行います:

searchView.setIconifiedByDefault(true);

   // OnQueryTextListener
   @Override
   public boolean onQueryTextSubmit(String query) {
      Log.d(tag, "onQueryTextSubmit: " + query);
      return true;
   }

   @Override
   public boolean onQueryTextChange(String query) {
      Log.d(tag, "onQueryTextChange: " + query);
      return true;
   }

   // OnCloseListener
   @Override
   public boolean onClose() {
      Log.w(tag, "onClose: ");
      return false;
   }

私は少し真/偽で遊んだが、それが何らかの形で違いを生み、今ではうまく機能している。うまくいけば、誰かの時間を節約できるかもしれません。

0
Sean

OnCloseListenerが呼び出されない理由は、Androidコードにバグがあるためです。リスナーは、setIconifiedByDefault(true)も呼び出す場合にのみ呼び出されます。

0
Joseph Earl
    searchView.setOnCloseListener {
        d("click", "close clicked")
        return@setOnCloseListener false
    }

searchViewを閉じるをクリックした場合->

D /クリック:閉じるクリック

0

SearchViewの表示/非表示を検出しようとしたときにこの問題が発生しました。私は別のリスナーを使用することになり、必要なもので機能しました:

        setOnQueryTextFocusChangeListener { _, hasFocus ->
            if (hasFocus) {
                // SearchView is being shown
            } else {
                // SearchView was dismissed
            }
        }
0
Psylocke