SearchView 위젯의 배경 드로어 블 변경


122

Android 작업 표시 줄 검색보기 위젯에있는 드로어 블을 변경하려고합니다.

현재는 다음과 같습니다. 여기에 이미지 설명 입력

하지만 파란색 배경 드로어 블을 빨간색으로 변경해야합니다.

나는 내 자신의 검색 위젯을 굴리는 것보다 많은 것을 시도했지만 아무것도 작동하지 않는 것 같습니다.

누군가 이것을 변경하는 올바른 방향을 알려줄 수 있습니까?


1
나는 당신이 아직 그것을 확인하지 않았다면 이 SO 포스트 가 당신이 성취하려는 것을 도울 수 있다고 믿습니다 .
Angelo

@Angelo 안타깝게도을 SearchView통해 사용할 수 없기 때문에 배경으로 는 불가능합니다 R.styleable. 아래 내 대답은 코드에서 수행하는 방법을 설명합니다.
vArDo

"영화 이름 입력"이라는 텍스트를 어떻게 얻었습니까?
Zen

다음과 같이 검색보기에서 힌트 텍스트를 설정할 수 있습니다. SearchView.SearchAutoComplete searchAutoComplete = (SearchView.SearchAutoComplete) searchView.findViewById (android.support.v7.appcompat.R.id.search_src_text); searchAutoComplete.setHint ( "힌트 텍스트");
Dominik 2015 년

답변:


253

소개

안타깝게도 ActionBar 드롭 다운 항목의 배경에서SearchView수있는 것처럼 XML에서 테마, 스타일 및 상속을 사용하여 텍스트 필드 스타일 을 설정할 수있는 방법이 없습니다 . 때문이다 selectableItemBackground styleable로 나열되어 있는 R.stylable반면, searchViewTextField(우리가 관심이 있다는 것을 테마 속성)되지 않습니다. 따라서 XML 리소스 내에서 쉽게 액세스 할 수 없습니다.No resource found that matches the given name: attr 'android:searchViewTextField' 오류가 발생 함).

코드에서 SearchView 텍스트 필드 배경 설정

따라서 SearchView텍스트 필드의 배경을 올바르게 대체하는 유일한 방법 은 내부에 들어가서 다음을 기반으로 배경이 설정된 뷰에 대한 액세스 권한을 획득하는 것입니다.searchViewTextField 하고 자체적으로 설정하는 것입니다.

참고 : 아래의 솔루션 android:id/search_plate은 내 요소의 ID ( ) 에만 의존 SearchView하므로 하위 순회 (예 : searchView.getChildAt(0)내에서 올바른보기를 얻기 위해 사용)보다 SDK 버전에 독립적 SearchView이지만 방탄은 아닙니다. 특히 일부 제조업체가 내부를 다시 구현하기로 결정 SearchView하고 위에서 언급 한 ID를 가진 요소가없는 경우 코드가 작동하지 않습니다.

SDK에서 텍스트 필드의 배경은 nine-patches를SearchView 통해 선언 되므로 동일한 방식으로 수행합니다. Android git repositorydrawable-mdpi 디렉토리 에서 원본 png 이미지를 찾을 수 있습니다 . 두 가지 이미지에 관심이 있습니다. 하나는 텍스트 필드가 선택된 상태 ( textfield_search_selected_holo_light.9.png )와 그렇지 않은 상태 ( textfield_search_default_holo_light.9.png )에 대한 것입니다.

안타깝게도 초점이 맞춰진 상태 만 사용자 지정하려는 경우에도 두 이미지의 로컬 복사본을 만들어야 합니다. R.drawable에textfield_search_default_holo_light 존재하지 않기 때문 입니다 . 따라서 쉽게 액세스 할 수 없습니다.@android:drawable/textfield_search_default_holo_light 로컬 드로어 블을 참조하는 대신 아래 표시된 선택기에서 사용할 수 .

참고 : 내가 사용했다 홀로 빛의 기지로 테마를하지만과 동일 할 수 홀로 어둠 . LightDark 테마 사이 에 선택된 상태 9- 패치 에는 실제 차이가없는 것 같습니다 . 그러나 기본 상태에 대한 9 패치에는 차이가 있습니다 ( Light vs Dark 참조 ). 그래서, 아마 9-패치의 로컬 복사본을 만들 필요가 없습니다 선택한 상태 모두, 어둠 테마 (당신이 모두 처리 할 것을 가정하고 그들에게 모두 모양과 동일하게 홀로 테마 ). 하나의 로컬 사본을 만들어두 테마에 대한 선택기 드로어 블 .

