スキップしてメイン コンテンツに移動

Android:カスタマイズしたAlertDialog.Builderの幅を変更

ダイアログの幅をカスタマイズするなら、Dialogクラスを使った方がダイアログの幅はいじりやすいです。こちらでされてるように、

・Y.A.M の 雑記帳: Android Dialog の大きさを自分で設定する
http://y-anz-m.blogspot.jp/2012/05/androiddialog.html

AlertDialog.Builderをいじるときは、ちょっとハマったのでメモしておきます。

環境

Windows7
JDK1.7
Eclipse 3.7 Indigo Service Release 2
Android 2.1

幅を指定しないと…

AlertDialog.Builderでも、setTitle("hogehoge");のように、タイトルを設定してやれば、特に幅を気にすることもないかもしれません。このように適切な幅で表示してくれます。

image

しかし、setTitle()をしないで、XMLファイルからレイアウトを読み込んだりすると、そのXMLファイルのレイアウト幅で表示されてしまいます。

image

幅を指定する

ググったらこちらにやり方が載ってましたが、

・android - How to make an alert dialog fill 90% of screen size? - Stack Overflow
http://stackoverflow.com/questions/2306503/how-to-make-an-alert-dialog-fill-90-of-screen-size

背景が真っ黒になったりするので、微調整しました。AlertDialog.Builderに対して、もしくはAlertDialog.Builderを継承したクラス内に記述してやれば良いでしょう。R.layout.dialog_layoutはボタンのみが配置されてるXMLファイルです。

    // XMLファイルからレイアウトを読み込む
LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout.dialog_layout, null);

setPositiveButton("OK", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
// OKボタンをクリックした時の処理
dialog.cancel();
}
});
setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
// Cancelボタンをクリックした時の処理
dialog.cancel();
}
});
setView(view);

Dialog d = create();
d.show();
LayoutParams lp = d.getWindow().getAttributes();
lp.width = LayoutParams.FILL_PARENT;
d.getWindow().setAttributes(lp);

こんな感じ



また、画面幅の求め方は、以下のように(Activityでの例)





    WindowManager wm = (WindowManager)getSystemService(Context.WINDOW_SERVICE);
Display disp = wm.getDefaultDisplay();
int width = (int)(disp.getWidth() * 0.8);


int widthの値は画面幅80%を求めています。これをさっきのlp.widthに指定してやれば良いです。



ソース



初めてGithubにアップロードしてみました。※変なスペルが混ざってしまいましたが…



AlertDialog.Builderを継承したクラス(CustomAlertDialog)をActivityから呼び出すものです。CustomAlertDialogでは、サイズを指定した場合とそうでない場合の2種類のコンストラクタを用意しています。サイズが指定されなかった場合は、LayoutParams.FILL_PARENTの幅として表示されます。


takaiwa/CustomWidthAlerDialog · GitHub

コメント

このブログの人気の投稿

Javaでprivateなfieldやmethodにアクセスする

JUnitでテストしてると、privateなフィールドにアクセスして、値を参照したりセットしたりしたくなるわけですが、よく使うのでメモしておきます。 例えば、次のような対象のクラスがあるとします。 public class ParentClass { private String hoge = "ParentClass!!"; public void dispMsg() { System.out.println("dispMsg:" + hoge); } private void privateDispMsg(String msg) { System.out.println("dispMsg:" + msg); } }

GolangでWindows GUIアプリケーション

GUIアプリ作成の前提 社内ツールとしてexeで配布 開発環境はGoLandを使う 社内ツールとしてexeを配布ということであれば、Visual StudioでC#による開発だと思います。しかしながら、Go言語を習得したいのと、GoLandの補完機能が便利で、Android Studio使っていたこともあり、とっつきやすいという点からGo縛りでGUIアプリケーションを考えたいと思います。 lxn/walk Windows application library kit for Go. Windows向けしか考えていないので、まずこのライブラリなのですが、ボタンやコンボボックスが思ったように並ばなかったり、手軽にイメージボタンを配置したりなど、簡単にレイアウトを変更できない課題に直面しました。レイアウト作成だけで時間を取られてしまいます。そう言えば、Androidアプリ開発のときは、XMLでデザイン部分を切り離してたのを思い出して、今回の調査の運びとなりました。 fyne-io/fyne Cross platform native GUIs designed for Go based on Material Design. Supports: Linux, macOS, Windows, BSD, iOS and Android. walkと比べると、クロスプラットフォームで作成できるのですが、こちらもコードの中にデザインを書いていく形でした。 therecipe/qt therecipe/qt allows you to write Qt applications entirely in Go or JavaScript. Qt Creatorなるものがあるようで、デザイン部分を切り離せる印象はあるものの、最新のPCでもビルドに時間がかかるようで、学習コストもかかるという記事を見かけて断念しました。 どうしたものかとツイートしましたら、下記のようにご助言をいただいた。 同じ課題に対し色々試した結果、PWAのフルキャッシュドに落ち着いた。中身はGo+WASMで。 https://t.co/e60whDTV16 — のぼのぼ📡 (@nobonobo) July 21, 2020 PWA 早速調べてみました。Googleが進めているプロジェクトで、ネイティブアプリのよ

Eclipseの高速化メモ

Eclipseが重いと一言に言っても、いろいろな工程での話があると思いますが、過去記事のなども含めてこの記事にピックアップしておきたいと思います。以下はWindows環境での話です。