เป็นไปได้ไหมที่จะเปลี่ยนสีข้อความบน Android SearchView


115

องค์ประกอบ SearchView ไม่มีคุณสมบัติสำหรับการเปลี่ยนสีข้อความ สีข้อความเริ่มต้นคือสีดำและใช้ไม่ได้กับพื้นหลังสีเข้ม มีวิธีเปลี่ยนสีของข้อความโดยไม่ต้องใช้แฮ็กหรือไม่?

ฉันพบคำถามที่คล้ายกันนี้เกี่ยวข้องกับการเปลี่ยนขนาดตัวอักษร แต่จนถึงขณะนี้ยังไม่มีคำตอบใด ๆ : จะตั้งค่า SearchView TextSize ได้อย่างไร


1
ฉันชอบคำตอบสำหรับสิ่งนี้
TheLettuceMaster

โปรดระบุสิ่งที่คุณได้ลอง
Sahil Mahajan Mj

คำตอบ:


121

เพิ่ม

<item name="android:editTextColor">@android:color/white</item>

เป็นธีมหลักและควรเปลี่ยนข้อความที่ป้อน คุณยังสามารถใช้

<item name="android:textColorHint">@android:color/white</item>

เพื่อเปลี่ยนข้อความคำใบ้สำหรับ SearchView (โปรดทราบว่าคุณสามารถแทนที่@android:color/whiteด้วยค่าที่เหมาะสมที่คุณต้องการใช้)


1
สิ่งนี้ได้รับการแก้ไขสำหรับฉันและไม่เกี่ยวข้องกับเชนานีแกนที่ซับซ้อนโดยใช้การสะท้อนกลับ ยังใช้งานได้กับ appcompat
dj_bushido

คุณยังสามารถตั้งค่า android: theme บน searchview ให้เป็นสไตล์ที่มีองค์ประกอบ android: editTextColor วิธีนี้จะส่งผลต่อการดูการค้นหานั้นเท่านั้น
Pepijn

2
มันได้ผล! ฉันใช้มุมมองการค้นหาภายในแถบเครื่องมือขยาย ThemeOverlay.AppCompat.Light และเพิ่มรายการด้านบนและตั้งค่าสไตล์บนวิดเจ็ต Toolbar;) ทำงานได้อย่างมีเสน่ห์ ...
codename_47

วิธีนี้ใช้ไม่ได้กับฉัน ข้อความยังมีสีผิด คำตอบด้านล่างด้วยการตั้งค่าสีคำใบ้โดยใช้โปรแกรมทำงานให้ฉัน
Dominik

4
ปัญหาของคำตอบนี้คือมันจะเปลี่ยนสีข้อความของคุณEditTextด้วย ทางออกเดียวที่ใช้ได้ผลสำหรับฉันที่เปลี่ยนSearchViewสีข้อความเพียงอย่างเดียวอยู่ที่นี่: stackoverflow.com/a/40550067/1617737
ban-geoengineering

96

ลองทำสิ่งนี้: คุณจะได้รับการจัดการกับ textview จาก sdk แล้วเปลี่ยนเนื่องจากไม่ได้เปิดเผยต่อสาธารณะ

int id = searchView.getContext().getResources().getIdentifier("android:id/search_src_text", null, null);
TextView textView = (TextView) searchView.findViewById(id);
textView.setTextColor(Color.WHITE);

ฉันชอบโซลูชันที่หรูหรา
Mohsen Afshin

29
สิ่งนี้ส่งกลับค่า null
danielrvt-sgb

โปรดทราบว่าหากคุณใช้ ActionBarSherlock รหัสมุมมองจะแตกต่างกัน ตัวอย่างเช่นปัจจุบัน lib ตั้งค่ารหัสข้อความแก้ไขเป็น "package: id / abs__search_src_text" ซึ่งสามารถเข้าถึงได้โดยตรงผ่านทาง R.id.abs__search_src_text
greg7gkb

3
นอกจากนี้สิ่งที่ฉันต้องการเปลี่ยนจริงๆคือสีข้อความคำใบ้ SearchView ซึ่งทำได้อย่างง่ายดายผ่าน textView.setHintTextColor ()
greg7gkb

3
นี่เป็นการแฮ็กที่สกปรกมาก ใช้ android: editTextColor และ android: textColorHint แทนเหมือนที่ akdotcom แนะนำ
Philipp Hofmann

