web-dev-qa-db-ja.com

警告ダイアログを画面サイズの90%にする方法は?

カスタムアラートダイアログを作成して表示することもできますが、それでも、ダイアログxmlにAndroid:layout_width/height="fill_parent"が含まれているのは内容と同じくらいの大きさです。

私が欲しいのは、たぶん20ピクセルのパディングを除いて画面全体を埋めるダイアログです。それからダイアログの一部である画像は自動的にfill_parentでフルダイアログサイズに引き伸ばされます。

264
Fabian

Androidプラットフォーム開発者のDianne Hackbornによると、 この ディスカッショングループの投稿によると、DialogはWindowのトップレベルのレイアウトの幅と高さをWRAP_CONTENTに設定しています。ダイアログを大きくするために、これらのパラメータをMATCH_PARENTに設定することができます。

デモコード:

    AlertDialog.Builder adb = new AlertDialog.Builder(this);
    Dialog d = adb.setView(new View(this)).create();
    // (That new View is just there to have something inside the dialog that can grow big enough to cover the whole screen.)

    WindowManager.LayoutParams lp = new WindowManager.LayoutParams();
    lp.copyFrom(d.getWindow().getAttributes());
    lp.width = WindowManager.LayoutParams.MATCH_PARENT;
    lp.height = WindowManager.LayoutParams.MATCH_PARENT;
    d.show();
    d.getWindow().setAttributes(lp);

ダイアログが表示された後に属性が設定されることに注意してください。システムはそれらがいつ設定されるかについて微妙です。 (ダイアログが最初に表示されたときなどに、レイアウトエンジンがそれらを設定しなければならないと思います。)

