SearchView 요소에는 텍스트 색상을 변경하기위한 속성이 없습니다. 기본 텍스트 색상은 검은 색이며 어두운 배경에서는 작동하지 않습니다. 해킹에 의존하지 않고 텍스트의 색상을 변경할 수있는 방법이 있습니까?
텍스트 크기 변경과 관련된 유사한 질문을 찾았지만 지금까지 답변이 없습니다. SearchView TextSize를 설정하는 방법?
SearchView 요소에는 텍스트 색상을 변경하기위한 속성이 없습니다. 기본 텍스트 색상은 검은 색이며 어두운 배경에서는 작동하지 않습니다. 해킹에 의존하지 않고 텍스트의 색상을 변경할 수있는 방법이 있습니까?
텍스트 크기 변경과 관련된 유사한 질문을 찾았지만 지금까지 답변이 없습니다. SearchView TextSize를 설정하는 방법?
답변:
더하다
<item name="android:editTextColor">@android:color/white</item>
부모 테마로 변경하면 입력 한 텍스트가 변경됩니다. 당신은 또한 사용할 수 있습니다
<item name="android:textColorHint">@android:color/white</item>
SearchView에 대한 힌트 텍스트를 변경합니다. ( @android:color/white
사용하려는 적절한 값으로를 바꿀 수 있습니다.)
EditText
. SearchView
텍스트 색상 만 변경하는 유일한 솔루션 은 다음과 같습니다. stackoverflow.com/a/40550067/1617737
다음과 같이 시도하십시오 : sdk에서 textview에 대한 핸들을 얻은 다음 공개적으로 노출하지 않기 때문에 변경합니다.
int id = searchView.getContext().getResources().getIdentifier("android:id/search_src_text", null, null);
TextView textView = (TextView) searchView.findViewById(id);
textView.setTextColor(Color.WHITE);
이것은 나를 위해 작동합니다.
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));
비슷한 일을하고 싶었습니다. 나는 마침내 아이들 TextView
사이에서 찾아야했다 SearchView
.
for (TextView textView : findChildrenByClass(searchView, TextView.class)) {
textView.setTextColor(Color.WHITE);
}
util 메서드를 원하는 경우 :
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;
}
@CzarMatt 덕분에 AndroidX를 추가 했습니다. 지원을 .
나를 위해 다음 작품. 링크에서 코드를 사용했습니다 . 지원 라이브러리를 사용하여 작업 표시 줄에서 검색 힌트의 텍스트 색상을 변경합니다 .
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>"));
androidx.appcompat.R.id.search_src_text
프로젝트를 AndroidX로 마이그레이션 한 경우 사용 합니다.
이것은 사용자 정의 스타일을 통해 가장 잘 달성됩니다. 사용자 지정 스타일로 작업 표시 줄 위젯 스타일을 오버로드합니다. 어두운 액션 바가있는 홀로 라이트의 경우 다음과 같은 자신의 스타일 파일에 넣으십시오 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>
여기에 링크 설명 입력에 설명 된대로 애플리케이션이 테마 사용자 정의 테마를 사용하고 있는지 확인 하십시오.
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>
사용하는 경우-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 지원 라이브러리 사용을 시작해야합니다.
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));
}
그들은 appcompat이 아닌 SearchView에 대해 공개적으로 id를 노출하지 않지만 어디를 볼지 알고 있다면 AppCompat에 대해 노출합니다. :)
나는이 문제가 있었고 이것은 나를 위해 작동합니다.
@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;
}
Holo 테마를 기반으로 앱 테마를 설정하면 SearchView에 검은 색 텍스트 대신 흰색이 표시됩니다.
<style name="Theme.MyTheme" parent="android:Theme.Holo">
더러운 해킹을 사용하지 않고 searchview의 텍스트 색상을 변경하는 다른 방법을 찾지 못했습니다.
가장 깨끗한 방법은 다음과 같습니다.
툴바는 ThemeOverlay.AppCompat.Dark.Actionbar 테마를 사용합니다.
이제 다음과 같이 자식을 만드십시오.
toolbarStyle 부모 "ThemeOverlay.AppCompat.Dark.Actionbar"
이 항목을 해당 스타일로 추가
항목 이름 "android : editTextColor"> yourcolor
끝난.
한 가지 더 중요한 것은 툴바에 layout_height = "? attr / actionbarSize"를 입력하는 것입니다. 기본적으로 wrap_content입니다. 나를 위해 텍스트는 searchview에서 보이지도 않았고 그 문제를 해결했습니다.
네, 다음과 같은 방법으로 가능합니다.
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);
그것을 사용 하여이 방법을 사용하여 힌트에 빨간색 * 표시를 성공적으로 추가했습니다. 요구 사항에 따라이 방법을 변경해야합니다. 도움이 되었기를 바랍니다. .... :)
SearchAutoComplete autoCompleteView = (SearchAutoComplete) mSearchView .findViewById(com.android.internal.R.id.search_src_text);autoCompleteView.setHintTextColor(R.color.hint_text_color);
그게 내 해결책이긴하지만 네가 내 것보다 낫다고 생각해. 너의 해결책을 사용할 게, 고마워.
응 우리는 할 수있어,
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);
해피 코딩 !!!!
이것은 나를 위해 일하고 있습니다.
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);
}
입력 한 텍스트의 색상 변경 :
((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);
SearchView
개체로부터 연장 LinearLayout
되므로 다른 뷰를 보유하고있다. 비결은 힌트 텍스트가있는 뷰를 찾고 프로그래밍 방식으로 색상을 변경하는 것입니다. 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
곧 의보기 계층 구조를 변경하기로 결정하지 않는 한 잠시 동안이 방법으로 위젯의 모양을 변경할 수 있습니다.
appcompat v7 라이브러리를 사용하여 searchview를 사용자 정의 할 수 있습니다. 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>
활동은 Activity 대신 ActionBarActivity를 확장해야합니다. 다음은 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/
searchView가있는 appcompat-v7 툴바의 경우 (MenuItemCompat을 통해 제공됨) :
툴바 테마를 @ style / ThemeOverlay.AppCompat.Light로 설정하면 힌트 텍스트와 입력 된 텍스트에 대해 어두운 색 (검정)이 표시되지만 커서 * 색에는 영향을주지 않습니다. 따라서 툴바 테마를 @ style / ThemeOverlay.AppCompat.Dark로 설정하면 힌트 텍스트와 입력 된 텍스트에 밝은 색상 (흰색)이 생성되며 커서 *는 어쨌든 흰색이됩니다.
위의 테마 사용자 지정 :
android : textColorPrimary-> 입력 된 텍스트의 색상
editTextColor-> 입력 된 텍스트의 색상 (설정된 경우 android : textColorPrimary의 영향을 재정의 함)
android : textColorHint-> 힌트 색상
* 참고 : 반사 솔루션을 사용하지 않고 커서 색상을 제어 할 수있는 방법은 아직 결정되지 않았습니다.
androidx로 툴바에서 searchView 스타일을 변경하십시오.
먼저 툴바 스타일에서 검색보기 스타일을 설정합니다 (자신의 앱 기반으로 부모를 변경).
<!-- 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;
}
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를 참고하십시오 .
그것은 나와 함께 작동한다
@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);
}
나를 위해 일한 것
((EditText)searchView.findViewById(R.id.search_src_text)).setTextColor(getResources().getColor(R.color.text));