Android
 Computer >> コンピューター >  >> プログラミング >> Android

Android通知でテキストコンテンツをマーキー表示する方法

この記事では、Androidの通知(Notification)内に表示するテキストが長すぎる場合に、文字列を横方向へ自動スクロールさせる「マーキー」効果を実装する方法を、サンプルコードとともにステップごとに解説します。

ステップ1:新規プロジェクトの作成

Android Studioを起動し、「File」→「New Project」を選択して新しいプロジェクトを作成します。必要な設定項目をすべて入力してプロジェクトを生成してください。

ステップ2:activity_main.xmlの編集

res/layout/activity_main.xml に以下のコードを追加します。ボタンを1つ配置し、クリック時に通知を生成できるようにしています。

<? xml version = "1.0" encoding = "utf-8" ?>
<RelativeLayout xmlns: android = "https://schemas.android.com/apk/res/android"
    xmlns: tools = "https://schemas.android.com/tools"
    android :layout_width = "match_parent"
    android :layout_height = "match_parent"
    tools :context = ".MainActivity" >
    <Button
        android :layout_width = "match_parent"
        android :layout_height = "wrap_content"
        android :layout_centerInParent = "true"
        android :layout_margin = "16dp"
        android :onClick = "createNotification"
        android :text= "create notification" />
</RelativeLayout>

ステップ3:custom_notification_layout.xmlの編集

次に、通知用のカスタムレイアウトとして res/layout/custom_notification_layout.xml を作成し、以下のコードを追加します。

マーキー表示のポイントは、対象となる TextView に android:ellipsize="marquee"android:singleLine="true" を指定することです。これにより、テキストが1行に収まらない場合に自動的にスクロール表示されます。

<? xml version = "1.0" encoding = "utf-8" ?>
<RelativeLayout xmlns: android = "https://schemas.android.com/apk/res/android"
    android :id = "@+id/layout"
    android :layout_width = "fill_parent"
    android :layout_height = "64dp"
    android :padding = "10dp" >
    <ImageView
        android :id = "@+id/image"
        android :layout_width = "wrap_content"
        android :layout_height = "fill_parent"
        android :layout_alignParentStart = "true"
        android :layout_marginEnd = "10dp"
        android :contentDescription = "@string/app_name"
        android :src = "@mipmap/ic_launcher" />
    <TextView
        android :id = "@+id/title"
        android :layout_width = "wrap_content"
        android :layout_height = "wrap_content"
        android :layout_toEndOf = "@id/image"
        android :text = "Testing"
        android :textColor = "#000"
        android :textSize = "13sp" />
    <TextView
        android :id = "@+id/text"
        android :layout_width = "wrap_content"
        android :layout_height = "wrap_content"
        android :layout_below = "@id/title"
        android :layout_toEndOf = "@id/image"
        android :ellipsize = "marquee"
        android :singleLine = "true"
        android :text = "Lorem Ipsum is simply dummy text of the printing and typesetting
            industry. Lorem Ipsum has been the industry's standard dummy text ever since the
            1500s, when an unknown printer took a galley of type and scrambled it to make a type
            specimen book. It has survived not only five centuries, but also the leap into
            electronic typesetting, remaining essentially unchanged. It was popularised in the
            1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more
            recently with desktop publishing software like Aldus PageMaker including versions of
            Lorem Ipsum. "
        android :textColor = "#000"
        android :textSize = "13sp" />
</RelativeLayout>

ステップ4:MainActivity.javaの編集

src/MainActivity.java に以下のコードを追加します。RemoteViews を使って先ほど作成したカスタムレイアウトを通知にセットし、Android 8.0(API 26)以降では通知チャンネルも併せて作成しています。

