Android开发:如何制作自定义状态栏通知?

发布于 2024-11-03 11:56:08 字数 9611 浏览 3 评论 0原文

我今天试了又试只是为了获得带有 2 个按钮和一个 TextView 的自定义消息。 我已经得到 XML 了。但我尝试使用的代码只是给我强制关闭

RemoteViews contentView = new RemoteViews(getPackageName(), R.layout.main);
        contentView.setImageViewResource(R.id.Button01, R.drawable.icon);
        contentView.setTextViewText(R.id.Button01, "Hello, this message is in a custom expanded view");

Intent notificationIntent = new Intent(this, main.class);
        PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);

,我很迷路,所以请不要将我发送到 http://developer.android.com/guide/topics/ui/notifiers/notifications.html 我试过了。

如果有人能从一开始就向我展示,我会非常高兴,因为我一整天都在尝试这个,并且真的非常感谢一个好的答案!

谢谢你!

//Lukas

编辑* VIKTOR 的完整代码

import android.app.Activity;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.widget.RemoteViews;

public class main extends Activity {
    /** Called when the activity is first created. */
    String ns = Context.NOTIFICATION_SERVICE;
    NotificationManager mNotificationManager = (NotificationManager) getSystemService(ns);

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //setContentView(R.layout.main);

        int icon = R.drawable.icon;
        CharSequence tickerText = "Hello";
        long when = System.currentTimeMillis();

        Notification notification = new Notification(icon, tickerText, when);

        notification.flags |= Notification.FLAG_ONGOING_EVENT;


        String ns = Context.NOTIFICATION_SERVICE;
        NotificationManager mNotificationManager = (NotificationManager) getSystemService(ns);

        RemoteViews contentView = new RemoteViews(getPackageName(), R.layout.main);
        contentView.setImageViewResource(R.id.Button01, R.drawable.icon);
        contentView.setTextViewText(R.id.Button01, "Hello, this message is in a custom expanded view");


        notification.contentView = contentView;

        Intent notificationIntent = new Intent(this, main.class);
        PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);

        notification.contentIntent = contentIntent;
        final int CUSTOM_VIEW_ID = 1;
        mNotificationManager.notify(CUSTOM_VIEW_ID, notification);

    }
}

堆栈跟踪:

