DialogFragmentの幅をFill_Parentにする方法


95

私はDialogFragmentダイアログを表示するために使用しているAndroidアプリケーションに取り組んでいますが、その幅は非常に小さいです。どのようにしてこの幅fill_parentをそれに合わせることができますか?

public class AddNoteDialogFragment extends DialogFragment {

    public AddNoteDialogFragment() {
        // Empty constructor required for DialogFragment
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        getDialog().setTitle(getString(R.string.app_name));
        View view = inflater.inflate(R.layout.fragment_add_note_dialog,
                container);

        return view;
    }


    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        Dialog dialog = super.onCreateDialog(savedInstanceState);

        // request a window without the title
        dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE);

        return dialog;
    }
}

fragment_add_note_dialog.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/white"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin" >

    <EditText
        android:id="@+id/addNoteEditText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="top"
        android:hint="@string/clock_enter_add_note"
        android:imeOptions="actionDone"
        android:inputType="textCapSentences|textMultiLine"
        android:lines="5" />

    <Button
        android:id="@+id/submit"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:background="@drawable/login_button"
        android:text="@string/submit_button"
        android:textColor="@android:color/white" />

</LinearLayout>


3
実際、RelativeLayoutを使用したまったく同じレイアウトは非常によく表示されます。私はそれについては説明しません...
Dan Chaltiel

回答:


154

これは私がこの問題を処理するために考え出したソリューションです:

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    Dialog dialog = super.onCreateDialog(savedInstanceState);    
    dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE);

    return dialog;
}

@Override
public void onStart() {
    super.onStart();

    Dialog dialog = getDialog();
    if (dialog != null) {
       dialog.getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
       dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
    }
}

編集:

展開されたonCrateViewビューを返す前に、フラグメントのメソッドで以下のコードを使用できます。

getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE);
getDialog().getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT));

3
ただ電話することができますdialog.getWindow().setBackgroundDrawable(null);
edwardaa

nullに設定されている場合、透明にはなりません... 4.0.4では黒のみ
Joao Polo

17
私にとってgetDialog.getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);は、DialogFragmentのonResume()メソッドを入れれば機能します。onCreateView()メソッドでは機能しませんでした。答えをからdialogに少し変更しましたgetDialog()
ロックリー

2
setLayoutonStart方法完璧に動作します。ありがとう。
wonsuc 2017年

78

警告ダイアログを画面サイズの90%にするための Elvisの答えを使用してみましたか?

次のとおりです。

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

更新:

上記のコードはonStart()、のメソッド内に追加する必要がありDialogFragmentます。


4
どのLayoutParamsをインポートしましたか?
ymerdrengene 2015年

1
@ymerdrengene実際に非常に良い質問です。お試しくださいWindowManager.LayoutParams.FILL_PARENT
EpicPandaForce 2015年

2
@ymerdrengeneは技術的にはですが、すべてこの値をから継承しているViewGroup.LayoutParamsため、どちらの方法でも完全に正常に機能します。
EpicPandaForce 2015年

9
このコードが機能するにonStartは、DialogFragment のメソッドに含まれている必要があります。
Eborbob

1
ここで述べたように、stackoverflow.comonCreateDialog
a / 15279400/1641882

52

これは私のために働いています

カスタムスタイルを作成します。

   <style name="DialogStyle" parent="Base.Theme.AppCompat.Dialog">
    <item name="android:windowMinWidthMajor">97%</item>
    <item name="android:windowMinWidthMinor">97%</item>
   </style>

適切な親を使用して他のダイアログと一致させることもできます。たとえばparent="ThemeOverlay.AppCompat.Dialog"

ダイアログでこのスタイルを使用します

public class MessageDialog extends DialogFragment {

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setStyle(DialogFragment.STYLE_NO_TITLE, R.style.DialogStyle);
}

// your code 
}

3
<item name = "android:windowBackground">​​ @ null </ item>による美しいソリューション。
Evgeny Sinitsky、2018

