Android SearchView有关细节
Android SearchView相关细节
以下所有内容都是针对android.support.v7.widget.SearchView,相比于默认的SearchView拥有更多的可配置性。
1. SearchView默认的状态是一个搜索图标,点一下才会展开输入框,如果想默认处于展开状态,可以调用如下方法:
searchView.setIconifiedByDefault(false);
带来的副作用是此时的SearchView处于 focus 状态,软键盘会自动打开,如果不希望SearchView自动获得焦点,可以调用如下的方法:
searchView.setFocusable(false); searchView.clearFocus();
setFocusable(false)在初始化SearchView的时候是必须的
2. 获取SearchView输入框
SearchView.SearchAutoComplete searchTextArea = (SearchView.SearchAutoComplete) searchView.findViewById(android.support.v7.appcompat.R.id.search_src_text);
之后就可以通过 searchTextArea 对字体、文本等属性进行修改,比如修改字体大小
searchTextArea.setTextSize(TypedValue.COMPLEX_UNIT_SP, 13);
3. 获取输入框底部线条
View v = searchView.findViewById(android.support.v7.appcompat.R.id.search_plate);
如果希望底部线条看不来,可以设置它的背景色和SearchView保持一致,例如:
v.setBackgroundColor(Color.WHITE);
4. 模拟iOS圆角和添加取消按钮
<LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/lightGreyBg"> <FrameLayout android:layout_width="match_parent" android:layout_height="30dp" android:layout_marginStart="8dp" android:layout_marginEnd="8dp" android:layout_marginTop="6dp" android:layout_marginBottom="6dp"> <android.support.v7.widget.SearchView android:id="@+id/searchView" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/white_bg_round_radius_4dp"/> <TextView android:id="@+id/cancelView" android:layout_width="45dp" android:layout_height="30dp" android:text="取消" android:textColor="@color/colorPrimary" android:textSize="@dimen/font_size_common" android:layout_gravity="end" android:gravity="center" android:visibility="gone"/> </FrameLayout> </LinearLayout>
再根据输入框是否处于编辑状态动态修改SearchView的margin和取消按钮的可见性
FrameLayout.LayoutParams rightMargin = new FrameLayout.LayoutParams( FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT); rightMargin.setMarginEnd((int) DisplayUtils.dp2px(this, 45)); FrameLayout.LayoutParams zeroMargin = new FrameLayout.LayoutParams( FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT); zeroMargin.setMarginEnd(0); searchView.setOnQueryTextFocusChangeListener((view, hasFocus) -> { if (hasFocus) { searchView.setLayoutParams(rightMargin); cancelView.setVisibility(View.VISIBLE); } else { searchView.setLayoutParams(zeroMargin); cancelView.setVisibility(View.GONE); } });
同时可以对取消按钮添加监听,通过如下示例恢复SearchView的原始状态
searchTextArea.setText(""); searchView.clearFocus();
5. 添加搜索下拉框,同时添加透明蒙版的效果
在SearchView下添加显示区域
<FrameLayout android:layout_width="match_parent" android:layout_height="match_parent"> <!-- 蒙版 --> <View android:layout_width="match_parent" android:layout_height="match_parent" android:background="#80323232" /> <ListView android:id="@+id/matchListView" android:layout_width="match_parent" android:layout_height="wrap_content" android:divider="@null" android:background="@android:color/white"/> </FrameLayout>
实现SearchView.OnQueryTextListener,在两个方法中动态更新ListView内容