web-dev-qa-db-ja.com

DialogFragmentの幅をFill_Parentにする方法

こんにちは、ダイアログを表示するために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>

enter image description here

前もって感謝します。

73
N Sharma

これは私がこの問題を処理するために見つけた解決策です:

@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));
127
savepopulation

画面サイズの90%を警告ダイアログで埋める方法 のElvisの回答を使用してみましたか?

次のとおりです。

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

更新:

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

LayoutParams.FILL_PARENTは非推奨です。代わりにLayoutParams.MATCH_PARENTを使用してください。

65
EpicPandaForce

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

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

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

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

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 
}
37
Kishan Vaghela

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

20
AA_PV
    <!-- 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" />

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

17
RJ M
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とカスタム属性を拡張できます。

13
Mehrdad Faraji

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

    @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;
}
10
goRGon

これをはっきりさせたい。どちらの方法も正しい、ただし、異なる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);
}
4
Khemraj

副作用なしで私のために働く別のソリューションは次のとおりでした:

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>
3
Josiel Novaes

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

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

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

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

1
emilpmp

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

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

0
Saeed-rz

レイアウトルートで、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
heeleeaz

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

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

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);
    }
0
Sharon Joshi