1
他のダイアログと一致するように適切な親を使用するように注意してください。私の場合、それはThemeOverlay.AppCompat.Dialog
quealegriamasalegre

29

私にとっては、RelativeLayoutによってonCreateViewでインフレートされたレイアウトのLinearLayout親を置き換えたときに機能しました。他のコード変更は必要ありません。


6
通常、スタックオーバーフローで最も人気のない答えが私の問題を解決します。ありがとう
busuu 2017

1
私はこの回答がとても気に入りましたが、相対レイアウトでのみ機能する理由はありませんか?
Prateek Gupta

19
    <!-- A blank view to force the layout to be full-width -->
    <View
        android:layout_width="wrap_content"
        android:layout_height="1dp"
        android:layout_gravity="fill_horizontal" />

私のダイアログレイアウトの上部にあるトリックでした。


3
これは私にとっては機能し、コードに何かを追加する必要がないのが好きですが、なぜ機能するのか疑問に思っています...
shela

信じられないほど、これは私のために働いた唯一のものです。カスタムスタイルはしませんでした。
Magnus W

19
public class FullWidthDialogFragment extends AppCompatDialogFragment {
    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setStyle(DialogFragment.STYLE_NORMAL, R.style.Theme_AppCompat_Light_Dialog_Alert);
    }
}

さらに柔軟性が必要な場合は、AppCompat_Dialog_Alertおよびカスタム属性を拡張できます


12

他のソリューションに基づいて、自分で作成しました。

<style name="AppTheme.Dialog.Custom" parent="Theme.AppCompat.Light.Dialog.Alert">
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowMinWidthMajor">100%</item>
    <item name="android:windowMinWidthMinor">100%</item>
</style>
abstract class BaseDialogFragment : DialogFragment() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setStyle(DialogFragment.STYLE_NO_TITLE, R.style.AppTheme_Dialog_Custom)
    }
}

11

私の場合、私は次のアプローチも使用しました:

    @Override
    public void onStart() {
        super.onStart();
        getDialog().getWindow().setLayout(LayoutParams.MATCH_PARENT, (int) getResources().getDimension(R.dimen.dialog_height));
    }
}

ただし、一部のLollipop +デバイス(Nexus 9など)では、ダイアログの左端と右端と画面の端との間に小さなギャップまだありました。

明白ではありませんでしたが、最後に、すべてのデバイスとプラットフォーム全体でウィンドウの全幅を表示するには、次のようにstyles.xml内でウィンドウの背景を指定する必要があることに気付きました

<style name="Dialog.NoTitle" parent="Theme.AppCompat.Dialog">
    <item name="android:windowNoTitle">true</item>
    <item name="android:padding">0dp</item>
    <item name="android:windowBackground">@color/window_bg</item>
</style>

そしてもちろん、このスタイルは、次のようなダイアログを作成するときに使用する必要があります。

    public static DialogFragment createNoTitleDlg() {
        DialogFragment frag = new Some_Dialog_Frag();
        frag.setStyle(DialogFragment.STYLE_NO_TITLE, R.style.Dialog_NoTitle);
        return frag;
}

2
これは受け入れられる答えになるはずです!時間を大幅に節約できました。ウィンドウの背景がうまくいきました。
カラン

10

これを明確にしたい。どちらの方法も正しいですが、DialogFragmentが異なります

使用する android.app.DialogFragment

@Override
public void onStart()
{
    super.onStart();
    Dialog dialog = getDialog();
    if (dialog != null)
    {
        int width = ViewGroup.LayoutParams.MATCH_PARENT;
        int height = ViewGroup.LayoutParams.MATCH_PARENT;
        dialog.getWindow().setLayout(width, height);
    }
}

使用する android.support.v4.app.DialogFragment

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setStyle(DialogFragment.STYLE_NORMAL, android.R.style.Theme_Black_NoTitleBar_Fullscreen);
}

基本的に私は全幅が必要で、これはうまくいきました。ありがとう!
sud007 2018年

4

