web-dev-qa-db-ja.com

カスタムの大きな通知を作成する

いくつかのコントロールを含む通知を作成したかった。テキストとコントロールはデフォルトの通知サイズ(64dp)で小さいため、デフォルトのサイズよりも大きくしたかったのです。
より大きな通知を作成することは可能で、カスタムレイアウトを使用することも可能だと思いますが、その方法はわかりません。

具体的には、次のスクリーンショットはspotifyからの通知を示しています( here からの画像取得): Spotify notification

ご覧のとおり、サイズはデフォルトよりも大きくなっています。さらに、テキストのないある種のImageButtonsがあります- Notification.Builder.addAction() を使用すると、提供できますアイコンですが、説明としてCharSequenceを提供する必要があります-説明を空のままにすると、テキスト用に予約されたスペースが残り、null、クラッシュします。

カスタムレイアウトで大きな通知を作成する方法を教えてもらえますか?

ありがとう

19
MalaKa

APIの変更による更新:

API 24以降、_Notification.Builder_には setCustomBigContentView(RemoteViews) -methodが含まれます。 NotificationCompat.Builder (support.v4パッケージの一部)にもこのメソッドが含まれています。
NotificationCompat.Builder.setCustomBigContentView のドキュメントには次のように記載されていることに注意してください。

展開されたフォームのプラットフォームテンプレートの代わりに使用するカスタムRemoteViewを提供します。これにより、このBuilderオブジェクトによって作成された拡張レイアウトがオーバーライドされます。 JELLY_BEANより前のバージョンでは何もしません。

したがって、これはAPI> = 16(JELLY_BEAN)に対してのみ機能します。


元の回答

したがって、Googleを過度に使用した後、 このチュートリアル カスタムビッグレイアウトの使用方法を説明しています。トリックはsetStyle()を使用せず、ビルド後にbigContentViewNotificationフィールドを手動で設定することです。少しハックのようですが、これは私がついに思いついたものです:

notification_layout_big.xml:

_<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="match_parent"
    Android:layout_height="100dp" <!-- This is where I manually define the height -->
    Android:orientation="horizontal" >

    <!-- some more elements.. --> 
</LinearLayout>
_

コードでのNotificationの構築:

_Notification foregroundNote;

RemoteViews bigView = new RemoteViews(getApplicationContext().getPackageName(),
    R.layout.notification_layout_big);

// bigView.setOnClickPendingIntent() etc..

Notification.Builder mNotifyBuilder = new Notification.Builder(this);
foregroundNote = mNotifyBuilder.setContentTitle("some string")
        .setContentText("Slide down on note to expand")
        .setSmallIcon(R.drawable.ic_stat_notify_white)
        .setLargeIcon(bigIcon)
        .build();

foregroundNote.bigContentView = bigView;

// now show notification..
NotificationManager mNotifyManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
mNotifyManager.notify(1, foregroundNote);
_

編集
chx101で述べたように、これはAPI> = 16でのみ機能します。この回答では言及しませんでしたが、上記のリンクされたチュートリアルで言及しました。

拡張通知は、Android 4.1 JellyBean [API 16]で最初に導入されました。

58
MalaKa