69

สิ่งนี้ใช้ได้กับฉัน

SearchView searchView = (SearchView) findViewById(R.id.search);
EditText searchEditText = (EditText) searchView.findViewById(android.support.v7.appcompat.R.id.search_src_text);
searchEditText.setTextColor(getResources().getColor(R.color.white));
searchEditText.setHintTextColor(getResources().getColor(R.color.white));

1
นอกจากนี้ยังใช้งานได้หากคุณได้รับมุมมองเป็น TextView หรือแม้กระทั่งเป็น AutoCompleteTextView
Juan José Melero Gómez

ใช่นี่เป็นงานสำหรับฉันหลังจากทำตามคำแนะนำของ @ JuanJoséMeleroGómez
Parth Patel

ผมคิดว่านี่คือการคัดลอกและย่อมาจากคำตอบของฉันที่นี่: stackoverflow.com/a/26251197/2914140
CoolMind

24

ฉันอยากทำอะไรคล้าย ๆ กัน ในที่สุดผมก็มีการพบว่าTextViewในหมู่SearchViewเด็ก:

for (TextView textView : findChildrenByClass(searchView, TextView.class)) {
    textView.setTextColor(Color.WHITE);
}

หากคุณต้องการวิธีการใช้:

public static <V extends View> Collection<V> findChildrenByClass(ViewGroup viewGroup, Class<V> clazz) {

    return gatherChildrenByClass(viewGroup, clazz, new ArrayList<V>());
}

private static <V extends View> Collection<V> gatherChildrenByClass(ViewGroup viewGroup, Class<V> clazz, Collection<V> childrenFound) {

    for (int i = 0; i < viewGroup.getChildCount(); i++)
    {
        final View child = viewGroup.getChildAt(i);
        if (clazz.isAssignableFrom(child.getClass())) {
            childrenFound.add((V)child);
        }
        if (child instanceof ViewGroup) {
            gatherChildrenByClass((ViewGroup) child, clazz, childrenFound);
        }
    }

    return childrenFound;
}

3
ฉันได้รับข้อยกเว้นที่เป็นโมฆะด้วยวิธีแก้ปัญหาก่อนหน้านี้เช่นกันและสิ่งนี้ได้ผลสำหรับฉัน!
Diego Ponciano

1
ควรทำเครื่องหมายว่าเป็นคำตอบที่ยอมรับ หนึ่งข้างต้นให้โมฆะ ขอบคุณสำหรับเพื่อนที่ดี :)
blueware

3
โซลูชันนี้น่าขยะแขยงมาก แต่เป็นวิธีเดียวที่ใช้งานได้จริงและเป็นทีม Android ที่ต้องตำหนิ!
Ofek Ron

เราจะเข้าถึงไอคอนการค้นหาด้วยสิ่งนี้ได้อย่างไร
Yasin Yaqoobi

17

ขอบคุณ @CzarMatt ฉันเพิ่มAndroidXการรองรับ

สำหรับฉันงานต่อไปนี้ ฉันใช้รหัสจากการเชื่อมโยง: เปลี่ยนสีของตัวอักษรของคำแนะนำการค้นหาใน actionbar ใช้ห้องสมุดการสนับสนุน

    searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();

    EditText txtSearch = ((EditText)searchView.findViewById(androidx.appcompat.R.id.search_src_text));
    txtSearch.setHint(getResources().getString(R.string.search_hint));
    txtSearch.setHintTextColor(Color.LTGRAY);
    txtSearch.setTextColor(Color.WHITE);

การเปลี่ยนสีข้อความคำใบ้การค้นหาแถบการดำเนินการช่วยแนะนำวิธีแก้ปัญหาอื่น ใช้งานได้ แต่ตั้งค่าข้อความและสีคำใบ้เท่านั้น

    searchView.setQueryHint(Html.fromHtml("<font color = #ffffff>" + getResources().getString(R.string.search_hint) + "</font>"));

1
ใช้androidx.appcompat.R.id.search_src_textหากคุณได้ย้ายโปรเจ็กต์ของคุณไปยัง AndroidX
CzarMatt

16