04-27 14:43:07.035: ERROR/StatusBarService(337): couldn't inflate view for notification Com.haxxzor.multitask/0x1
04-27 14:43:07.035: ERROR/StatusBarService(337): android.view.InflateException: Binary XML file line #1: Error inflating class android.widget.HorizontalScrollView
04-27 14:43:07.035: ERROR/StatusBarService(337):     at android.view.LayoutInflater.createView(LayoutInflater.java:518)
04-27 14:43:07.035: ERROR/StatusBarService(337):     at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56)
04-27 14:43:07.035: ERROR/StatusBarService(337):     at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:568)
04-27 14:43:07.035: ERROR/StatusBarService(337):     at android.view.LayoutInflater.inflate(LayoutInflater.java:386)
04-27 14:43:07.035: ERROR/StatusBarService(337):     at android.view.LayoutInflater.inflate(LayoutInflater.java:320)
04-27 14:43:07.035: ERROR/StatusBarService(337):     at android.widget.RemoteViews.apply(RemoteViews.java:939)
04-27 14:43:07.035: ERROR/StatusBarService(337):     at com.android.systemui.statusbar.StatusBarService.makeNotificationView(StatusBarService.java:524)
04-27 14:43:07.035: ERROR/StatusBarService(337):     at com.android.systemui.statusbar.StatusBarService.addNotificationViews(StatusBarService.java:553)
04-27 14:43:07.035: ERROR/StatusBarService(337):     at com.android.systemui.statusbar.StatusBarService.addNotification(StatusBarService.java:382)
04-27 14:43:07.035: ERROR/StatusBarService(337):     at com.android.systemui.statusbar.CommandQueue$H.handleMessage(CommandQueue.java:178)
04-27 14:43:07.035: ERROR/StatusBarService(337):     at android.os.Handler.dispatchMessage(Handler.java:99)
04-27 14:43:07.035: ERROR/StatusBarService(337):     at android.os.Looper.loop(Looper.java:123)
04-27 14:43:07.035: ERROR/StatusBarService(337):     at android.app.ActivityThread.main(ActivityThread.java:3683)
04-27 14:43:07.035: ERROR/StatusBarService(337):     at java.lang.reflect.Method.invokeNative(Native Method)
04-27 14:43:07.035: ERROR/StatusBarService(337):     at java.lang.reflect.Method.invoke(Method.java:507)
04-27 14:43:07.035: ERROR/StatusBarService(337):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
04-27 14:43:07.035: ERROR/StatusBarService(337):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
04-27 14:43:07.035: ERROR/StatusBarService(337):     at dalvik.system.NativeStart.main(Native Method)
04-27 14:43:07.035: ERROR/StatusBarService(337): Caused by: android.view.InflateException: Binary XML file line #1: Class not allowed to be inflated android.widget.HorizontalScrollView
04-27 14:43:07.035: ERROR/StatusBarService(337):     at android.view.LayoutInflater.failNotAllowed(LayoutInflater.java:530)
04-27 14:43:07.035: ERROR/StatusBarService(337):     at android.view.LayoutInflater.createView(LayoutInflater.java:477)
04-27 14:43:07.035: ERROR/StatusBarService(337):     ... 17 more
04-27 14:43:10.113: ERROR/AndroidRuntime(815): FATAL EXCEPTION: main
04-27 14:43:10.113: ERROR/AndroidRuntime(815): android.app.RemoteServiceException: Bad notification posted from package Com.haxxzor.multitask: Couldn't expand RemoteViews for: StatusBarNotification(package=Com.haxxzor.multitask id=1 tag=null notification=Notification(vibrate=null,sound=null,defaults=0x0,flags=0x2))
04-27 14:43:10.113: ERROR/AndroidRuntime(815):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1044)
04-27 14:43:10.113: ERROR/AndroidRuntime(815):     at android.os.Handler.dispatchMessage(Handler.java:99)
04-27 14:43:10.113: ERROR/AndroidRuntime(815):     at android.os.Looper.loop(Looper.java:123)
04-27 14:43:10.113: ERROR/AndroidRuntime(815):     at android.app.ActivityThread.main(ActivityThread.java:3683)
04-27 14:43:10.113: ERROR/AndroidRuntime(815):     at java.lang.reflect.Method.invokeNative(Native Method)
04-27 14:43:10.113: ERROR/AndroidRuntime(815):     at java.lang.reflect.Method.invoke(Method.java:507)
04-27 14:43:10.113: ERROR/AndroidRuntime(815):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
04-27 14:43:10.113: ERROR/AndroidRuntime(815):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
04-27 14:43:10.113: ERROR/AndroidRuntime(815):     at dalvik.system.NativeStart.main(Native Method)
04-27 14:47:12.065: ERROR/InputDispatcher(44): channel '40643090 com.notif/com.notif.main (server)' ~ Consumer closed input channel or an error occurred.  events=0x8
04-27 14:47:12.065: ERROR/InputDispatcher(44): channel '40643090 com.notif/com.notif.main (server)' ~ Channel is unrecoverably broken and will be disposed!
04-27 14:47:31.551: ERROR/AndroidRuntime(885): FATAL EXCEPTION: main
04-27 14:47:31.551: ERROR/AndroidRuntime(885): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.notif/com.notif.main}: java.lang.IllegalMonitorStateException: object not locked by thread before notify()
04-27 14:47:31.551: ERROR/AndroidRuntime(885):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647)
04-27 14:47:31.551: ERROR/AndroidRuntime(885):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
04-27 14:47:31.551: ERROR/AndroidRuntime(885):     at android.app.ActivityThread.access$1500(ActivityThread.java:117)
04-27 14:47:31.551: ERROR/AndroidRuntime(885):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
04-27 14:47:31.551: ERROR/AndroidRuntime(885):     at android.os.Handler.dispatchMessage(Handler.java:99)
04-27 14:47:31.551: ERROR/AndroidRuntime(885):     at android.os.Looper.loop(Looper.java:123)
04-27 14:47:31.551: ERROR/AndroidRuntime(885):     at android.app.ActivityThread.main(ActivityThread.java:3683)
04-27 14:47:31.551: ERROR/AndroidRuntime(885):     at java.lang.reflect.Method.invokeNative(Native Method)
04-27 14:47:31.551: ERROR/AndroidRuntime(885):     at java.lang.reflect.Method.invoke(Method.java:507)
04-27 14:47:31.551: ERROR/AndroidRuntime(885):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
04-27 14:47:31.551: ERROR/AndroidRuntime(885):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
04-27 14:47:31.551: ERROR/AndroidRuntime(885):     at dalvik.system.NativeStart.main(Native Method)
04-27 14:47:31.551: ERROR/AndroidRuntime(885): Caused by: java.lang.IllegalMonitorStateException: object not locked by thread before notify()
04-27 14:47:31.551: ERROR/AndroidRuntime(885):     at java.lang.Object.notify(Native Method)
04-27 14:47:31.551: ERROR/AndroidRuntime(885):     at com.notif.main.onCreate(main.java:27)
04-27 14:47:31.551: ERROR/AndroidRuntime(885):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
04-27 14:47:31.551: ERROR/AndroidRuntime(885):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
04-27 14:47:31.551: ERROR/AndroidRuntime(885):     ... 11 more