副作用なしで私のために働く別の解決策は:

DialogFragmentを拡張するクラスで:

@Override
public void onCreate(final Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setStyle(DialogFragment.STYLE_NO_TITLE, R.style.DialogStyle);
}

あなたのスタイルで:

<style name="DialogStyle" parent="ThemeOverlay.AppCompat.Dialog.Alert"></style>

アラートのテーマを直接使用できますsetStyle()
ソニー、

3

これは完璧に機能します。

android:minWidth="300dp"

これにより、ダイアログのフラグメントに幅を与えることができます。


2

DialogFragment内のユーザーAlertDialog.Builder。onCreateDialogこのようなメソッドに追加します。そしてonCreateView何もしません。

public Dialog onCreateDialog(Bundle savedInstanceState)
{

    AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
    View view = LayoutInflater.from(getContext()).inflate(R.layout.gf_confirm_order_timeout_dialog, null);
    final Bundle args = getArguments();
    String message = args.getString(GfConstant.EXTRA_DATA);
    TextView txtMessage = (TextView) view.findViewById(R.id.txt_message);
    txtMessage.setText(message);

    view.findViewById(R.id.btn_confirm).setOnClickListener(new View.OnClickListener()
    {
        @Override
        public void onClick(View v)
        {
            if (mListener != null)
            {
                mListener.onDialogConfirmOK();
            }
        }
    });
    builder.setView(view);
    Dialog dialog = builder.create();
    dialog.setCanceledOnTouchOutside(false);
    dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE);
    return dialog;
}

2

style.xmlファイルにカスタムスタイルを作成します。このコードをコピーして、style.xmlファイルに貼り付けます。

<style name="CustomDialog" parent="@android:style/Theme.Holo.Light" >
    <item name="android:windowBackground">@null</item>
    <item name="android:windowIsFloating">true</item>
</style>

次に、DialogFragmentのcreateDialogメソッドで、コードによってダイアログオブジェクトを作成します。

 dialog = new Dialog(getActivity(), R.style.CustomDialog);

これは私のために働いています、これがあなたにも役立つことを願っています


次のコードをスタイルに追加して機能させる必要があります:<item name = "android:windowMinWidthMajor"> 100%</ item> <item name = "android:windowMinWidthMinor"> 100%</ item>
Arnout

2

これは私がこの問題に直面したときに私が解決した方法です。これを試して。

DialogFragmentのonActivityCreatedに、必要に応じてこのコードを追加します。

 @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        myview=inflater.inflate(R.layout.fragment_insurance_detail, container, false);
        intitviews();
        return myview;
    }
    @Override
    public void onActivityCreated(Bundle arg0) {
        super.onActivityCreated(arg0);
        getDialog().getWindow().getAttributes().windowAnimations = R.style.DialogAnimation;
        getDialog().getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
        getDialog().getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        getDialog().getWindow().setGravity(Gravity.CENTER);
    }

1

これをDialogFragmentのonCreateViewメソッドで使用します

    Display display = getActivity().getWindowManager().getDefaultDisplay();
    int width = display.getWidth();
    int px = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, **220**, getResources().getDisplayMetrics());
    getDialog().getWindow().setLayout(width,px);

220はダイアログフラグメントの高さです。必要に応じて変更してください


1

レイアウトルートで、android:minWidthを非常に大きな値に設定します。

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:minWidth="9999999dp">

   ...

</LinearLayout>

0

上記の複数の回答を試しました。彼らは私のために働いていませんでした。これは私の問題の解決策です:

DialogFragment()、以下のコードを追加します。

override fun onResume() {
    super.onResume()
    if (showsDialog) {
        val width = ViewGroup.LayoutParams.MATCH_PARENT
        val height = ViewGroup.LayoutParams.WRAP_CONTENT
        dialog?.window?.apply {
            setBackgroundDrawable(ColorDrawable(Color.WHITE))
            attributes.gravity = Gravity.BOTTOM
            setLayout(width, height)
        }
    }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.