สิ่งนี้ทำได้ดีที่สุดผ่านสไตล์ที่กำหนดเอง โอเวอร์โหลดสไตล์วิดเจ็ตแถบแอ็คชั่นด้วยสไตล์ที่คุณกำหนดเอง สำหรับแสงโฮโลที่มีแถบแอ็คชั่นมืดให้ใส่สิ่งนี้ไว้ในไฟล์สไตล์ของคุณเองเช่นres/values/styles_mytheme.xml:

<style name="Theme.MyTheme" parent="@android:style/Theme.Holo.Light.DarkActionBar">
    <item name="android:actionBarWidgetTheme">@style/Theme.MyTheme.Widget</item>
    <!-- your other custom styles -->
</style>

<style name="Theme.MyTheme.Widget" parent="@android:style/Theme.Holo">
    <item name="android:textColorHint">@android:color/white</item>
    <!-- your other custom widget styles -->
</style>

ตรวจสอบให้แน่ใจว่าแอปพลิเคชันของคุณใช้ธีมที่กำหนดเองตามที่อธิบายไว้ในป้อนคำอธิบายลิงก์ที่นี่


14

คุณสามารถทำได้โดยตั้งค่าeditTextColorแอตทริบิวต์ในสไตล์

<style name="SearchViewStyle" parent="Some.Relevant.Parent">
    <item name="android:editTextColor">@color/some_color</item>
</style>

และคุณใช้สไตล์นี้กับToolbarหรือSearchViewในเค้าโครง

<android.support.v7.widget.Toolbar
    android:theme="@style/SearchViewStyle">

    <android.support.v7.widget.SearchView />

</android.support.v7.widget.Toolbar>

+1 สิ่งนี้สำคัญกว่าโซลูชันทั้งหมดที่เกี่ยวข้องกับ findViewById imho ควรใช้การจัดรูปแบบดูทุกครั้งที่ทำได้
Mattias

นี่ควรเป็นคำตอบที่ได้รับการยอมรับ! ทำความสะอาดง่ายมาก
MSeiz5

8

ถ้าคุณใช้ - android.support.v7.widget.SearchView

SearchView searchView = (SearchView) item.getActionView();
EditText editText = (EditText) searchView.findViewById(android.support.v7.appcompat.R.id.search_src_text);
editText.setTextColor(Color.WHITE);

ใน Kotlin

val searchView = SearchView(this)
val editText = searchView.findViewById<EditText>(androidx.appcompat.R.id.search_src_text)
editText.setTextColor(Color.WHITE)

คุณควรเริ่มใช้ไลบรารีสนับสนุน androidx ทันที


7

สร้างสไตล์สำหรับคุณ Toolbar

<style name="AppTheme.Toolbar" parent="ThemeOverlay.AppCompat.ActionBar">
    <item name="android:editTextColor">@color/some_color</item>
</style>

และตั้งเป็นธีมสำหรับไฟล์ Toolbar

<android.support.v7.widget.Toolbar
    android:theme="@style/AppTheme.Toolbar"
    ...

6

หากคุณใช้ android.support.v7.widget.SearchView คุณสามารถทำได้โดยไม่ต้องใช้การสะท้อน

นี่คือวิธีที่ฉันทำในแอปของฉัน:

EditText text = (EditText) searchView.findViewById(android.support.v7.appcompat.R.id.search_src_text);
ImageView searchCloseIcon = (ImageView) searchView.findViewById(android.support.v7.appcompat.R.id.search_close_btn);
View searchPlate = searchView.findViewById(android.support.v7.appcompat.R.id.search_plate);

if (searchPlate != null) {
    searchPlate.setBackgroundResource(R.drawable.search_background);
}

if (text != null){
    text.setTextColor(resources.getColor(R.color.white));
    text.setHintTextColor(getResources().getColor(R.color.white));

    SpannableStringBuilder magHint = new SpannableStringBuilder("  ");
    magHint.append(resources.getString(R.string.search));

    Drawable searchIcon = getResources().getDrawable(R.drawable.ic_action_view_search);
    int textSize = (int) (text.getTextSize() * 1.5);
    searchIcon.setBounds(0, 0, textSize, textSize);
    magHint.setSpan(new ImageSpan(searchIcon), 0, 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

    // Set the new hint text
    text.setHint(magHint);

}

if (searchCloseIcon != null){
    searchCloseIcon.setImageDrawable(getResources().getDrawable(R.drawable.ic_action_close));
}

พวกเขาไม่เปิดเผยรหัสต่อสาธารณะสำหรับ SearchView ที่ไม่ใช่ appcompat แต่จะทำเพื่อ AppCompat หากคุณรู้ว่าจะต้องดูที่ไหน :)


