내 응용 프로그램은 일부 알림을 표시하며 사용자 기본 설정에 따라 알림에서 사용자 정의 레이아웃을 사용할 수 있습니다. 잘 작동하지만 텍스트 색상 이라는 작은 문제가 있습니다. 재고 Android 및 거의 모든 제조업체 스킨은 알림 텍스트에 밝은 배경에 검은 색 텍스트를 사용하지만 삼성은 그렇지 않습니다. 알림 풀다운에 어두운 배경이 있고 기본 알림 레이아웃의 텍스트는 흰색입니다.
따라서 이로 인해 문제가 발생합니다. 멋진 레이아웃을 사용하지 않는 알림은 잘 표시되지만 사용자 지정 레이아웃을 사용하는 알림은 텍스트가 기본 흰색 대신 검은 색이기 때문에 읽기가 어렵습니다. 공식 문서 조차도에 대한 #000
색상을 설정하기 TextView
때문에 거기에서 포인터를 찾을 수 없습니다.
사용자는 문제의 스크린 샷을 찍을만큼 친절했습니다.
그렇다면 레이아웃 에서 장치의 기본 알림 텍스트 색상을 어떻게 사용 합니까? 전화 모델을 기반으로 텍스트 색상을 동적으로 변경하는 대신 많은 업데이트가 필요하고 사용자 지정 ROM을 사용하는 사람들이 사용중인 피부에 따라 문제가 발생할 수 있기 때문에 차라리 시작하지 않습니다.
답변
Malcolm의 솔루션은 API> = 9에서 잘 작동합니다. 다음은 이전 API에 대한 솔루션입니다.
트릭은 표준 알림 개체를 contentView
만든 다음에서 만든 기본값을 탐색하는 것 Notification.setLatestEventInfo(...)
입니다. 올바른 TextView를 찾으면 tv.getTextColors().getDefaultColor()
.
다음은 기본 텍스트 색상과 텍스트 크기를 추출하는 코드입니다 (크기 조정 된 밀도 픽셀-sp).
private Integer notification_text_color = null;
private float notification_text_size = 11;
private final String COLOR_SEARCH_RECURSE_TIP = "SOME_SAMPLE_TEXT";
private boolean recurseGroup(ViewGroup gp)
{
final int count = gp.getChildCount();
for (int i = 0; i < count; ++i)
{
if (gp.getChildAt(i) instanceof TextView)
{
final TextView text = (TextView) gp.getChildAt(i);
final String szText = text.getText().toString();
if (COLOR_SEARCH_RECURSE_TIP.equals(szText))
{
notification_text_color = text.getTextColors().getDefaultColor();
notification_text_size = text.getTextSize();
DisplayMetrics metrics = new DisplayMetrics();
WindowManager systemWM = (WindowManager)getSystemService(Context.WINDOW_SERVICE);
systemWM.getDefaultDisplay().getMetrics(metrics);
notification_text_size /= metrics.scaledDensity;
return true;
}
}
else if (gp.getChildAt(i) instanceof ViewGroup)
return recurseGroup((ViewGroup) gp.getChildAt(i));
}
return false;
}
private void extractColors()
{
if (notification_text_color != null)
return;
try
{
Notification ntf = new Notification();
ntf.setLatestEventInfo(this, COLOR_SEARCH_RECURSE_TIP, "Utest", null);
LinearLayout group = new LinearLayout(this);
ViewGroup event = (ViewGroup) ntf.contentView.apply(this, group);
recurseGroup(event);
group.removeAllViews();
}
catch (Exception e)
{
notification_text_color = android.R.color.black;
}
}
extractColors
즉 전화 . 서비스의 onCreate ()에서. 그런 다음 사용자 지정 알림을 만들 때 원하는 색상과 텍스트 크기는 다음 notification_text_color
과 notification_text_size
같습니다.
Notification notification = new Notification();
RemoteViews notification_view = new RemoteViews(getPackageName(), R.layout.notification);
notification_view.setTextColor(R.id.label, notification_text_color);
notification_view.setFloat(R.id.label, "setTextSize", notification_text_size);
답변
해결책은 기본 제공 스타일을 사용하는 것입니다. 필요한 스타일 TextAppearance.StatusBar.EventContent
은 Android 2.3 및 Android 4.x에서 호출 됩니다. 안드로이드에서 5.x의 재료 통지는 여러 가지 다른 스타일을 사용 : TextAppearance.Material.Notification
, TextAppearance.Material.Notification.Title
,와 TextAppearance.Material.Notification.Line2
. 텍스트보기에 적절한 텍스트 모양을 설정하기 만하면 필요한 색상을 얻을 수 있습니다.
이 솔루션에 어떻게 도달했는지 관심이 있으시면 여기 내 탐색 경로가 있습니다. 코드 발췌는 Android 2.3에서 가져온 것입니다.
-
Notification
기본 제공 수단을 사용하여 텍스트 를 사용 하고 설정하면 다음 줄이 레이아웃을 만듭니다.RemoteViews contentView = new RemoteViews(context.getPackageName(), com.android.internal.R.layout.status_bar_latest_event_content);
-
언급 된 레이아웃에는
View
알림 텍스트보기를 담당 하는 다음 이 포함 됩니다.<TextView android:id="@+id/text" android:textAppearance="@style/TextAppearance.StatusBar.EventContent" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:singleLine="true" android:ellipsize="marquee" android:fadingEdge="horizontal" android:paddingLeft="4dp" />
-
따라서 결론은 필요한 스타일이
TextAppearance.StatusBar.EventContent
입니다. 정의는 다음과 같습니다.<style name="TextAppearance.StatusBar.EventContent"> <item name="android:textColor">#ff6b6b6b</item> </style>
이 스타일은 실제로 기본 제공 색상을 참조하지 않으므로 가장 안전한 방법은 기본 제공 색상 대신이 스타일을 적용하는 것입니다.
한 가지 더 : Android 2.3 (API 레벨 9) 이전에는 스타일도 색상도 없었고 하드 코딩 된 값만있었습니다. 어떤 이유로 이러한 이전 버전을 지원해야하는 경우 Gaks 의 답변을 참조하십시오 .
답변
다음은 리소스 만 사용하는 모든 SDK 버전에 대한 솔루션입니다.
res / values / styles.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="NotificationTitle">
<item name="android:textColor">?android:attr/textColorPrimaryInverse</item>
<item name="android:textStyle">bold</item>
</style>
<style name="NotificationText">
<item name="android:textColor">?android:attr/textColorPrimaryInverse</item>
</style>
</resources>
res / values-v9 / styles.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="NotificationText" parent="android:TextAppearance.StatusBar.EventContent" />
<style name="NotificationTitle" parent="android:TextAppearance.StatusBar.EventContent.Title" />
</resources>
res / layout / my_notification.xml
...
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="title"
style="@style/NotificationTitle"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="text"
style="@style/NotificationText"
/>
...
PS : 2.2-에는 하드 코딩 된 값이 사용됩니다. 따라서 일부 드문 오래된 사용자 지정 펌웨어에서 문제가 발생할 수 있습니다.
답변
2.3 이상 ( Android 문서에서 ) :
android:TextAppearance.StatusBar.EventContent.Title
기본 텍스트에 스타일 을 사용하십시오 .
android:TextAppearance.StatusBar.EventContent
보조 텍스트에 스타일 을 사용하십시오 .
2.2-의 경우이 스레드에 대한 다른 답변에서 Gaks가 제안한 것을 수행하십시오 .
2.2에 대해 컴파일하고 2.3 이상을 지원하고 모든 다양한 장치를 지원하려면 Gaks의 솔루션이 내가 아는 유일한 솔루션입니다.
?android:attr/textColorPrimary
2.2- 의 값 을 사용하는 것에 대해 Google이 제안한 BTW 가 작동하지 않습니다. 에뮬레이터를 사용하여 시도하십시오. Gaks의 방법이 유일한 방법입니다.
답변
문제의 TextView에서 이것을 사용합니다.
style="@style/TextAppearance.Compat.Notification.Title"
배경이 검은 색이면 흰색 텍스트를, 배경이 흰색이면 검은 색 텍스트를 제공합니다. 그리고 그것은 적어도 API 19까지 거슬러 올라갑니다.
답변
에 지정된 색상을 사용해야합니다. android.R.color
예를 들면 : android.R.color.primary_text_light
커스텀 ROM 개발자와 Android 스킨 디자이너는 앱의 색상이 나머지 시스템과 일치 할 수 있도록이를 업데이트해야합니다. 여기에는 텍스트가 시스템 전체에 제대로 표시되는지 확인하는 것이 포함됩니다.
답변
다음 지침을 참조하십시오 . http://developer.android.com/guide/topics/ui/notifiers/notifications.html#CustomExpandedView
LinearLayout 컨테이너에 대한 배경색을 설정 한 경우 텍스트 및 배경.
알림 텍스트의 기본 색상이 런처 애플리케이션에 의해 정의 된 경우 런처가이 정보를 공유하지 않는 한 Android 기본 설정에서 검색 할 수 없습니다.
그러나 레이아웃에서 android : textColor = “# 000″줄을 제거하여 자동으로 기본 색상을 얻었습니까?