이제 다운로드 한 나인 패치를 필요에 맞게 편집해야합니다 (예 : 파란색을 빨간색으로 변경). draw 9-patch 도구 를 사용하여 파일을 살펴보고 편집 후 올바르게 정의되었는지 확인할 수 있습니다.

1 픽셀 연필 도구 (매우 쉬움)로 김프 를 사용하여 파일을 편집 했지만 아마도 자신의 도구를 사용할 것입니다. 다음은 집중 상태를 위한 맞춤 9 패치입니다 .

여기에 이미지 설명 입력

참고 : 단순화를 위해 mdpi 밀도에 대한 이미지 만 사용했습니다 . 모든 장치에서 최상의 결과를 얻으려면 여러 화면 밀도에 대한 9 패치 를 만들어야 합니다. Holo의 이미지 SearchViewmdpi , hdpixhdpi 드로어 블 에서 찾을 수 있습니다 .

이제보기 상태에 따라 적절한 이미지가 표시되도록 드로어 블 선택기를 만들어야합니다. res/drawable/texfield_searchview_holo_light.xml다음 내용으로 파일 을 만듭니다 .

<?xml version="1.0" encoding="utf-8"?>

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_focused="true"
        android:drawable="@drawable/textfield_search_selected_holo_light" />
    <item android:drawable="@drawable/textfield_search_default_holo_light" />
</selector>

위에서 만든 드로어 블을 사용하여 LinearLayout텍스트 필드 를 포함하는 뷰의 배경을 설정합니다 . SearchViewID는 android:id/search_plate. 옵션 메뉴를 만들 때 코드에서이 작업을 빠르게 수행하는 방법은 다음과 같습니다.

public class MainActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }       

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);

        // Getting SearchView from XML layout by id defined there - my_search_view in this case
        SearchView searchView = (SearchView) menu.findItem(R.id.my_search_view).getActionView();
        // Getting id for 'search_plate' - the id is part of generate R file,
        // so we have to get id on runtime.
        int searchPlateId = searchView.getContext().getResources().getIdentifier("android:id/search_plate", null, null);
        // Getting the 'search_plate' LinearLayout.
        View searchPlate = searchView.findViewById(searchPlateId);
        // Setting background of 'search_plate' to earlier defined drawable.            
        searchPlate.setBackgroundResource(R.drawable.textfield_searchview_holo_light);          

        return super.onCreateOptionsMenu(menu);
    }

}

최종 효과

다음은 최종 결과의 스크린 샷입니다.

여기에 이미지 설명 입력

내가 이것을 어떻게 얻었는지

다른 뷰를 사용자 정의 할 때이 접근 방식을 사용할 수 있도록이 방법을 사용하는 방법을 평가할 가치가 있다고 생각합니다.

보기 레이아웃 확인

SearchView레이아웃이 어떻게 보이는지 확인했습니다 . 에서 SearchView 생성자의 하나는 팽창이 레이아웃있는 라인을 찾을 수 있습니다 :

inflater.inflate(R.layout.search_view, this, true);

이제 SearchView레이아웃이 res/layout/search_view.xml. search_view.xml 을 살펴보면 내부 LinearLayout요소 (id 포함 search_plate)를 찾을 수 있습니다 android.widget.SearchView$SearchAutoComplete(우리의 검색보기 텍스트 필드와 유사 함).

    <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">

이제 배경이 현재 테마의 searchViewTextField속성 에 따라 설정 됩니다.

속성 조사 (쉽게 설정할 수 있습니까?)

searchViewTextField속성 설정 방법을 확인하기 위해 res / values ​​/ themes.xml을 조사 합니다 . SearchView기본적으로 관련된 속성 그룹이 있습니다 Theme.

<style name="Theme">
    <!-- (...other attributes present here...) -->

    <!-- SearchView attributes -->
    <item name="searchDropdownBackground">@android:drawable/spinner_dropdown_background</item>
    <item name="searchViewTextField">@drawable/textfield_searchview_holo_dark</item>
    <item name="searchViewTextFieldRight">@drawable/textfield_searchview_right_holo_dark</item>
    <item name="searchViewCloseIcon">@android:drawable/ic_clear</item>
    <item name="searchViewSearchIcon">@android:drawable/ic_search</item>
    <item name="searchViewGoIcon">@android:drawable/ic_go</item>
    <item name="searchViewVoiceIcon">@android:drawable/ic_voice_search</item>
    <item name="searchViewEditQuery">@android:drawable/ic_commit_search_api_holo_dark</item>
    <item name="searchViewEditQueryBackground">?attr/selectableItemBackground</item>