สิ่งนี้ใช้งานได้ดีในอุปกรณ์ต่างๆ ทำได้ดีนี่.
Shark

5

ฉันมีปัญหานี้และสิ่งนี้ใช้ได้กับฉัน

@Override
public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.customer_menu, menu);
        SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
        SearchView searchView       = (SearchView) menu.findItem(R.id.menu_customer_search).getActionView();
        searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));

        searchView.setOnQueryTextListener(this);

        //Applies white color on searchview text
        int id = searchView.getContext().getResources().getIdentifier("android:id/search_src_text", null, null);
        TextView textView = (TextView) searchView.findViewById(id);
        textView.setTextColor(Color.WHITE);

        return true;
}

4
ฉันได้รับ null เมื่อ: (TextView) searchView.findViewById (id);
danielrvt-sgb

4

หากคุณใช้ธีมแอปเป็นธีม holo คุณจะได้รับสีขาวแทนที่จะเป็นข้อความสีดำใน SearchView ของคุณ

<style name="Theme.MyTheme" parent="android:Theme.Holo">

ฉันไม่พบวิธีอื่นใดในการเปลี่ยนสีข้อความของมุมมองการค้นหาโดยไม่ใช้แฮ็กสกปรก


1
สิ่งนี้ไม่ได้ผล ฉันหวังว่าจะเป็นเช่นนั้นเนื่องจากจะสะอาดกว่าการค้นหา ID มุมมอง "มายากล" ด้วยตนเอง ฉันลองใช้หลายธีมโดยมีกิจกรรมที่เลย์เอาต์มีพื้นหลังเป็นสีเข้ม แต่ไม่มีสิ่งใดที่สร้างขึ้นนอกจากข้อความสีดำใน SearchView
E-Riz

4

วิธีที่สะอาดที่สุดคือ:

แถบเครื่องมือใช้ธีม ThemeOverlay.AppCompat.Dark.Actionbar

ตอนนี้ทำให้ลูกของมันชอบ:

toolbarStyle parent "ThemeOverlay.AppCompat.Dark.Actionbar"

เพิ่มรายการนี้ในรูปแบบนั้น

ชื่อรายการ "android: editTextColor"> yourcolor

เสร็จสิ้น

อีกสิ่งหนึ่งที่สำคัญมากคือในแถบเครื่องมือให้ใส่ layout_height = "? attr / actionbarSize" โดยค่าเริ่มต้นจะเป็น wrap_content สำหรับฉันข้อความไม่สามารถมองเห็นได้ใน searchview มันได้รับการแก้ไขปัญหานั้น


4

ได้โดยใช้วิธีการดังต่อไปนี้