I've tried and tried today just to get a custom message with 2 buttons and a TextView.
Ive got the XML alraight. But the code i tried to use just give me Force Close

RemoteViews contentView = new RemoteViews(getPackageName(), R.layout.main);
        contentView.setImageViewResource(R.id.Button01, R.drawable.icon);
        contentView.setTextViewText(R.id.Button01, "Hello, this message is in a custom expanded view");

Intent notificationIntent = new Intent(this, main.class);
        PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);

and im pretty lost so please dont send me to http://developer.android.com/guide/topics/ui/notifiers/notifications.html
Ive tried.

Would be really happy if someone could show me from the beggining because i have litterly tried this all the day and would really really appreciate a good answer!

Thank you!

//Lukas

EDIT* FULL CODE TO VIKTOR

import android.app.Activity;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.widget.RemoteViews;

public class main extends Activity {
    /** Called when the activity is first created. */
    String ns = Context.NOTIFICATION_SERVICE;
    NotificationManager mNotificationManager = (NotificationManager) getSystemService(ns);

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //setContentView(R.layout.main);

        int icon = R.drawable.icon;
        CharSequence tickerText = "Hello";
        long when = System.currentTimeMillis();

        Notification notification = new Notification(icon, tickerText, when);

        notification.flags |= Notification.FLAG_ONGOING_EVENT;


        String ns = Context.NOTIFICATION_SERVICE;
        NotificationManager mNotificationManager = (NotificationManager) getSystemService(ns);

        RemoteViews contentView = new RemoteViews(getPackageName(), R.layout.main);
        contentView.setImageViewResource(R.id.Button01, R.drawable.icon);
        contentView.setTextViewText(R.id.Button01, "Hello, this message is in a custom expanded view");


        notification.contentView = contentView;

        Intent notificationIntent = new Intent(this, main.class);
        PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);

        notification.contentIntent = contentIntent;
        final int CUSTOM_VIEW_ID = 1;
        mNotificationManager.notify(CUSTOM_VIEW_ID, notification);

    }
}

Stack trace:

