自定义通知布局和文本颜色

自定义通知布局和文本颜色

我的应用程序显示了一些通知,并且根据用户首选项,它可能会在通知中使用自定义布局。它运作良好,但有一个小问题 - 文本颜色。股票Android和几乎所有制造商皮肤都使用黑色文本作为通知文本的浅色背景,但三星没有:他们的通知下拉具有深色背景,默认通知布局中的文本是白色。

所以这会导致一个问题:不使用任何花哨布局的通知显示正常,但使用自定义布局的通知很难阅读,因为文本是黑色而不是默认白色。即使官方文档只是#000为a 设置颜色TextView,所以我找不到任何指针。

那么如何在布局中使用设备的默认通知文本颜色?我宁愿不开始根据手机型号动态改变文本颜色,因为这需要大量更新,而定制ROM的人可能仍会遇到问题,具体取决于他们使用的皮肤。


30秒到达战场
浏览 513回答 3
3回答

心有法竹

Malcolm的解决方案适用于API> = 9。以下是旧API的解决方案:诀窍是创建标准通知对象,然后遍历contentView创建的默认值Notification.setLatestEventInfo(...)。当你找到合适的TextView时,就得到了tv.getTextColors().getDefaultColor()。这是提取默认文本颜色和文本大小的代码(以缩放密度像素 - sp)。private&nbsp;Integer&nbsp;notification_text_color&nbsp;=&nbsp;null;private&nbsp;float&nbsp;notification_text_size&nbsp;=&nbsp;11;private&nbsp;final&nbsp;String&nbsp;COLOR_SEARCH_RECURSE_TIP&nbsp;=&nbsp;"SOME_SAMPLE_TEXT";private&nbsp;boolean&nbsp;recurseGroup(ViewGroup&nbsp;gp){ &nbsp;&nbsp;&nbsp;&nbsp;final&nbsp;int&nbsp;count&nbsp;=&nbsp;gp.getChildCount(); &nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;<&nbsp;count;&nbsp;++i) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(gp.getChildAt(i)&nbsp;instanceof&nbsp;TextView) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;final&nbsp;TextView&nbsp;text&nbsp;=&nbsp;(TextView)&nbsp;gp.getChildAt(i); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;final&nbsp;String&nbsp;szText&nbsp;=&nbsp;text.getText().toString(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(COLOR_SEARCH_RECURSE_TIP.equals(szText)) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;notification_text_color&nbsp;=&nbsp;text.getTextColors().getDefaultColor(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;notification_text_size&nbsp;=&nbsp;text.getTextSize(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DisplayMetrics&nbsp;metrics&nbsp;=&nbsp;new&nbsp;DisplayMetrics(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WindowManager&nbsp;systemWM&nbsp;=&nbsp;(WindowManager)getSystemService(Context.WINDOW_SERVICE); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;systemWM.getDefaultDisplay().getMetrics(metrics); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;notification_text_size&nbsp;/=&nbsp;metrics.scaledDensity; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;true; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;if&nbsp;(gp.getChildAt(i)&nbsp;instanceof&nbsp;ViewGroup) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;recurseGroup((ViewGroup)&nbsp;gp.getChildAt(i)); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;false;}private&nbsp;void&nbsp;extractColors(){ &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(notification_text_color&nbsp;!=&nbsp;null) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return; &nbsp;&nbsp;&nbsp;&nbsp;try &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Notification&nbsp;ntf&nbsp;=&nbsp;new&nbsp;Notification(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ntf.setLatestEventInfo(this,&nbsp;COLOR_SEARCH_RECURSE_TIP,&nbsp;"Utest",&nbsp;null); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LinearLayout&nbsp;group&nbsp;=&nbsp;new&nbsp;LinearLayout(this); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ViewGroup&nbsp;event&nbsp;=&nbsp;(ViewGroup)&nbsp;ntf.contentView.apply(this,&nbsp;group); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;recurseGroup(event); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;group.removeAllViews(); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;catch&nbsp;(Exception&nbsp;e) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;notification_text_color&nbsp;=&nbsp;android.R.color.black; &nbsp;&nbsp;&nbsp;&nbsp;}}打电话extractColors即。在你的服务的onCreate()。然后,当你创建自定义通知,你要的颜色和文字大小是notification_text_color和notification_text_size:Notification&nbsp;notification&nbsp;=&nbsp;new&nbsp;Notification();RemoteViews&nbsp;notification_view&nbsp;=&nbsp;new&nbsp;RemoteViews(getPackageName(),&nbsp;R.layout.notification);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;notification_view.setTextColor(R.id.label,&nbsp;notification_text_color);notification_view.setFloat(R.id.label,&nbsp;"setTextSize",&nbsp;notification_text_size);

宝慕林4294392

以下是仅使用资源的任何SDK版本的解决方案。RES /值/ styles.xml<?xml&nbsp;version="1.0"&nbsp;encoding="utf-8"?><resources> &nbsp;&nbsp;&nbsp;&nbsp;<style&nbsp;name="NotificationTitle"> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<item&nbsp;name="android:textColor">?android:attr/textColorPrimaryInverse</item> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<item&nbsp;name="android:textStyle">bold</item> &nbsp;&nbsp;&nbsp;&nbsp;</style> &nbsp;&nbsp;&nbsp;&nbsp;<style&nbsp;name="NotificationText"> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<item&nbsp;name="android:textColor">?android:attr/textColorPrimaryInverse</item> &nbsp;&nbsp;&nbsp;&nbsp;</style></resources>RES /值-V9 / styles.xml<?xml&nbsp;version="1.0"&nbsp;encoding="utf-8"?><resources> &nbsp;&nbsp;&nbsp;&nbsp;<style&nbsp;name="NotificationText"&nbsp;parent="android:TextAppearance.StatusBar.EventContent"&nbsp;/> &nbsp;&nbsp;&nbsp;&nbsp;<style&nbsp;name="NotificationTitle"&nbsp;parent="android:TextAppearance.StatusBar.EventContent.Title"&nbsp;/></resources>RES /布局/ my_notification.xml...<TextView &nbsp;&nbsp;&nbsp;&nbsp;android:layout_width="wrap_content" &nbsp;&nbsp;&nbsp;&nbsp;android:layout_height="wrap_content" &nbsp;&nbsp;&nbsp;&nbsp;android:text="title" &nbsp;&nbsp;&nbsp;&nbsp;style="@style/NotificationTitle" &nbsp;&nbsp;&nbsp;&nbsp;/><TextView &nbsp;&nbsp;&nbsp;&nbsp;android:layout_width="wrap_content" &nbsp;&nbsp;&nbsp;&nbsp;android:layout_height="wrap_content" &nbsp;&nbsp;&nbsp;&nbsp;android:text="text" &nbsp;&nbsp;&nbsp;&nbsp;style="@style/NotificationText" &nbsp;&nbsp;&nbsp;&nbsp;/>...PS:硬编码值用于2.2-。因此,一些罕见的旧自定义固件可能会出现问题。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Android