public static EditText setHintEditText(EditText argEditText, String argHintMessage, boolean argIsRequire) {
    try {
        if (argIsRequire) {
            argHintMessage = "   " + argHintMessage;
            //String text = "<font color=#8c8c8c>"+argHintMessage+"</font> <font color=#cc0029>*</font>";
            String text = "<font color=#8c8c8c>" + argHintMessage + "</font>";
            argEditText.setHint(Html.fromHtml(text));
        } else {
            argEditText.setHint(argHintMessage);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return argEditText;
}

การเรียกวิธีนี้มีลักษณะดังนี้ ..

metLoginUserName=(EditText)this.findViewById(R.id.etLoginUserName);
    metLoginPassword=(EditText)this.findViewById(R.id.etLoginPassword);

    /**Set the hint in username and password edittext*/
    metLoginUserName=HotSpotStaticMethod.setHintEditText(metLoginUserName, getString(R.string.hint_username),true);
    metLoginPassword=HotSpotStaticMethod.setHintEditText(metLoginPassword, getString(R.string.hint_password),true);

ใช้มันฉันได้เพิ่มสีแดงเครื่องหมาย * ในคำใบ้สำเร็จโดยใช้วิธีนี้ คุณควรเปลี่ยนวิธีนี้ตามความต้องการของคุณ ฉันหวังว่ามันจะเป็นประโยชน์กับคุณ .... :)


มันค่อนข้างซับซ้อนสำหรับฉัน
เกาเหลา

1
String text = "<font color = # 8c8c8c>" + HintMessage + "</font>"; argEditText.setHint (Html.fromHtml (ข้อความ)); คุณยังสามารถใช้โค้ดสองบรรทัดนี้เท่านั้นสำหรับการตั้งค่าคำใบ้สี
DynamicMind

1
SearchAutoComplete autoCompleteView = (SearchAutoComplete) mSearchView .findViewById(com.android.internal.R.id.search_src_text);autoCompleteView.setHintTextColor(R.color.hint_text_color); นั่นคือทางออกของฉัน แต่ฉันคิดว่าของคุณดีกว่าของฉันฉันจะใช้วิธีแก้ปัญหาของคุณขอบคุณ
เกาเหลา

@gaols มีวิธีแก้ไหม .. ?
DynamicMind

@ gaols "com.android.internal.R.id.search_src_text" ของคุณอยู่ที่ไหน
wangqi060934

3

ใช้อันนี้มันใช่ : D

AutoCompleteTextView searchText = (AutoCompleteTextView) searchView.findViewById(R.id.abs__search_src_text);
searchText.setHintTextColor(getResources().getColor(color.black));
searchText.setTextColor(getResources().getColor(color.black));

3

ใช่เราทำได้

SearchView searchView = (SearchView) findViewById(R.id.sv_symbol);

ในการใช้สีขาวสำหรับข้อความ SerachView

int id = searchView.getContext().getResources().getIdentifier("android:id/search_src_text", null, null);
TextView textView = (TextView) searchView.findViewById(id);
textView.setTextColor(Color.WHITE);

มีความสุขในการเขียนโค้ด !!!!


3

นี่ใช้งานได้สำหรับฉัน

final SearchView searchView = (SearchView) MenuItemCompat.getActionView(item);

searchView.setOnQueryTextListener(this);   
searchEditText = (EditText) searchView.findViewById(android.support.v7.appcompat.R.id.search_src_text);
searchEditText.setTextColor(getResources().getColor(R.color.white));
searchEditText.setHintTextColor(getResources().getColor(R.color.white));

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) 
{
    searchEditText.setBackgroundColor(getResources().getColor(R.color.c_trasnparent));
    searchEditText.setGravity(Gravity.CENTER);
    searchEditText.setCompoundDrawables(null,null,R.drawable.ic_cross,null);
}

3

เปลี่ยนสีของข้อความที่พิมพ์:

((EditText)((SearchView)findViewById(R.id.searchView)).findViewById(((SearchView)findViewById(R.id.searchView)).getContext().getResources().getIdentifier("android:id/search_src_text", null, null))).setTextColor(Color.WHITE);

เปลี่ยนสีของข้อความคำใบ้:

((EditText)((SearchView)findViewById(R.id.searchView)).findViewById(((SearchView)findViewById(R.id.searchView)).getContext().getResources().getIdentifier("android:id/search_src_text", null, null))).setHintTextColor(Color.LTGRAY);


1

SearchViewวัตถุยื่นออกมาจากLinearLayoutดังนั้นจึงถือเป็นมุมมองอื่น ๆ เคล็ดลับคือการค้นหามุมมองที่ถือข้อความคำใบ้และเปลี่ยนสีโดยทางโปรแกรม ปัญหาในการพยายามค้นหา view by id คือ id ขึ้นอยู่กับธีมที่ใช้ในแอปพลิเคชัน ดังนั้นขึ้นอยู่กับรูปแบบที่ใช้ในวิธีการที่จะกลับมาfindViewById(int id) nullแนวทางที่ดีกว่าที่ใช้ได้กับทุกธีมคือการสำรวจลำดับชั้นของมุมมองและค้นหาวิดเจ็ตที่มีข้อความคำใบ้:

// get your SearchView with its id
SearchView searchView = (SearchView) menu.findItem(R.id.search).getActionView();
// traverse the view to the widget containing the hint text
LinearLayout ll = (LinearLayout)searchView.getChildAt(0);
LinearLayout ll2 = (LinearLayout)ll.getChildAt(2);
LinearLayout ll3 = (LinearLayout)ll2.getChildAt(1);
SearchView.SearchAutoComplete autoComplete = (SearchView.SearchAutoComplete)ll3.getChildAt(0);
// set the hint text color
autoComplete.setHintTextColor(getResources().getColor(Color.WHITE));
// set the text color
autoComplete.setTextColor(Color.BLUE);

