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
_
私もこの問題に出会い、「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;
}
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
この問題のために、私はこのようなものを思いつきました、
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);
}
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
最終的には少しハックを使用しましたが、それは私の目的にはうまく機能します-すべての目的で機能するかどうかはわかりません。とにかく、検索クエリが空かどうかを確認するためにチェックしています。ただし、これはSearchView
のOnCloseListener
とは実際には関係ありません-それでも動作しません!
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; }
});
まあ、これは私の問題を解決しました:
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;
}
});
OnCloseListener
を機能させるには、検索メニュー項目でshowAsAction
がalways
に設定されていることを確認してください。
<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>
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を呼び出すようにすることができました。
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()
メソッドを呼び出す必要があります。
それは回避策ですが、私のために働いています
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;
}
}
すでに古いスレッドのようですが、最初の初めに同じ問題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;
}
私は少し真/偽で遊んだが、それが何らかの形で違いを生み、今ではうまく機能している。うまくいけば、誰かの時間を節約できるかもしれません。
OnCloseListener
が呼び出されない理由は、Androidコードにバグがあるためです。リスナーは、setIconifiedByDefault(true)
も呼び出す場合にのみ呼び出されます。
searchView.setOnCloseListener {
d("click", "close clicked")
return@setOnCloseListener false
}
searchViewを閉じるをクリックした場合->
D /クリック:閉じるクリック
SearchViewの表示/非表示を検出しようとしたときにこの問題が発生しました。私は別のリスナーを使用することになり、必要なもので機能しました:
setOnQueryTextFocusChangeListener { _, hasFocus ->
if (hasFocus) {
// SearchView is being shown
} else {
// SearchView was dismissed
}
}