Android, AlertDialog でタイトルをスクロール(marquee)させる

Android のダイアログで、長いタイトルをセットした際にテキストをスクロールして表示させようと、いろいろ試した際のメモ。

Dialog で通常のタイトル表示

最初に DialogsetTitle() でタイトルをセットする、通常の方法を試してみる。
この場合、長いタイトルは途中で切れてしまい読めない。

Android, Dialog, setTitle() でタイトル表示 Screenshot

layout ファイル

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <TextView
        android:id="@+id/content"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" />
</LinearLayout>

ダイアログ表示コード

Dialog dialog = new Dialog(this);
dialog.setContentView(R.layout.dialog_with_title);
((TextView) dialog.findViewById(R.id.content)).setText(getResources().getString(R.string.description));
dialog.setTitle(getResources().getString(R.string.title));
dialog.show();

DialogTextView をスクロール

次に Dialog を使ってタイトルをスクロールさせてみた。
といっても、スクロールさせたのはタイトル用に配置した TextView で、setTitle() は行わずに非表示にしている。

この場合、setTitle() で表示されるはずのタイトル部分に空欄のスペースができる。
タイトルは、代りに配置したタイトル用 TextView でスクロール表示されている。

Android, Dialog でタイトルをスクロール表示 Screenshot

layout ファイル

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <TextView
        android:id="@+id/title"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:textSize="18sp"
        android:singleLine="true"
        android:ellipsize="marquee"
        android:focusable="true"
        android:focusableInTouchMode="true" />
    <TextView
        android:id="@+id/content"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" />
</LinearLayout>

ダイアログ表示コード

Dialog dialog = new Dialog(this);
dialog.setContentView(R.layout.dialog);
((TextView) dialog.findViewById(R.id.title)).setText(getResources().getString(R.string.title));
((TextView) dialog.findViewById(R.id.content)).setText(getResources().getString(R.string.description));
dialog.show();

AlertDialog でタイトルをスクロール表示

DialogsetTitle() を行わなかった場合の無駄なスペースは、AlertDialogsetTitle() を行わない場合には表示されない。
しかし、AlertDialogsetTitle() を行わなかった場合、タイトルが入るはずだったダイアログ上部にマージンができてしまう。

Android, AlertDialog でタイトルをスクロール表示 Screenshot

layout ファイル

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/layout_root"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <TextView
        android:id="@+id/title"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:textSize="18sp"
        android:singleLine="true"
        android:ellipsize="marquee"
        android:focusable="true"
        android:focusableInTouchMode="true" />
    <TextView
        android:id="@+id/content"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" />
</LinearLayout>

ダイアログ表示コード

AlertDialog.Builder builder = new AlertDialog.Builder(this);
LayoutInflater inflater = (LayoutInflater) this.getSystemService(LAYOUT_INFLATER_SERVICE);
View layout = inflater.inflate(R.layout.alert_dialog, (ViewGroup) findViewById(R.id.layout_root));
((TextView) layout.findViewById(R.id.title)).setText(getResources().getString(R.string.title));
((TextView) layout.findViewById(R.id.content)).setText(getResources().getString(R.string.description));
builder.setView(layout);
AlertDialog dialog = builder.create();
dialog.show();

setTitle() でタイトルをセットした AlertDialog

通常の方法でタイトルをセットすると、長いタイトルは2行に折りかえされて、2行で収まらない場合はそれ以降は読めない。

Android, AlertDialog, setTitle() でタイトルを表示 Screenshot

layout ファイル

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/layout_root"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <TextView
        android:id="@+id/content"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" />
</LinearLayout>

ダイアログ表示コード

AlertDialog.Builder builder = new AlertDialog.Builder(this);
LayoutInflater inflater = (LayoutInflater) this.getSystemService(LAYOUT_INFLATER_SERVICE);
View layout = inflater.inflate(R.layout.alert_dialog_with_title, (ViewGroup) findViewById(R.id.layout_root));
builder.setTitle(getResources().getString(R.string.title));
((TextView) layout.findViewById(R.id.content)).setText(getResources().getString(R.string.description));
builder.setView(layout);
AlertDialog dialog = builder.create();
dialog.show();

setCustomTitle() を使って AlertDialog でタイトルをスクロールさせる

タイトルが表示されるはずだったマージンをなくすために、setCustomTitle() を使ってスクロールできるタイトルを作る。

layout ファイル

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/layout_root"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <TextView
        android:id="@+id/content"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" />
</LinearLayout>

カスタムタイトル用の layout ファイル

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/layout_root"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <TextView
        android:id="@+id/title"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:textSize="18sp"
        android:singleLine="true"
        android:ellipsize="marquee"
        android:focusable="true"
        android:focusableInTouchMode="true" />
</LinearLayout>

タイトル表示コード

AlertDialog.Builder builder = new AlertDialog.Builder(this);
LayoutInflater inflater = (LayoutInflater) this.getSystemService(LAYOUT_INFLATER_SERVICE);
View titleLayout = inflater.inflate(R.layout.marquee_title, (ViewGroup) findViewById(R.id.layout_root));
((TextView) titleLayout.findViewById(R.id.title)).setText(getResources().getString(R.string.title));
builder.setCustomTitle(titleLayout);
View layout = inflater.inflate(R.layout.alert_dialog_with_marquee_title, (ViewGroup) findViewById(R.id.layout_root));
((TextView) layout.findViewById(R.id.content)).setText(getResources().getString(R.string.description));
builder.setView(layout);
AlertDialog dialog = builder.create();
dialog.show();

setCustomTitle() で、タイトル表示部分にスクロール表示されるタイトルを配置し、余分なマージンもなく画面一杯にダイアログが表示できている。

Android, AlertDialog, setCustomTitle() でタイトルをスクロール表示 Screenshot

Google Androidプログラミング入門
江川 崇 竹端 進 山田 暁通 麻野 耕一 山岡 敏夫 藤井 大助 藤田 泰介 佐野 徹郎
アスキー・メディアワークス
売り上げランキング: 1717
コメント

こんにちは、記事拝見させて頂いております。
表示が上手くいかないのですがもしよろしければ、サンプルソースコード頂けませんか?
宜しくお願い致します。

コメント by 田中 | 2013年10月11日 - 17:38
Top