기본 테마의 값은 @drawable/textfield_searchview_holo_dark입니다. 들어 Theme.Light또한 파일에 설정됩니다 .

이제 R.styleable을 통해이 속성에 액세스 할 수 있다면 좋겠지 만 불행히도 그렇지 않습니다. 비교를 위해, 다른 참조 테마 에 모두 존재하는 속성 themes.xmlR.attr 같은 textAppearance 또는 selectableItemBackground을 . 경우 searchViewTextField에 존재했다 R.attr(그리고 R.stylable) XML 우리의 전체 응용 프로그램에 대한 테마를 정의 할 때 우리는 단순히 우리의 당김 선택기를 사용할 수 있습니다. 예를 들면 :

<resources xmlns:android="http://schemas.android.com/apk/res/android">

    <style name="AppTheme" parent="android:Theme.Light">
        <item name="android:searchViewTextField">@drawable/textfield_searchview_holo_light</item>
    </style>
</resources>

무엇을 수정해야합니까?

이제 search_plate코드를 통해 액세스해야한다는 것을 알았습니다 . 그러나 우리는 여전히 그것이 어떻게 생겼는지 모릅니다. 간단히 말해, 기본 테마에서 값으로 사용되는 드로어 블을 검색합니다 : textfield_searchview_holo_dark.xmltextfield_searchview_holo_light.xml . 콘텐츠를 살펴보면 드로어 블이 selector뷰 상태를 기반으로 두 개의 다른 드로어 블 (나중에 9 패치로 발생 함)을 참조하는 것을 알 수 있습니다. androiddrawables.com 에서 거의 모든 버전의 Android에서 집계 된 9 패치 드로어 블을 찾을 수 있습니다.

커스터마이징

9 패치 중 하나 에서 파란색 선을 인식 하므로 로컬 복사본을 만들고 원하는대로 색상을 변경합니다.


Java 코드가 작동하지 않고 그의 SearchView가 ActionBar에 있으며 findViewById 메소드로 찾을 수 없습니다. 그러나 나머지는 정확합니다!
VinceFR

@VinceFR 지적 해 주셔서 감사합니다. 눈치 채지 못했습니다 (나는 SearchView그 자체에 집중했습니다 ). 답변을 병합해도 괜찮습니까 (onCreateOptionsMenu 재정의)?
vArDo

@VinceFR 당신이 제안한대로 onCreate()방법에서 onCreateOptionsMenu()방법으로 코드를 옮겼습니다 . 귀하의 답변에 투표했습니다.
vArDo

감사합니다. D Mag 아이콘과 닫기 아이콘을 비슷한 방식으로 변경할 수있는 방법이 있습니까?
Harsha MV

돋보기 아이콘을 어떻게 변경할 수 있습니까? 모든 것을 시도했지만 변경할 수 없습니다 ... 고마워요 ... 셜록 액션 바에서 어떻게할까요?
조반

31

appcompat 라이브러리를 사용하는 경우 위의 솔루션이 작동하지 않을 수 있습니다. appcompat 라이브러리에서 작동하도록 코드를 수정해야 할 수 있습니다.

다음은 appcompat 라이브러리에 대한 작업 솔루션입니다.

  @Override
  public boolean onCreateOptionsMenu(Menu menu)
  {

    getMenuInflater().inflate(R.menu.main_menu, menu); 

    SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
    MenuItem searchMenuItem = menu.findItem(R.id.action_search);
    SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchMenuItem);
    searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));

    SearchView.SearchAutoComplete searchAutoComplete = (SearchView.SearchAutoComplete)searchView.findViewById(android.support.v7.appcompat.R.id.search_src_text);
    searchAutoComplete.setHintTextColor(Color.WHITE);
    searchAutoComplete.setTextColor(Color.WHITE);

    View searchplate = (View)searchView.findViewById(android.support.v7.appcompat.R.id.search_plate);
    searchplate.setBackgroundResource(R.drawable.texfield_searchview_holo_light);

    ImageView searchCloseIcon = (ImageView)searchView.findViewById(android.support.v7.appcompat.R.id.search_close_btn);
    searchCloseIcon.setImageResource(R.drawable.abc_ic_clear_normal);

    ImageView voiceIcon = (ImageView)searchView.findViewById(android.support.v7.appcompat.R.id.search_voice_btn);
    voiceIcon.setImageResource(R.drawable.abc_ic_voice_search);

    ImageView searchIcon = (ImageView)searchView.findViewById(android.support.v7.appcompat.R.id.search_mag_icon);
    searchIcon.setImageResource(R.drawable.abc_ic_search);


    return super.onCreateOptionsMenu(menu);
}