Theme.Dialogを拡張することによってこれを行うほうがよいでしょう、そしてあなたはいつsetAttributesを呼び出すべきかについて推測ゲームをする必要はないでしょう。 (ダイアログが自動的に適切な明るいテーマまたは暗いテーマ、またはHoneycomb Holoテーマを採用するようにするのはもう少し手間がかかりますが、それは http://developer.Android.comに従って実行できます。 /guide/topics/ui/themes.html#SelectATheme

337
nmr

カスタムダイアログレイアウトをRelativeLayoutではなくLinearLayoutにラップしてみてください。それは私のために働いた。

138
cvarsendan

ダイアログウィンドウでFILL_PARENTを指定することは、他の人が示唆しているように、画面全体を塗りつぶすために黒いダイアログの背景を広げただけなので、私にとってはうまくいきませんでした(Android 4.0.4)。

うまく機能するのは、最小表示値を使用することですが、ダイアログ内で画面の90%を占めるようにコード内で指定することです。

そう:

Activity activity = ...;
AlertDialog dialog = ...;

// retrieve display dimensions
Rect displayRectangle = new Rect();
Window window = activity.getWindow();
window.getDecorView().getWindowVisibleDisplayFrame(displayRectangle);

// inflate and adjust layout
LayoutInflater inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View layout = inflater.inflate(R.layout.your_dialog_layout, null);
layout.setMinimumWidth((int)(displayRectangle.width() * 0.9f));
layout.setMinimumHeight((int)(displayRectangle.height() * 0.9f));

dialog.setView(layout);

一般に、幅を調整するだけでほとんどの場合十分です。

80
koma

カスタムビューxmlにAndroid:minWidthAndroid:minHeightを設定します。これらは、コンテンツサイズをラップしないようにアラートに強制することができます。このようなビューを使用してそれを行う必要があります。

<LinearLayout
  xmlns:Android="http://schemas.Android.com/apk/res/Android"
  Android:layout_width="fill_parent"
  Android:layout_height="fill_parent"
  Android:minWidth="300dp" 
  Android:minHeight="400dp">
  <ImageView
   Android:layout_width="fill_parent"
   Android:layout_height="fill_parent"
   Android:background="@drawable/icon"/>
</LinearLayout>
77
jqpubliq

もっと簡単にすれば、これをやるだけです。

int width = (int)(getResources().getDisplayMetrics().widthPixels*0.90);
int height = (int)(getResources().getDisplayMetrics().heightPixels*0.90);

alertDialog.getWindow().setLayout(width, height);
52
FOMDeveloper
dialog.getWindow().setLayout(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
50
Elvis

ここでの他のすべての答えは理にかなっていますが、それはファビアンが必要とするものを満たしていませんでした。これが私の解決策です。それは完璧な解決策ではないかもしれませんが、それは私のために働きます。フルスクリーンのダイアログが表示されますが、上下左右にパディングを指定できます。

まずこれをres/values/styles.xmlに置きます。

<style name="CustomDialog" parent="@Android:style/Theme.Dialog">
    <item name="Android:windowIsTranslucent">true</item>
    <item name="Android:windowBackground">@color/Black0Percent</item>
    <item name="Android:paddingTop">20dp</item>
    <item name="Android:windowContentOverlay">@null</item>
    <item name="Android:windowNoTitle">true</item>
    <item name="Android:backgroundDimEnabled">false</item>
    <item name="Android:windowIsFloating">false</item>
</style>

ご覧のとおり、私はそこにいますAndroid:paddingTop = 20dpが基本的にあなたが必要とするものです。 Android:windowBackground = @ color/Black0Percentは、私のcolor.xmlで宣言された単なるカラーコードです。

res/values/color.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="Black0Percent">#00000000</color>
</resources>

そのカラーコードは、Dialogのデフォルトウィンドウの背景を透明度0%の色に置き換えるためのダミーとして機能します。

次にカスタムダイアログレイアウトres/layout/dialog.xmlを作成します。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:id="@+id/dialoglayout"
    Android:layout_width="match_parent"
    Android:background="@drawable/DesiredImageBackground"
    Android:layout_height="match_parent"
    Android:orientation="vertical" >

    <EditText
        Android:id="@+id/edittext1"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:singleLine="true"
        Android:textSize="18dp" />

    <Button
        Android:id="@+id/button1"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:text="Dummy Button"
        Android:textSize="18dp" />

</LinearLayout>

最後に、dialog.xmlを使用したカスタムビューを設定するダイアログがあります。

Dialog customDialog;
LayoutInflater inflater = (LayoutInflater) getLayoutInflater();
View customView = inflater.inflate(R.layout.dialog, null);
// Build the dialog
customDialog = new Dialog(this, R.style.CustomDialog);
customDialog.setContentView(customView);
customDialog.show();

結論:CustomDialogというstyles.xmlでダイアログのテーマを上書きしようとしました。ダイアログウィンドウのレイアウトを上書きし、パディングを設定して背景の不透明度を変更する機会を私に与えます。それは完璧な解決策ではないかもしれませんが、私はそれがあなたを助けることを願っています.. :)

23
icaneatclouds

あなたは(JUST)ウィンドウダイアログ幅のパーセンテージを使うことができます。

Holo Themeからこの例を見てください。

<style name="Theme.Holo.Dialog.NoActionBar.MinWidth">
    <item name="Android:windowMinWidthMajor">@Android:dimen/dialog_min_width_major</item>
    <item name="Android:windowMinWidthMinor">@Android:dimen/dialog_min_width_minor</item>
</style>

 <!-- The platform's desired minimum size for a dialog's width when it
     is along the major axis (that is the screen is landscape).  This may
     be either a fraction or a dimension. -->
<item type="dimen" name="dialog_min_width_major">65%</item>

このテーマを拡張し、「メジャー」と「マイナー」の値を65%の代わりに90%に変更するだけです。

よろしく。

19
Joao Gavazzi

実際の90%計算による解決策

@Override public void onStart() {
   Dialog dialog = getDialog();
   if (dialog != null) {
     dialog.getWindow()
        .setLayout((int) (getScreenWidth(getActivity()) * .9), ViewGroup.LayoutParams.MATCH_PARENT);
   }
}

ここでgetScreenWidth(Activity activity)は次のように定義されています(Utilsクラスに入れるのが最善です)。

public static int getScreenWidth(Activity activity) {
   Point size = new Point();
   activity.getWindowManager().getDefaultDisplay().getSize(size);
   return size.x;
}
15
Mehmet K

以下は私にとってはうまくいった:

    <style name="MyAlertDialogTheme" parent="Base.Theme.AppCompat.Light.Dialog.Alert">
        <item name="windowFixedWidthMajor">90%</item>
        <item name="windowFixedWidthMinor">90%</item>
    </style>

(注:windowMinWidthMajor/Minorは前の回答で示唆されたようにトリックをしませんでした。私のダイアログは内容に応じてサイズを変え続けました)

その後:

AlertDialog.Builder builder = new AlertDialog.Builder(getActivity(), R.style.MyAlertDialogTheme);
15
Deliriom

これを表示するには、ダイアログの高さと幅を設定する必要があります(dialog.show())。

だから、このようなことをする:

dialog.getWindow().setLayout(width, height);

//then

dialog.show()
7
shontauro

私が考えることができるはるかに最も簡単な方法では -

ダイアログが垂直のLinearLayoutで作られている場合は、単に「高さを埋める」ダミービューを追加してください。これは画面全体の高さになります。

例えば ​​-

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
          Android:orientation="vertical"
          Android:layout_width="match_parent"
          Android:layout_height="match_parent"
          Android:weightSum="1">

    <EditText
       Android:layout_width="match_parent"
       Android:layout_height="wrap_content"
       Android:id="@+id/editSearch" />

    <ListView
       Android:layout_width="match_parent"
       Android:layout_height="match_parent"
       Android:id="@+id/listView"/>


   <!-- this is a dummy view that will make sure the dialog is highest -->
   <View
       Android:layout_width="match_parent"
       Android:layout_height="match_parent"
       Android:layout_weight="1"/>

</LinearLayout>

LinearLayoutの属性のAndroid:weightSum="1"とダミーのViewの属性のAndroid:layout_weight="1"に注目してください。

6
Ron Tesler

ダイアログオブジェクトを初期化してコンテンツビューを設定した後。これをして楽しんでください。

(幅90%のためそれはツールバーの上になりますので(私は幅に90%、高さに70%を設定している場合)

DisplayMetrics displaymetrics = new DisplayMetrics();
getActivity().getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
int width = (int) ((int)displaymetrics.widthPixels * 0.9);
int height = (int) ((int)displaymetrics.heightPixels * 0.7);
d.getWindow().setLayout(width,height);
d.show();
4

これを表示するには、ダイアログの高さと幅を設定する必要があります(dialog.show())。

だから、このようなことをする:

dialog.getWindow().setLayout(width, height);

//then

dialog.show()

このコードを入手して、いくつか変更を加えました。

dialog.getWindow().setLayout((int)(MapGeaGtaxiActivity.this.getWindow().peekDecorView().getWidth()*0.9),(int) (MapGeaGtaxiActivity.this.getWindow().peekDecorView().getHeight()*0.9));

ただし、デバイスがその位置を変更すると、ダイアログサイズが変わる可能性があります。メトリクスが変わったときは、おそらく自分で対処する必要があります。 PD:peekDecorViewは、アクティビティ内のレイアウトが正しく初期化されていることを意味します。

DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
int height = metrics.heightPixels;
int wwidth = metrics.widthPixels;

画面サイズを取得するために

4
Juan Otero

デバイスの幅を取得します。

public static int getWidth(Context context) {
    DisplayMetrics displayMetrics = new DisplayMetrics();
    WindowManager windowmanager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
    windowmanager.getDefaultDisplay().getMetrics(displayMetrics);
    return displayMetrics.widthPixels;
}

それからダイアログをデバイスの90%にするためにそれを使います。

Dialog filterDialog = new Dialog(context, R.style.searchsdk_FilterDialog);

filterDialog.setContentView(R.layout.searchsdk_filter_popup);
initFilterDialog(filterDialog);
filterDialog.setCancelable(true);
filterDialog.getWindow().setLayout(((getWidth(context) / 100) * 90), LinearLayout.LayoutParams.MATCH_PARENT);
filterDialog.getWindow().setGravity(Gravity.END);
filterDialog.show();
4
Gopinath

私の答えはkomaのものに基づいていますが、それはonStartをオーバーライドする必要はなく、新しいフラグメントを作成するときにデフォルトでオーバーライドされるのはonCreateViewだけです。

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.your_fragment_layout, container);

    Rect displayRectangle = new Rect();
    Window window = getDialog().getWindow();
    window.getDecorView().getWindowVisibleDisplayFrame(displayRectangle);

    v.setMinimumWidth((int)(displayRectangle.width() * 0.9f));
    v.setMinimumHeight((int)(displayRectangle.height() * 0.9f));

    return v;
}

