【问题标题】:Android SearchView - empty query doesn't workAndroid SearchView - 空查询不起作用
【发布时间】:2015-05-05 07:00:58
【问题描述】:

我正在尝试将最近的搜索添加到工具栏上的 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;
        }

    });

btn_search 项目:

<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 方法吗?
  • @danny 我已经编辑了问题。

标签: android searchview


【解决方案1】:

我用这样的方法解决它

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

唯一的问题是它会在你没有按下搜索按钮的情况下抛出。

【讨论】:

    【解决方案2】:

    @加利,

    请看我的代码:

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

    希望对你有帮助。

    【讨论】:

    • 它不起作用。虽然查询为空,但我仍然看不到建议列表(我最近的列表)。
    • 请尝试添加 if (s.length()
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      您可以通过像这样创建自定义 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;
              });
          }
      }
      

      来自link 的参考,我刚刚将其迁移以支持 AndroidX

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-10-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-27
        • 1970-01-01
        • 2020-12-27
        相关资源
        最近更新 更多