安卓搜索视图 - 空查询无效

6
我正在尝试将最近的搜索添加到工具栏上的SearchView中:
 mSearchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
    @Override
    public boolean onQueryTextSubmit(String s) {
        return false;
    }

    @Override
    public boolean onQueryTextChange(String s) {
        if (s!= null )
        {
            if (s.isEmpty()){
                loadRecentList();
            }
            else{
                search(s);
            }
        }
        return true;
    }

});

搜索功能工作正常,但是我无法看到最近的列表结果。
我在这里找到了一个解答:Android SearchView.OnQueryTextListener OnQueryTextSubmit not fired on empty query string,但修改ActionBar库并不是一个好的解决方案。
是否有其他解决方案?谢谢。
编辑:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.menu_main_activity, menu);
    searchItem = menu.findItem(R.id.btn_earch);
    initSearchView();
    setSearchViewListener();
    return super.onCreateOptionsMenu(menu);
}



 protected void initSearchView() {
    final String CURSOR_RESOURCE_ID = "mCursorDrawableRes";
    final int THRESHOLD = 1;

    mSearchView = (SearchView) searchItem.getActionView();

    SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
        mSearchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
    mSearchView.setMeasureWithLargestChildEnabled(true);

    autoCompleteTextView = (AutoCompleteTextView) mSearchView.findViewById(R.id.search_src_text);
    autoCompleteTextView.setThreshold(THRESHOLD);


}

protected void setSearchViewListener() {



    mSearchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String s) {
            return false;
        }

        @Override
        public boolean onQueryTextChange(String s) {
            if (s!= null )
            {
                if (s.isEmpty()){
                    loadRecentList();
                }
                else{
                    search(s);
                }
            }
            return true;
        }

    });

搜索按钮项:

<item
    android:id="@+id/btn_search"
    android:icon="@drawable/ic_search_small"
    android:title="@string/tooltip_search"
    app:actionViewClass="android.support.v7.widget.SearchView"
    app:showAsAction="always"
    />

你好,能展示一下你的onCreateOptionsMenu方法吗? - Daniel Krzyczkowski
@danny,我已经编辑了问题。 - Gali Issachar
4个回答

6
我会用类似以下的方式解决这个问题:
 searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String query) {
            Log.i("MyApp", searchView.getQuery().toString());
            consultarListaParadas(searchView.getQuery().toString());
            getActivity().runOnUiThread(new Runnable() {
                public void run() {
                    adaptadorListaParadasBus.setListaParadas(listaParadas);
                    adaptadorListaParadasBus.notifyDataSetChanged();
                }
            });

            return true;
        }

        @Override
        public boolean onQueryTextChange(String newText) {

            if(newText.equals("")){
                this.onQueryTextSubmit("");
            }
            return true;
        }
    });

唯一的问题是它在你按搜索按钮之前就抛出异常了。

0

@Gali,

请看一下我的代码:

1)我创建了一个ActionBar Activity,就像这样:

public class CarsActivity extends ActionBarActivity implements ExpandableListView.OnGroupClickListener
{
 //my class fields:
 private  MenuItem _menu_item;
 private SearchView _searchView;

// .......

//here is my OnCreateOptionMenu method:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.menu_cars_activity, menu);
    _menu_item = menu.findItem(R.id.action_search);
    _searchView = (SearchView) MenuItemCompat.getActionView(_menu_item);
    _searchView.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() {
        @Override
        public void onViewAttachedToWindow(View v) 
        {
           //action when search is displayed on actinbar
        }

        @Override
        public void onViewDetachedFromWindow(View v) 
        {
            //action when search is collaped on actinbar
        }
    });

    _searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener()  {
        @Override
        public boolean onQueryTextSubmit(String s) 
        {

            return true;
        }
        @Override
        public boolean onQueryTextChange(String s)
        {
         //listener for entering text in searchView
         //you can implement it your way
         return false;
        }
   });
    return true;
  }
}

希望这能对你有所帮助。

它不起作用。虽然查询为空,但我仍然看不到建议列表(我的最近列表)。 - Gali Issachar
请尝试添加 if (s.length() < 0) 并将列表加载到其中。 - Daniel Krzyczkowski

0

您可以通过创建自定义的SearchView小部件来实现此功能,例如:

import android.content.Context;
import android.util.AttributeSet;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.widget.SearchView;

public class EmptySubmitSearchView extends SearchView {
    SearchView.SearchAutoComplete mSearchSrcTextView;
    OnQueryTextListener listener;

    public EmptySubmitSearchView(@NonNull Context context) {
        super(context);
    }

    public EmptySubmitSearchView(@NonNull Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    public EmptySubmitSearchView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    public void setOnQueryTextListener(OnQueryTextListener listener) {
        super.setOnQueryTextListener(listener);

        this.listener = listener;
        mSearchSrcTextView = this.findViewById(androidx.appcompat.R.id.search_src_text);
        mSearchSrcTextView.setOnEditorActionListener((textView, i, keyEvent) -> {
            if (listener != null) {
                listener.onQueryTextSubmit(getQuery().toString());
            }
            return true;
        });
    }
}

参考自此链接,我刚刚将其迁移支持AndroidX


0

queryTextListener在空字符串事件下不会触发。解决方法是找到SearchView上的底层EditText,并将TextWatcher附加到其中。

递归查找EditText视图的方法

 private EditText getEditText(final Context context, final View v) {
    try {
        if (v instanceof ViewGroup) {
            ViewGroup vg = (ViewGroup) v;
            for (int i = 0; i < vg.getChildCount(); i++) {
                View child = vg.getChildAt(i);
                View editText = getEditText(context, child);

                if (editText instanceof EditText) {
                    return (EditText) editText;
                }
            }
        } else if (v instanceof EditText) {
            Log.d(LogUtil.RANDOM_TAG, "found edit text");
            return (EditText) v;
        }
    } catch (Exception e) {
        e.printStackTrace();
        return null;
    }
    return null;
}

然后当您拥有了您的SearchView

EditText et = getEditText(getActivity(), searchView);

    if (et != null) {

        et.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
            }

            @Override
            public void afterTextChanged(Editable s) {


                if(TextUtils.isEmpty(s)){
                    Log.d(LogUtil.RANDOM_TAG, "empty");
                    //do stuff
                }
                else{
                    Log.d(LogUtil.RANDOM_TAG, "not empty");
                }

            }
        });
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接