私はAndroid 5.0.1でそれをテストしました。

3
Kresimir Plese
    ...
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    Dialog d = builder.create(); //create Dialog
    d.show(); //first show

    DisplayMetrics metrics = new DisplayMetrics(); //get metrics of screen
    getActivity().getWindowManager().getDefaultDisplay().getMetrics(metrics);
    int height = (int) (metrics.heightPixels*0.9); //set height to 90% of total
    int width = (int) (metrics.widthPixels*0.9); //set width to 90% of total

    d.getWindow().setLayout(width, height); //set layout
2
Guihgo
public static WindowManager.LayoutParams setDialogLayoutParams(Activity activity, Dialog dialog)
    {
        try 
        {
            Display display = activity.getWindowManager().getDefaultDisplay();
            Point screenSize = new Point();
            display.getSize(screenSize);
            int width = screenSize.x;

            WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams();
            layoutParams.copyFrom(dialog.getWindow().getAttributes());
            layoutParams.width = (int) (width - (width * 0.07) ); 
            layoutParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
            return layoutParams;
        } 
        catch (Exception e)
        {
            e.printStackTrace();
            return null;
        }
    }
2
Krunal Shah

これが私のカスタムダイアログの幅のバリエーションです。

DisplayMetrics displaymetrics = new DisplayMetrics();
mActivity.getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
int width = (int) (displaymetrics.widthPixels * (ThemeHelper.isPortrait(mContext) ? 0.95 : 0.65));

