Android自定义通知未显示代码更改

时间:2016-07-19 18:37:07

标签: android xml android-layout

这里有一些奇怪的行为。我有一堆代码,图片,然后是一些奇怪的行为描述和然后我的问题。

文件

我有一个文件random_start_bonus_cards_notification.xml,如下所示:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="5dp"
android:gravity="center">

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/firstCard" />

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/secondCard" />

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/ifNotCoal"
        android:visibility="gone">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="("
            android:paddingTop="15dp" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/if_not_coal"
            android:paddingTop="15dp" />

        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/thirdCard" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text=")"
            android:paddingTop="15dp" />

    </LinearLayout>

文件random_start_bonus_cards.xml

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"></RelativeLayout>

这是一个故意空白的布局,因为我们会陷入奇怪的境地。事实证明这个文件必须在这里,但它包含的内容并不重要。

Annnnd my styles.xml

<resources>
<style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar">
</style>

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

还有一些Android代码:

    private void showStartBonusCardsDialog(DrawnCards drawnCards) {
    LayoutInflater factory = LayoutInflater.from(CalculatorActivity.this);
    final View dialogContent = factory.inflate(R.layout.random_start_bonus_cards_notification, null);
    ((ImageView) dialogContent.findViewById(R.id.firstCard)).setImageResource(getDrawableIdForStartCard(drawnCards.firstCard()));
    ((ImageView) dialogContent.findViewById(R.id.secondCard)).setImageResource(getDrawableIdForStartCard(drawnCards.secondCard()));

    if(drawnCards.hasThirdCard()) {
        dialogContent.findViewById(R.id.ifNotCoal).setVisibility(View.VISIBLE);
        ((ImageView) dialogContent.findViewById(R.id.thirdCard)).setImageResource(getDrawableIdForStartCard(drawnCards.thirdCard()));
    } else {
        dialogContent.findViewById(R.id.ifNotCoal).setVisibility(View.GONE);
    }

    AlertDialog drawnCardsDialog = new AlertDialog.Builder(CalculatorActivity.this).create();
    drawnCardsDialog.setView(dialogContent);
    drawnCardsDialog.setButton(AlertDialog.BUTTON_NEUTRAL, "OK", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); }
    });
    drawnCardsDialog.show();
}

private void showStartBonusCardsNotification(DrawnCards drawnCards) {
    Intent openIntent = new Intent(CalculatorActivity.this, CalculatorActivity.class);
    openIntent.setAction(refreshStartCardsAction);
    PendingIntent openPendingIntent = PendingIntent.getActivity(this, 0, openIntent, 0);

    RemoteViews notificationView = new RemoteViews(getPackageName(), R.layout.random_start_bonus_cards_notification);
    notificationView.setImageViewResource(R.id.firstCard, getDrawableIdForStartCard(drawnCards.firstCard()));
    notificationView.setImageViewResource(R.id.secondCard, getDrawableIdForStartCard(drawnCards.secondCard()));
    if(drawnCards.hasThirdCard()) {
        notificationView.setViewVisibility(R.id.ifNotCoal, View.VISIBLE);
        notificationView.setImageViewResource(R.id.thirdCard, getDrawableIdForStartCard(drawnCards.thirdCard()));
    } else {
        notificationView.setViewVisibility(R.id.ifNotCoal, View.GONE);
    }

    NotificationCompat.Builder notification = new NotificationCompat.Builder(this);
    notification.setVisibility(NotificationCompat.VISIBILITY_PUBLIC);
    notification.setSmallIcon(R.drawable.white);
    notification.setContentIntent(openPendingIntent);
    notification.setContent(notificationView);

    NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    int notificationId = 1;
    notificationManager.notify(notificationId, notification.build());
}

这里有两个截图: Dialog Notification

怪诞

我最初只有一个布局文件,因为布局是相同的。这样,对话框的文字颜色为黑色(好),通知的文字颜色为白色,无法在我的HTC M9上阅读。

(1)如果我将random_start_bonus_cards_notification.xml中的XML放入random_start_bonus_cards.xml,并将random_start_bonus_cards_notification的所有用法替换为random_start_bonus_cards,则文本颜色错误。如果我按原样保留代码,但删除random_start_bonus_cards,则文本颜色错误。如果我在项目中使用random_start_bonus_cards_notification.xml并保留random_start_bonus_cards.xml,即使它为空,我在对话框和通知中都会显示黑色文字!

(2)通知背景为淡绿色。此颜色在某一点位于资源文件中,但已被删除(如图所示)。删除背景颜色后,对话框布局具有白色背景,但无论是将其更改为红色还是其他任何内容,通知背景仍为淡绿色。

(3)如果我停止调用对话框代码,则会发生相同的行为。我已经包含了对话框代码,因为我担心这里可能会有一些互动,但我不知道如何。

问题

通常,RemoteView如何使用自定义通知布局?是否有任何类型的系统缓存可以解释背景颜色不变?

为什么在更改布局背景颜色时,我的通知不会更改背景颜色?

为什么删除此空文件random_start_bonus_cards.xml时,我的应用会更改行为,甚至没有使用?

为什么我的通知文字颜色不起作用,除非我使用名为random_start_bonus_cards_notification.xml的文件? (如果我删除了_notification,则文字会改变颜色。)

感谢阅读!

2 个答案:

答案 0 :(得分:6)

我的猜测是,这是因为以下两个原因之一:

  1. 第一个可能是代码中的其他位置,您正在引用通知的创建,并且您所做的更改不会影响代码。

  2. 这种情况更有可能发生。构建已经破坏,您的应用程序的内置版本没有使用最新的代码。您可以通过从IDE重建应用程序来解决此问题。

  3. 如果您仍然无法掌握发生这种情况的原因,请在调用方法之前设置断点,以显示通知并遵循应用正在使用的逻辑。

    希望这会有所帮助:)

答案 1 :(得分:3)

这令人抓狂,但仍然不是很好。

(1)在确认我的手机正在进行缓存之后,我开始使用模拟器,效果更好。

(2)我通过对话框中的单独布局文件离开了通知,即使它们是相同的。我的理由是,显然通知背景可以在Android版本之间发生变化(有很多抱怨)。

(3)我没有在上面发布,但有一次我有一个“v9 / styles.xml”。我没有意识到这适用于API9以上的所有版本。

最终解决方案看起来有点像下面的代码。我从这个SO答案(5.1.1 notification TextView, the correct way to deal with white text?)复制并使用textAppearance而不是样式。

        <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/if_not_coal"
        android:textAppearance="@style/NotificationText"
        android:paddingTop="15dp" />

textAppearance 很棒。

<style name="NotificationText" parent="android:TextAppearance.StatusBar.EventContent" />

为&lt;文本赋予灰色。 API 21。

<style name="NotificationText" parent="@android:style/TextAppearance.Material.Notification.Title"></style>

为API&gt; = 21提供黑色文本。