เมื่อใช้วิธีนี้คุณยังสามารถเปลี่ยนรูปลักษณ์ของวิดเจ็ตอื่น ๆ ในSearchViewลำดับชั้นได้เช่นการEditTextเก็บคำค้นหา เว้นแต่ Google จะตัดสินใจเปลี่ยนลำดับชั้นของมุมมองในSearchViewไม่ช้าคุณควรเปลี่ยนลักษณะของวิดเจ็ตด้วยวิธีนี้ได้ในบางครั้ง


1

เป็นไปได้ที่จะปรับแต่งการค้นหาโดยใช้ไลบรารี appcompat v7 ฉันใช้ไลบรารี 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"/>        
  </menu>

กิจกรรมของคุณควรขยาย ActionBarActivity แทน Activity นี่คือเมธอด onCreateOptionsMenu

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

สำหรับข้อมูลเพิ่มเติมโปรดดู url นี้:
ที่นี่http://www.jayway.com/2014/06/02/android-theming-the-actionbar/


1

สำหรับ appcompat-v7 Toolbar พร้อม searchView (มีให้ผ่าน MenuItemCompat):

การตั้งค่าธีม Toolbar เป็น @ style / ThemeOverlay.AppCompat.Light จะให้สีเข้ม (ดำ) สำหรับข้อความคำใบ้และสำหรับข้อความที่ป้อน แต่จะไม่มีผลกับสีเคอร์เซอร์ * ดังนั้นการตั้งค่าธีม Toolbar เป็น @ style / ThemeOverlay.AppCompat.Dark จะให้สีอ่อน (สีขาว) สำหรับข้อความคำใบ้และข้อความที่ป้อนเคอร์เซอร์ * จะเป็นสีขาวอยู่ดี

การปรับแต่งธีมข้างต้น:

android: textColorPrimary -> สีของข้อความที่ป้อน

editTextColor -> สีของข้อความที่ป้อน (จะแทนที่ผลกระทบของ android: textColorPrimary หากตั้งค่าไว้)

android: textColorHint -> สีของคำใบ้

* หมายเหตุ: ยังไม่ทราบว่าสีของเคอร์เซอร์สามารถควบคุมได้อย่างไร (โดยไม่ต้องใช้โซลูชันการสะท้อนแสง)


สีของเคอร์เซอร์มาจาก colorControlActivated
Henry

1

ด้วยการใช้สิ่งนี้ฉันสามารถเปลี่ยนข้อความสีที่พิมพ์ในมุมมองการค้นหา

AutoCompleteTextView typed_text = (AutoCompleteTextView) inputSearch.findViewById(inputSearch.getContext().getResources().getIdentifier("android:id/search_src_text", null, null));
typed_text.setTextColor(Color.WHITE);

1

ว้าว. คำตอบเยอะมาก ได้รับค่าสีจากสีหลักของคุณ

เปลี่ยนมันเสร็จแล้ว!

@Override
public void onResume() {
    super.onResume();
    getActivity().setTheme(R.style.YourTheme_Searching);
}

รูปแบบ;

<style name="YourTheme.Searching" parent="YourTheme">
    <item name="android:textColorPrimary">@android:color/white</item>
</style>

1

เปลี่ยนสไตล์ searchView ในแถบเครื่องมือด้วย androidx

ประการแรกตั้งค่ารูปแบบมุมมองการค้นหาในลักษณะแถบเครื่องมือของคุณ (เปลี่ยนระดับบนสุดด้วยแอปของคุณเองเป็นฐาน):

     <!-- toolbar style -->
      <style name="ToolbarStyle" parent="Theme.AppCompat.Light.NoActionBar">     
          <!-- search view about -->
          <item name="android:editTextColor">@color/colorWhitePrimaryText</item>
          <item name="android:textColorHint">@color/colorWhiteSecondaryText</item>
          <item name="android:textCursorDrawable">@drawable/drawable_cursor_white</item>
          <item name="closeIcon">@mipmap/ic_close</item>
          <item name="searchHintIcon">@mipmap/ic_search_white</item>
          <item name="searchIcon">@mipmap/ic_search_white</item>
          <item name="android:longClickable">false</item>
          <item name="android:queryHint">@string/toolbar_search</item>
      </style> 