package app.tutorialspoint.com.notifyme ;
import android.app.NotificationChannel ;
import android.app.NotificationManager ;
import android.os.Bundle ;
import android.support.v4.app.NotificationCompat ;
import android.support.v7.app.AppCompatActivity ;
import android.view.View ;
import android.widget.RemoteViews ;
public class MainActivity extends AppCompatActivity {
    public static final String NOTIFICATION_CHANNEL_ID = "10001" ;
    private final static String default_notification_channel_id = "default" ;
    @Override
    protected void onCreate (Bundle savedInstanceState) {
        super .onCreate(savedInstanceState) ;
        setContentView(R.layout. activity_main ) ;
    }
    public void createNotification (View view) {
        RemoteViews contentView = new RemoteViews(getPackageName() , R.layout. custom_notification_layout ) ;
        NotificationManager mNotificationManager = (NotificationManager) getSystemService( NOTIFICATION_SERVICE ) ;
        NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(MainActivity. this, default_notification_channel_id ) ;
        mBuilder.setContent(contentView) ;
        mBuilder.setSmallIcon(R.drawable. ic_launcher_foreground ) ;
        mBuilder.setAutoCancel( true ) ;
        if (android.os.Build.VERSION. SDK_INT >= android.os.Build.VERSION_CODES. O ) {
            int importance = NotificationManager. IMPORTANCE_HIGH ;
            NotificationChannel notificationChannel = new NotificationChannel( NOTIFICATION_CHANNEL_ID , "NOTIFICATION_CHANNEL_NAME" , importance) ;
            mBuilder.setChannelId( NOTIFICATION_CHANNEL_ID ) ;
            assert mNotificationManager != null;
            mNotificationManager.createNotificationChannel(notificationChannel) ;
        }
        assert mNotificationManager != null;
        mNotificationManager.notify(( int ) System. currentTimeMillis () ,
        mBuilder.build()) ;
    }
}

ステップ5:AndroidManifest.xmlの編集

最後に、AndroidManifest.xml に以下のコードを追加します。

<? xml version= "1.0" encoding= "utf-8" ?>
<manifest xmlns:
    android = "https://schemas.android.com/apk/res/android" package= "app.tutorialspoint.com.notifyme">
    <uses-permission
        android :name= "android.permission.VIBRATE" />
        <application
            android :allowBackup = "true"
            android :icon= "@mipmap/ic_launcher"
            android :label= "@string/app_name"
            android :roundIcon= "@mipmap/ic_launcher_round"
            android :supportsRtl= "true"
            android :theme= "@style/AppTheme" >
            <activity android :name= ".MainActivity" >
                <intent-filter>
                    <action android :name= "android.intent.action.MAIN" />
                    <category android :name= "android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
    </application>
</manifest>

アプリの実行と動作確認

それでは、実際にアプリケーションを実行してみましょう。Androidスマートフォンをパソコンに接続した状態を前提としています。Android Studioでプロジェクトのアクティビティファイルを開き、ツールバーの「Run」アイコンをクリックしてください。実行デバイスとして自分のモバイル端末を選択すると、端末のデフォルト画面が表示されます。

画面上のボタンをタップして通知を生成すると、通知領域にカスタムレイアウトが表示され、長いテキストがマーキーとして流れるようにスクロールすることを確認できます。

  1. Androidでビューの位置を動的に設定する方法をわかりやすく解説

    この記事では、Androidアプリでボタンのタップをきっかけに、TextViewなどのビューの位置を動的に変更する方法を、実際のコード例とともにステップ形式で解説します。ポイントは RelativeLayout.LayoutParams の addRule() メソッドです。これを使うことで、実行時にレイアウト上のルール(配置条件)を追加・変更できます。完成イメージ画面中央に配置されたボタンをタップすると、その直下・左端を揃える位置へTextViewが移動します。手順1:Android Studioで新規プロジェクトを作成するAndroid Studioを起動し、メニューから「File」→「N

  2. 【Android】ホームボタンの押下を検知する方法|onUserLeaveHint()の実装手順を解説

    はじめに:Androidでホームボタンは「上書き」できるのか? 結論から言うと、Androidではセキュリティ上の設計思想により、ホームボタンの動作そのものを完全に無効化したり乗っ取ったりすることはできません。これは、ユーザーがいつでもアプリから抜けられるようにするためのGoogleの意図的な仕様です。しかし、onUserLeaveHint()というコールバックメソッドを利用すれば、「ユーザーがホームボタンを押してアプリを離れようとした瞬間」を検知することは可能です。本記事では、ホームボタンが押されたタイミングでToastメッセージを表示するサンプルアプリの作成手順を、ステップごとにわかりやす