1
search_mag_icon에서는 작동하지 않습니다. : 그것은 "0x01010479 스타일 나쁜 항목과 키를 포함"제공
Lavanya

1
검색 판이 나에게 작동하지 않지만 (뭔가를 수행하지만 결론에 변화가 없음) AppCompat에 대한 일반적인 아이디어는 매우 유용합니다
guy_m

14

귀하의 onCreateOptionsMenu방법은해야합니다 :

@Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.option, menu);
        SearchView searchView = (SearchView) menu.findItem(R.id.menu_search).getActionView();
        int linlayId = getResources().getIdentifier("android:id/search_plate", null, null);
        ViewGroup v = (ViewGroup) searchView.findViewById(linlayId);
        v.setBackgroundResource(R.drawable.searchviewredversion);
        return super.onCreateOptionsMenu(menu);
    }

검색 항목이 menu_search코스를 벗어난 곳

그리고 여기 있습니다 searchviewredversion(이것은 xhdpi 버전입니다) : http://img836.imageshack.us/img836/5964/searchviewredversion.png

여기에 이미지 설명 입력


비슷한 방법으로 검색 아이콘과 닫기 버튼을 변경하는 방법이 있습니까?
Harsha MV

SherlockActionBar 4.2에 대해 잘 모릅니다.하지만 검색 아이콘과 닫기 버튼을 같은 방식으로 변경할 수 있습니다!
VinceFR 2012

ActionbarSherlock에는 자체 테마가 있으며 자체 SearchView를 정의합니다. 즉, searchViewTextField라는 테마에 항목을 추가하고 위의 드로어 블 정의와 9 개의 패치를 사용하면됩니다.
NKijak

1
파일 이름을 searchviewredversion.9.png로 변경하여 자산을 9-patch로 내보내도록 지정하는 것을 잊지 마십시오
1owk3y

13

위의 솔루션은 ActionBarSherlock 4.2에서 작동하지 않으므로 Android 2.x와 역 호환되지 않습니다. ActionBarSherlock 4.2에서 SearchView 배경 및 힌트 텍스트를 설정하는 작업 코드는 다음과 같습니다.

public static void styleSearchView(SearchView searchView, Context context) {
    View searchPlate = searchView.findViewById(R.id.abs__search_plate);
    searchPlate.setBackgroundResource(R.drawable.your_custom_drawable);
    AutoCompleteTextView searchText = (AutoCompleteTextView) searchView.findViewById(R.id.abs__search_src_text);
    searchText.setHintTextColor(context.getResources().getColor(R.color.your_custom_color));
}

이 코드를 어디에 넣어야합니까? 4.2 버전의 작업 표시 줄에서이 작업을 수행하려고합니다. 내 질문 stackoverflow.com/questions/13992424/…
Harsha MV

안녕하세요, onCreateOptionsMenu 메소드에서 호출하십시오. searchView를 찾아이 메서드에 전달합니다.
David Vávra

감사합니다. 다음과 같이 그 인라인 매기 기호를 제거하는 방법에 어떤 생각 i.imgur.com/YvBz2.png
Harsha에 MV

3
ABS를 사용 하면 Android 테마가 아닌 Theme.Sherlock 또는 Theme.Sherlock.Light를 확장 합니다. 즉, 앱 테마 정의에 searchViewTextField라는 항목을 추가하기 만하면됩니다. 모두 XML로 수행되며 코드가 필요하지 않습니다.
NKijak

5

나는 이것도 피곤하고 v7을 사용하고 있습니다. searchPlate비아 를 잡으려고 할 때 응용 프로그램이 중단 getIdentifier()되었으므로 다음과 같이했습니다.

View searchPlate = searchView.findViewById(android.support.v7.appcompat.R.id.search_plate);

3

나는 또한 같은 문제에 직면했다. 나는 appcompat v7 라이브러리를 사용하고 그것에 대한 사용자 정의 스타일을 정의했습니다. 드로어 블 폴더에 다음과 같은 bottom_border.xml 파일을 넣으십시오.

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item>
  <shape >
      <solid android:color="@color/blue_color" />
  </shape>