จากนั้นใช้ในเค้าโครงแถบเครื่องมือของคุณ:

android:theme="@style/ToolbarStyle"

ด้วยวิธีนี้คุณสามารถเปลี่ยนรูปแบบส่วนใหญ่ของ SearchView ยกเว้นคำใบ้คำค้นหา

ในที่สุดก็ตั้งคำใบ้แบบสอบถามที่ตัวเลือกเมนูแถบเครื่องมือของคุณ:

toolbar.setOnMenuItemClickListener(item -> {
        switch (item.getItemId()){
            case R.id.toolbar_search:
                SearchView searchView = (SearchView) item.getActionView();
                searchView.setQueryHint("default query");
                searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
                    @Override
                    public boolean onQueryTextSubmit(String query) {
                        return false;
                    }

                    @Override
                    public boolean onQueryTextChange(String newText) {
                        return false;
                    }
                });
                return true;
                default:
                    return false;
        }

คุณต้องการโพสต์บางสิ่งใน "สไตล์การค้นหามุมมอง" ใช่หรือไม่
DavidW

ฉันทำโซลูชันของฉันเสร็จและเรียบง่ายแล้วอาจช่วยคุณได้
user2333

1

คุณสามารถแทนที่สีเริ่มต้นโดยใช้ android:themeแอตทริบิวต์ใน View

หากคุณกำลังใช้ToolbarหรือMaterialToolbar:

<com.google.android.material.appbar.MaterialToolbar
    android:theme="@style/ThemeOverlay.Toobar"
    ...>

หรือ:

<androidx.appcompat.widget.Toolbar
    android:theme="@style/ThemeOverlay.Toobar"
    ...>

โดยที่ธีมซ้อนทับกับธีมส่วนประกอบวัสดุคือ:

<style name="ThemeOverlay.Toobar" parent="ThemeOverlay.MaterialComponents.Toolbar.Primary">
    <!-- Text color -->
    <item name="android:editTextColor">@color/....</item>
    <!-- Hint text color -->
    <item name="android:textColorHint">@color/...</item>
</style>

ด้วยธีม AppCompat:

<style name="ThemeOverlay.Toobar" parent="ThemeOverlay.AppCompat.Light.*">
    <!-- Text color -->
    <item name="android:editTextColor">@color/....</item>
    <!-- Hint text color -->
    <item name="android:textColorHint">@color/...</item>
</style>

ใส่คำอธิบายภาพที่นี่


หากคุณใช้SearchViewเค้าโครงในเค้าโครงของคุณคุณสามารถทำสิ่งที่คล้ายกันได้:

   <androidx.appcompat.widget.SearchView
       android:theme="@style/ThemeOverlay.SearchView"

กับ

   <style name="ThemeOverlay.SearchView" parent="">
        <!-- Text color -->
        <item name="android:editTextColor">@color/...</item>
        <!-- Hint text color -->
        <item name="android:textColorHint">@color/...</item>
    </style>

ใส่คำอธิบายภาพที่นี่


0
searchView = (SearchView) view.findViewById(R.id.searchView);

SearchView.SearchAutoComplete searchText = (SearchView.SearchAutoComplete) searchView
      .findViewById(org.holoeverywhere.R.id.search_src_text);
searchText.setTextColor(Color.BLACK);

ฉันใช้ Holoeverywhere Library หมายเหตุorg.holoeverywhere.R.id.search_src_text


0

ฉันพบวิธีแก้ปัญหาจากโพสต์บล็อก ดูที่นี่ .

โดยทั่วไปคุณจัดสไตล์ searchViewAutoCompleteTextView และมี android: actionBarWidgetTheme สืบทอดสไตล์


0

มันใช้ได้กับฉัน

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    MenuItem searchItem = menu.findItem(R.id.action_search);
    EditText searchEditText = (EditText) searchView.getActionView().findViewById(android.support.v7.appcompat.R.id.search_src_text);
    searchEditText.setTextColor(getResources().getColor(R.color.white));
    searchEditText.setHintTextColor(getResources().getColor(R.color.white));
    return super.onPrepareOptionsMenu(menu);
}

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.