android 表示されない アラートダイアログを画面サイズの90%にする方法は?




android ダイアログフラグメント (20)

以下は私のためにうまくいった:

    <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);

カスタムアラートダイアログを作成して表示することはできますが、 android:layout_width/height="fill_parent"をダイアログXMLにandroid:layout_width/height="fill_parent"と、内容と同じ大きさに過ぎません。

私が望むのは、おそらく20ピクセルのパディングを除いて、画面全体を塗りつぶすダイアログです。 ダイアログの一部であるイメージは、自動的にfill_parentを使ってダイアログサイズ全体に拡大されます。


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

そう、このような何かをしなさい:

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

//then

dialog.show()

カスタマイズ可能なダイアログを表示するには、CustomDialogなどのスタイル@ 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>

さて、これを表示する前にダイアログの高さと幅を設定する必要があります(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;

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


thisディスカッショングループポストのAndroidプラットフォーム開発者Dianne Hackbornによると、Dialogsはウィンドウのトップレベルのレイアウト幅と高さを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に従って行うことができますhttp://developer.android.com/guide/topics/ui/themes.html#SelectATheme


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

ダイアログが垂直な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:layout_weight="1" 、ダミーのView属性ではandroid:layout_weight="1"


デバイスの幅を取得する:

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();

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


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;
        }
    }

ダイアログオブジェクトを初期化した後、コンテンツビューを設定します。 これを行い、楽しむ。

(90%が幅に、70%が高さに設定されている場合は幅90%がツールバーに表示されるため)

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();

dialog.getWindow().setLayout(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);

dialog.getWindow().setLayout(WindowManager.LayoutParams.MATCH_PARENT,WindowManager.LayoutParams.WRAP_CONTENT);

さらに簡単にしても、

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

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

ここで私のために働いた短い答えがあります(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);

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

まずこれを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>

あなたが見ることができるように私はそこにアンドロイドを持っています: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>

そのColorコードは、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でダイアログのテーマをオーバーライドしようとしました。 これはDialogウィンドウレイアウトをオーバーライドし、パディングを設定して背景の不透明度を変更する機会を与えます。 それは完璧な解決策ではないかもしれませんが、私はそれがあなたを助けることを願って..


ダイアログウィンドウで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);

一般に、幅の調整だけで十分です。


上の回答の多くは良いですが、私のために完全に働いたものはありません。 だから私は@ 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();

android:minWidthをカスタムビューxmlにandroid: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>

私の答えはkoma'sに基づいていますが、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でテストしました。


実際の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;
}




dialog