web-dev-qa-db-fra.com

Impossible de développer les vues à distance

J'essaie de créer une notification personnalisée en obtenant l'exception suivante:

FATAL EXCEPTION: main
Android.app.RemoteServiceException: Bad notification posted from package com.my.app: Couldn't expand RemoteViews for: StatusBarNotification(pkg=com.my.app user=UserHandle{0} id=1 tag=null score=0: Notification(pri=0 contentView=com.my.app/0x7f03001b vibrate=null sound=null defaults=0x0 flags=0x2 kind=[null]))
    at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:1423)
    at Android.os.Handler.dispatchMessage(Handler.Java:99)
    at Android.os.Looper.loop(Looper.Java:137)
    at Android.app.ActivityThread.main(ActivityThread.Java:5103)
    at Java.lang.reflect.Method.invokeNative(Native Method)
    at Java.lang.reflect.Method.invoke(Method.Java:525)
    at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:737)
    at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:553)
    at dalvik.system.NativeStart.main(Native Method)

Mon code ressemble à ceci:

Intent intent = new Intent(this, MyFragmentActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
PendingIntent launchIntent = PendingIntent.getActivity(this, 0, intent, 0);

RemoteViews notificationView = new RemoteViews(this.getPackageName(), R.layout.notification_layout);
notificationView.setImageViewBitmap(R.id.notification_icon, icon);
notificationView.setTextViewText(R.id.present_text, "Text Test");

Notification.Builder builder = new Notification.Builder(getApplicationContext());
builder
    .setContentTitle("Titel Test")
    .setSmallIcon(R.drawable.ic_launcher_icon)
    .setContentIntent(launchIntent)
    .setOngoing(true)
    .setWhen(0)
    .setTicker("ticker Test")
    .setContent(notificationView);

NotificationManager notificationManager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(NOTIFICATION_ID, builder.getNotification());

La mise en page se présente comme suit:

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

    <ImageView
        Android:id="@+id/notification_icon"
        Android:layout_width="wrap_content"
        Android:layout_height="fill_parent"
        Android:layout_alignParentLeft="true" />

    <EditText
        Android:id="@+id/present_text"
        Android:layout_width="fill_parent"
        Android:layout_height="wrap_content"
        Android:layout_toRightOf="@id/notification_icon"
        Android:gravity="center_vertical" />

</RelativeLayout>

Je suis sous Android 4.3. J'ai déjà essayé avec NotificationCompat et j'obtiens la même erreur.

Est-ce que quelqu'un a une idée?

18
samo

Vous ne pouvez pas mettre une EditText dans une RemoteViews. RemoteViews est limité à une poignée de widgets possibles, en particulier ceux documentés pour une utilisation sur un widget d'application . Et, pour un Notification, je doute que les options AdapterView, comme ListView, fonctionnent également.

45
CommonsWare

Pour moi, c’est parce que j’ai mal défini le texte dans remoteViews TextViews. Je faisais ceci:

remoteViews.setString(R.id.txt, "setText", "text");

L'utilisation de l'une de ces méthodes a résolu le problème pour moi:

remoteViews.setCharSequence(R.id.txt, "setText", "text");
//Or simply:
remoteViews.setTextViewText(R.id.txt, "text");
3
iTurki

Toutes les vues ne peuvent pas être utilisées dans RemoteViews. Un objet RemoteViews peut prendre en charge les classes de présentation suivantes:

FrameLayout

LinearLayout

Disposition relative

Disposition de la grille

Horloge analogique

Bouton

Chronomètre

ImageButton

ImageView

Barre de progression

Affichage

ViewFlipper

ListView

GridView

StackView

AdapterViewFlipper

Vous ne pouvez pas utiliser d'autres classes de mise en page comme Edittext ou CustomViews.

2

J'ai constaté que l'utilisation d'Android: background = "? Attr/colorPrimaryDark" provoque également un blocage. Sous Android: background = "@ color/colorPrimaryDark", le plantage a cessé.

0
user3193413