SearchView是android中一个搜索框组件,它不是一个单独的view,而是一个LinearLayout布局,包括表示Search图标和清除图标等其它图标的imageView、具有下拉建议列表的AutoCompleteTextView等,有时候我们需要对SearchView做一些特定的修改,而SearchView本身却又没有提供相关的接口,这时需要对SearchView进行自顶向下的深度遍历,提取它的每一个子孙view,如果只要对特定类型的view进行修改,只需根据view的类型来提取(view instanceof XXXView),若要提取特定的某一个view,则需要知道该view的id号,可以从SearchView源代码找到。
1、SearchView的层级结构:search_view.xml
<?xml version="1.0" encoding="utf-8"?> <!-- /* * Copyright (C) 2010 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ --> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/search_bar" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" > <!-- This is actually used for the badge icon *or* the badge label (or neither) --> <TextView android:id="@+id/search_badge" android:layout_width="wrap_content" android:layout_height="match_parent" android:gravity="center_vertical" android:layout_marginBottom="2dip" android:drawablePadding="0dip" android:textAppearance="?android:attr/textAppearanceMedium" android:textColor="?android:attr/textColorPrimary" android:visibility="gone" /> <ImageView android:id="@+id/search_button" style="?android:attr/actionButtonStyle" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_gravity="center_vertical" android:src="?android:attr/searchViewSearchIcon" android:contentDescription="@string/searchview_description_search" /> <LinearLayout android:id="@+id/search_edit_frame" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:layout_gravity="center_vertical" android:layout_marginTop="4dip" android:layout_marginBottom="4dip" android:layout_marginLeft="8dip" android:layout_marginRight="8dip" android:orientation="horizontal"> <ImageView android:id="@+id/search_mag_icon" android:layout_width="@dimen/dropdownitem_icon_width" android:layout_height="wrap_content" android:scaleType="centerInside" android:layout_marginLeft="@dimen/dropdownitem_text_padding_left" android:layout_gravity="center_vertical" android:src="?android:attr/searchViewSearchIcon" android:visibility="gone" /> <!-- Inner layout contains the app icon, button(s) and EditText --> <LinearLayout android:id="@+id/search_plate" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:layout_gravity="center_vertical" android:orientation="horizontal" android:background="?android:attr/searchViewTextField"> <view class="android.widget.SearchView$SearchAutoComplete" android:id="@+id/search_src_text" android:layout_height="36dip" android:layout_width="0dp" android:layout_weight="1" android:minWidth="@dimen/search_view_text_min_width" android:layout_gravity="bottom" android:paddingLeft="@dimen/dropdownitem_text_padding_left" android:paddingRight="@dimen/dropdownitem_text_padding_right" android:singleLine="true" android:ellipsize="end" android:background="@null" android:inputType="text|textAutoComplete|textNoSuggestions" android:imeOptions="actionSearch" android:dropDownHeight="wrap_content" android:dropDownAnchor="@id/search_edit_frame" android:dropDownVerticalOffset="0dip" android:dropDownHorizontalOffset="0dip" android:contentDescription="@string/searchview_description_query" /> <ImageView android:id="@+id/search_close_btn" android:layout_width="wrap_content" android:layout_height="match_parent" android:paddingLeft="8dip" android:paddingRight="8dip" android:layout_gravity="center_vertical" android:background="?android:attr/selectableItemBackground" android:src="?android:attr/searchViewCloseIcon" android:focusable="true" android:contentDescription="@string/searchview_description_clear" /> </LinearLayout> <LinearLayout android:id="@+id/submit_area" android:orientation="horizontal" android:layout_width="wrap_content" android:layout_height="match_parent" android:background="?android:attr/searchViewTextFieldRight"> <ImageView android:id="@+id/search_go_btn" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_gravity="center_vertical" android:paddingLeft="16dip" android:paddingRight="16dip" android:background="?android:attr/selectableItemBackground" android:src="?android:attr/searchViewGoIcon" android:visibility="gone" android:focusable="true" android:contentDescription="@string/searchview_description_submit" /> <ImageView android:id="@+id/search_voice_btn" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_gravity="center_vertical" android:paddingLeft="16dip" android:paddingRight="16dip" android:src="?android:attr/searchViewVoiceIcon" android:background="?android:attr/selectableItemBackground" android:visibility="gone" android:focusable="true" android:contentDescription="@string/searchview_description_voice" /> </LinearLayout> </LinearLayout> </LinearLayout>
2、实例演示:
1 private void traversSearchView(View view, int index) { 2 if (view instanceof SearchView) { 3 SearchView searchView = (SearchView)view; 4 for (int i = 0; i < searchView.getChildCount(); ++i) { 5 traverseSearchView(searchView.getChildAt(i), i); 6 } 7 } 8 else if (view instanceof LinearLayout) { 9 if (/*id value from search_view.xml*/ == view.getId()) { 10 //TODO 11 } 12 LinearLayout linearlayout = (LinearLayout)view; 13 for (int i = 0; i < linearlayout.getChildAt(i), i); 14 } 15 else if (view instanceof EditText) { 16 if (/*id value from search_view.xml*/ == view.getId()) { 17 //TODO 18 } 19 //TODO 20 } 21 else if (view instanceof ImageView) { 22 if (/*id value from search_view.xml*/ == view.getId()) { 23 //TODO 24 } 25 //TODO 26 } 27 //other 'else if' clause 28 }