</item>
<item android:bottom="0.8dp"
  android:left="0.8dp"
  android:right="0.8dp">
  <shape >
      <solid android:color="@color/background_color" />
  </shape>
</item>

<!-- draw another block to cut-off the left and right bars -->
<item android:bottom="2.0dp">
  <shape >
      <solid android:color="@color/main_accent" />
  </shape>
 </item>
</layer-list>

값 폴더 styles_myactionbartheme.xml에서 :

<?xml version="1.0" encoding="utf-8"?>
<resources>
  <style name="AppnewTheme" parent="Theme.AppCompat.Light">
    <item name="android:windowBackground">@color/background</item>
    <item name="android:actionBarStyle">@style/ActionBar</item>
    <item name="android:actionBarWidgetTheme">@style/ActionBarWidget</item>
</style> 
<!-- Actionbar Theme -->
<style name="ActionBar" parent="Widget.AppCompat.Light.ActionBar.Solid.Inverse">
    <item name="android:background">@color/main_accent</item>
    <!-- <item name="android:icon">@drawable/abc_ic_ab_back_holo_light</item> -->
</style> 
<style name="ActionBarWidget" parent="Theme.AppCompat.Light">
    <!-- SearchView customization-->
     <!-- Changing the small search icon when the view is expanded -->
    <!-- <item name="searchViewSearchIcon">@drawable/ic_action_search</item> -->
     <!-- Changing the cross icon to erase typed text -->
  <!--   <item name="searchViewCloseIcon">@drawable/ic_action_remove</item> -->
     <!-- Styling the background of the text field, i.e. blue bracket -->
    <item name="searchViewTextField">@drawable/bottom_border</item>
     <!-- Styling the text view that displays the typed text query -->
    <item name="searchViewAutoCompleteTextView">@style/AutoCompleteTextView</item>        
</style>

  <style name="AutoCompleteTextView" parent="Widget.AppCompat.Light.AutoCompleteTextView">
    <item name="android:textColor">@color/text_color</item>
  <!--   <item name="android:textCursorDrawable">@null</item> -->
    <!-- <item name="android:textColorHighlight">@color/search_view_selected_text</item> -->
</style>
</resources>

메뉴 표시를 위해 custommenu.xml 파일을 정의했습니다.

<menu xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:com.example.actionbartheme="http://schemas.android.com/apk/res-auto" >  

<item android:id="@+id/search"
      android:title="@string/search_title"
      android:icon="@drawable/search_buttonn" 
     com.example.actionbartheme:showAsAction="ifRoom|collapseActionView"   
                 com.example.actionbartheme:actionViewClass="android.support.v7.widget.SearchView"/>

활동은 Activity 대신 ActionBarActivity를 확장해야합니다.

@Override
public boolean onCreateOptionsMenu(Menu menu) 
{
    // Inflate the menu; this adds items to the action bar if it is present.
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.custommenu, menu);
}

매니페스트 파일에서 :

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppnewTheme" >

자세한 내용은 여기를 참조하십시오
여기에 http://www.jayway.com/2014/06/02/android-theming-the-actionbar/


다른 LayerList 예제를 보려면 stackoverflow.com/questions/8211929/… 을 확인하십시오 .
Jared Burrows 2014 년

3

최신 정보

AndroidX를 사용하는 경우 다음과 같이 할 수 있습니다.

    View searchPlate = svSearch. findViewById(androidx.appcompat.R.id.search_plate);
    if (searchPlate != null) {
        AutoCompleteTextView searchText = searchPlate.findViewById(androidx.appcompat.R.id.search_src_text);
        if (searchText != null){
            searchText.setTextSize(TypedValue.COMPLEX_UNIT_PX, getResources().getDimension(R.dimen.edittext_text_size));
            searchText.setMaxLines(1);
            searchText.setSingleLine(true);
            searchText.setTextColor(getResources().getColor(R.color.etTextColor));
            searchText.setHintTextColor(getResources().getColor(R.color.etHintColor));
            searchText.setBackground(null);
        }
    }

2

먼저 드로어 블 (드로어 블 디렉터리 아래)로 사용할 search_widget_background.xml이라는 XML 파일을 생성 해 보겠습니다.

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle" >

    <solid android:color="@color/red" />

</shape>

이 드로어 블은 검색 위젯의 배경으로 사용됩니다. 요청한 것이므로 색상을 빨간색으로 설정했지만 @color 태그로 정의 된 색상으로 설정할 수 있습니다. 모양 태그에 대해 정의 된 속성을 사용하여 추가로 수정할 수도 있습니다 (둥근 모서리 만들기, 타원형 배경 만들기 등).

