淘先锋技术网

首页 1 2 3 4 5 6 7

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

     源代码url:https://github.com/android/platform_frameworks_base/blob/master/core/res/res/layout/search_view.xml#L75

复制代码
<?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 }
复制代码