WindowManager.LayoutParams params = getWindow().getAttributes();
params.width = width;
getWindow().setAttributes(params);

そのため、デバイスの向き(ThemeHelper.isPortrait(mContext))に応じて、ダイアログの幅は95%(縦向きモード)または65%(横向き)になります。作者が尋ねたことはもう少しですが、誰かに役立つかもしれません。

Dialogを継承したクラスを作成し、このコードをonCreate(Bundle savedInstanceState)メソッドに追加する必要があります。

ダイアログの高さのために、コードはこれに似ているべきです。

2
Clans

上記の答えの多くは良いですが、どれも私のために十分に機能しませんでした。だから私は@ nmrからの答えを組み合わせて、これを得ました。

final Dialog d = new Dialog(getActivity());
        //  d.getWindow().setBackgroundDrawable(R.color.action_bar_bg);
        d.requestWindowFeature(Window.FEATURE_NO_TITLE);
        d.setContentView(R.layout.dialog_box_shipment_detail);

        WindowManager wm = (WindowManager) getActivity().getSystemService(Context.WINDOW_SERVICE); // for activity use context instead of getActivity()
        Display display = wm.getDefaultDisplay(); // getting the screen size of device
        Point size = new Point();
        display.getSize(size);
        int width = size.x - 20;  // Set your heights
        int height = size.y - 80; // set your widths

        WindowManager.LayoutParams lp = new WindowManager.LayoutParams();
        lp.copyFrom(d.getWindow().getAttributes());

        lp.width = width;
        lp.height = height;

        d.getWindow().setAttributes(lp);
        d.show();
2
anand

カスタマイズ可能なダイアログを表示するには、CustomDialogなどのstyle @ style.xmlを使用する必要があります。

<style name="CustomDialog" parent="@Android:style/Theme.DeviceDefault.Light.Dialog">
        <item name="Android:windowIsTranslucent">true</item>
        <item name="Android:windowBackground">@color/colorWhite</item>
        <item name="Android:editTextColor">@color/colorBlack</item>
        <item name="Android:windowContentOverlay">@null</item>
        <item name="Android:windowNoTitle">true</item>
        <item name="Android:backgroundDimEnabled">true</item>
        <item name="Android:windowIsFloating">true</item>
        <item name="Android:windowSoftInputMode">stateUnspecified|adjustPan</item>
    </style>

activity.Javaでこのスタイルを使用する

Dialog dialog= new Dialog(Activity.this, R.style.CustomDialog);
        dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
        dialog.setContentView(R.layout.custom_dialog);

そしてcustom_dialog.xmlはあなたのレイアウトディレクトリの中にあるべきです

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:orientation="vertical"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:paddingLeft="10dp"
    Android:paddingRight="10dp">

    <TextView
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:text=""
        Android:textSize="20dp"
        Android:id="@+id/tittle_text_view"
        Android:textColor="@color/colorBlack"
        Android:layout_marginTop="20dp"
        Android:layout_marginLeft="10dp"/>

    <LinearLayout
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:orientation="horizontal"
        Android:layout_marginLeft="20dp"
        Android:layout_marginBottom="10dp"
        Android:layout_marginTop="20dp"
        Android:layout_marginRight="20dp">

        <EditText
            Android:id="@+id/edit_text_first"
            Android:layout_width="50dp"
            Android:layout_height="match_parent"
            Android:hint="0"
            Android:inputType="number" />

        <TextView
            Android:id="@+id/text_view_first"
            Android:layout_width="wrap_content"
            Android:layout_height="match_parent"
            Android:layout_marginLeft="5dp"
            Android:gravity="center"/>

        <EditText
            Android:id="@+id/edit_text_second"
            Android:layout_width="50dp"
            Android:layout_height="match_parent"
            Android:hint="0"
            Android:layout_marginLeft="5dp"
            Android:inputType="number" />

        <TextView
            Android:id="@+id/text_view_second"
            Android:layout_width="wrap_content"
            Android:layout_height="match_parent"
            Android:layout_marginLeft="5dp"
            Android:gravity="center"/>

    </LinearLayout>

</LinearLayout>
0
Nuwan Withanage

これが私のために働いた簡単な答えです(API 8とAPI 19でテスト済み)。

Dialog mDialog;
View   mDialogView;
...
// Get height
int height = mDialog.getWindow()
.getWindowManager().getDefaultDisplay()
.getHeight();

// Set your desired padding (here 90%)
int padding = height - (int)(height*0.9f);

// Apply it to the Dialog
mDialogView.setPadding(
// padding left
0,
// padding top (90%)
padding, 
// padding right
0, 
// padding bottom (90%)
padding);
0
Tanasis