다음 단계는 검색 위젯의 배경을 이것으로 설정하는 것입니다. 이는 다음을 통해 수행 할 수 있습니다.

    public boolean onCreateOptionsMenu(Menu menu) {

        SearchView searchView = (SearchView)menu.findItem(R.id.my_search_view).getActionView();
        Drawable d = getResources().getDrawable(R.drawable.search_widget_background);
        searchView.setBackground(d);
...
    }

@shkschneider IMHO는 작동하지 않습니다. 배경은 자체가 아닌 내부 요소 SearchView(이름 search_plate) 에 설정되어야하기 때문 SearchView입니다. 자세한 내용은 내 대답을 참조하십시오. 그러나 나는 @ (baba tenor)의 대답을 사용하지 않았습니다.
vArDo

SearchView가 ActionBar에 있다는 것을 알지 못했습니다. 이제 작동합니다.
Erol

@babatenor SearchView내부에있는 요소에 대한 배경이 항상 배경 아래에 있기 때문에 작동하지 않습니다 SearchView. 이 파란색 밑줄 요소를 배경으로 설정하는 id가 있는 LinearLayout뷰 가 있습니다 . 자세한 내용은 내 대답을 참조하십시오. 따라서 솔루션을 사용하면 파란색 밑줄이 여전히 보이는 전체 위젯에 대한 결과가 파란색 배경입니다. Jelly Bean 에서 테스트 했지만 여기서 SDK 대상 버전이 중요하지 않다고 생각합니다. SearchViewsearch_plate
vArDo

vArDo 감사합니다. 나는 SearchView의 계층 구조를 알고 있었지만 이것이 작동한다고 가정했습니다 (적어도 논리적으로 보였습니다).
Erol

1
이 일 경우 @babatenor 그래서이 해커 모든 :) 필요가 없다고, 좋은 것
바르도

1
public boolean onCreateOptionsMenu(Menu menu) {
........

        // Set the search plate color
        int linlayId = getResources().getIdentifier("android:id/search_plate", null, null);
        View view = searchView.findViewById(linlayId);
        Drawable drawColor = getResources().getDrawable(R.drawable.searchcolor);
        view.setBackground( drawColor );
........
    }

이것은 searchablecolor.xml 파일입니다.

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
  <item>
      <shape >
          <solid android:color="#ffffff" />
      </shape>
  </item>

  <!-- main color -->
  <item android:bottom="1.5dp"
      android:left="1.5dp"
      android:right="1.5dp">
      <shape >
          <solid android:color="#2c4d8e" />
      </shape>
  </item>

  <!-- draw another block to cut-off the left and right bars -->
  <item android:bottom="18.0dp">
      <shape >
          <solid android:color="#2c4d8e" />
      </shape>
  </item>
</layer-list>


0

이 "getMenuInflater (). inflate (R.menu.search_menu, menu);"와 같이 Searchview를 확장하는 경우. 그런 다음 아래와 같이 style.xml을 통해이 검색보기를 사용자 정의 할 수 있습니다.

<style name="AppTheme" parent="Theme.AppCompat.DayNight.NoActionBar">
      <item name="searchViewStyle">@style/SearchView.ActionBar</item>
</style>

<style name="SearchView.ActionBar" parent="Widget.AppCompat.SearchView.ActionBar">
      <item name="queryBackground">@drawable/drw_search_view_bg</item>
      <item name="searchHintIcon">@null</item>
      <item name="submitBackground">@null</item>
      <item name="closeIcon">@drawable/vd_cancel</item>
      <item name="searchIcon">@drawable/vd_search</item>
</style>

0

나는 그것에 대해 많이 파고 있었고 마침내이 해결책을 찾았고 그것은 나를 위해 작동합니다!
이것을 사용할 수 있습니다

appcompat를 사용하는 경우 다음을 시도하십시오.

ImageView searchIconView = (ImageView) searchView.findViewById(android.support.v7.appcompat.R.id.search_button);
searchIconView.setImageResource(R.drawable.yourIcon);

androidx를 사용하는 경우 다음을 시도하십시오.

ImageView searchIconView = (ImageView) searchView.findViewById(androidx.appcompat.R.id.search_button);
    searchIconView.setImageResource(R.drawable.yourIcon);

기본 serchview 아이콘이 변경됩니다.

도움이 되었기를 바랍니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.