04-27 14:43:07.035: ERROR/StatusBarService(337): couldn't inflate view for notification Com.haxxzor.multitask/0x1
04-27 14:43:07.035: ERROR/StatusBarService(337): android.view.InflateException: Binary XML file line #1: Error inflating class android.widget.HorizontalScrollView
04-27 14:43:07.035: ERROR/StatusBarService(337):     at android.view.LayoutInflater.createView(LayoutInflater.java:518)
04-27 14:43:07.035: ERROR/StatusBarService(337):     at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56)
04-27 14:43:07.035: ERROR/StatusBarService(337):     at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:568)
04-27 14:43:07.035: ERROR/StatusBarService(337):     at android.view.LayoutInflater.inflate(LayoutInflater.java:386)
04-27 14:43:07.035: ERROR/StatusBarService(337):     at android.view.LayoutInflater.inflate(LayoutInflater.java:320)
04-27 14:43:07.035: ERROR/StatusBarService(337):     at android.widget.RemoteViews.apply(RemoteViews.java:939)
04-27 14:43:07.035: ERROR/StatusBarService(337):     at com.android.systemui.statusbar.StatusBarService.makeNotificationView(StatusBarService.java:524)
04-27 14:43:07.035: ERROR/StatusBarService(337):     at com.android.systemui.statusbar.StatusBarService.addNotificationViews(StatusBarService.java:553)
04-27 14:43:07.035: ERROR/StatusBarService(337):     at com.android.systemui.statusbar.StatusBarService.addNotification(StatusBarService.java:382)
04-27 14:43:07.035: ERROR/StatusBarService(337):     at com.android.systemui.statusbar.CommandQueue$H.handleMessage(CommandQueue.java:178)
04-27 14:43:07.035: ERROR/StatusBarService(337):     at android.os.Handler.dispatchMessage(Handler.java:99)
04-27 14:43:07.035: ERROR/StatusBarService(337):     at android.os.Looper.loop(Looper.java:123)
04-27 14:43:07.035: ERROR/StatusBarService(337):     at android.app.ActivityThread.main(ActivityThread.java:3683)
04-27 14:43:07.035: ERROR/StatusBarService(337):     at java.lang.reflect.Method.invokeNative(Native Method)
04-27 14:43:07.035: ERROR/StatusBarService(337):     at java.lang.reflect.Method.invoke(Method.java:507)
04-27 14:43:07.035: ERROR/StatusBarService(337):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
04-27 14:43:07.035: ERROR/StatusBarService(337):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
04-27 14:43:07.035: ERROR/StatusBarService(337):     at dalvik.system.NativeStart.main(Native Method)
04-27 14:43:07.035: ERROR/StatusBarService(337): Caused by: android.view.InflateException: Binary XML file line #1: Class not allowed to be inflated android.widget.HorizontalScrollView
04-27 14:43:07.035: ERROR/StatusBarService(337):     at android.view.LayoutInflater.failNotAllowed(LayoutInflater.java:530)
04-27 14:43:07.035: ERROR/StatusBarService(337):     at android.view.LayoutInflater.createView(LayoutInflater.java:477)
04-27 14:43:07.035: ERROR/StatusBarService(337):     ... 17 more
04-27 14:43:10.113: ERROR/AndroidRuntime(815): FATAL EXCEPTION: main
04-27 14:43:10.113: ERROR/AndroidRuntime(815): android.app.RemoteServiceException: Bad notification posted from package Com.haxxzor.multitask: Couldn't expand RemoteViews for: StatusBarNotification(package=Com.haxxzor.multitask id=1 tag=null notification=Notification(vibrate=null,sound=null,defaults=0x0,flags=0x2))
04-27 14:43:10.113: ERROR/AndroidRuntime(815):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1044)
04-27 14:43:10.113: ERROR/AndroidRuntime(815):     at android.os.Handler.dispatchMessage(Handler.java:99)
04-27 14:43:10.113: ERROR/AndroidRuntime(815):     at android.os.Looper.loop(Looper.java:123)
04-27 14:43:10.113: ERROR/AndroidRuntime(815):     at android.app.ActivityThread.main(ActivityThread.java:3683)
04-27 14:43:10.113: ERROR/AndroidRuntime(815):     at java.lang.reflect.Method.invokeNative(Native Method)
04-27 14:43:10.113: ERROR/AndroidRuntime(815):     at java.lang.reflect.Method.invoke(Method.java:507)
04-27 14:43:10.113: ERROR/AndroidRuntime(815):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
04-27 14:43:10.113: ERROR/AndroidRuntime(815):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
04-27 14:43:10.113: ERROR/AndroidRuntime(815):     at dalvik.system.NativeStart.main(Native Method)
04-27 14:47:12.065: ERROR/InputDispatcher(44): channel '40643090 com.notif/com.notif.main (server)' ~ Consumer closed input channel or an error occurred.  events=0x8
04-27 14:47:12.065: ERROR/InputDispatcher(44): channel '40643090 com.notif/com.notif.main (server)' ~ Channel is unrecoverably broken and will be disposed!
04-27 14:47:31.551: ERROR/AndroidRuntime(885): FATAL EXCEPTION: main
04-27 14:47:31.551: ERROR/AndroidRuntime(885): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.notif/com.notif.main}: java.lang.IllegalMonitorStateException: object not locked by thread before notify()
04-27 14:47:31.551: ERROR/AndroidRuntime(885):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647)
04-27 14:47:31.551: ERROR/AndroidRuntime(885):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
04-27 14:47:31.551: ERROR/AndroidRuntime(885):     at android.app.ActivityThread.access$1500(ActivityThread.java:117)
04-27 14:47:31.551: ERROR/AndroidRuntime(885):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
04-27 14:47:31.551: ERROR/AndroidRuntime(885):     at android.os.Handler.dispatchMessage(Handler.java:99)
04-27 14:47:31.551: ERROR/AndroidRuntime(885):     at android.os.Looper.loop(Looper.java:123)
04-27 14:47:31.551: ERROR/AndroidRuntime(885):     at android.app.ActivityThread.main(ActivityThread.java:3683)
04-27 14:47:31.551: ERROR/AndroidRuntime(885):     at java.lang.reflect.Method.invokeNative(Native Method)
04-27 14:47:31.551: ERROR/AndroidRuntime(885):     at java.lang.reflect.Method.invoke(Method.java:507)
04-27 14:47:31.551: ERROR/AndroidRuntime(885):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
04-27 14:47:31.551: ERROR/AndroidRuntime(885):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
04-27 14:47:31.551: ERROR/AndroidRuntime(885):     at dalvik.system.NativeStart.main(Native Method)
04-27 14:47:31.551: ERROR/AndroidRuntime(885): Caused by: java.lang.IllegalMonitorStateException: object not locked by thread before notify()
04-27 14:47:31.551: ERROR/AndroidRuntime(885):     at java.lang.Object.notify(Native Method)
04-27 14:47:31.551: ERROR/AndroidRuntime(885):     at com.notif.main.onCreate(main.java:27)
04-27 14:47:31.551: ERROR/AndroidRuntime(885):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
04-27 14:47:31.551: ERROR/AndroidRuntime(885):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
04-27 14:47:31.551: ERROR/AndroidRuntime(885):     ... 11 more

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

国粹 2024-11-10 11:56:08

由于您已发布错误消息,因此此行会告诉您自定义通知未成功的原因:

由以下原因引起:android.view.InflateException:二进制 XML 文件第 1 行:类不允许膨胀 android.widget.Horizo​​ntalScrollView

删除 Horizo​​ntalScrollView 并仅使用简单的 TextView 进行测试s / ImageViews。

Since you have posted the error message, this line tells you why you're not succeeding with the custom notification:

Caused by: android.view.InflateException: Binary XML file line #1: Class not allowed to be inflated android.widget.HorizontalScrollView

Remove the HorizontalScrollView and just test with simple TextViews / ImageViews.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文