DialogFragment 不浮动 activity window

DialogFragment does not float on the activity window

我创建了一个class extends DialogFragment class,我的代码如下,我的问题是对话框隐藏在状态栏(在系统中)和工具栏(在activity), 我参考这里的问题 DialogFragment not floating, acts embeded or as another fragment 添加 onCreate 功能并设置样式,但是对话框仍然只隐藏在工具栏下面,而不是像教程说的那样会浮动在 activity window.

public class PasswordDialog extends DialogFragment {
......
public static PasswordDialog newInstance(PdfFragment pdfFragment) {
    Log.i(sClassTag,"newInstance in PdfFragmentPasswordDialog");
    PdfFragmentPasswordDialog passwordDialog = new PdfFragmentPasswordDialog();
    passwordDialog.mPdfFragment = pdfFragment;
    setInteractionListener(pdfFragment);
    return passwordDialog;
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // Pick a style based on the num.
    int style = DialogFragment.STYLE_NORMAL, theme = 0;
    setStyle(style, theme);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    Log.i(sClassTag,"onCreateView in PdfFragmentPasswordDialog");
    // Inflate the layout to use as dialog or embedded fragment
    mView = inflater.inflate(R.layout.layout_password, container, false);
    addButtonListener();
    addEdittextListener();
    return mView;
}

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    Log.i(sClassTag,"onCreateView in onCreateDialog");
    Dialog dialog = super.onCreateDialog(savedInstanceState);
    dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
    return dialog;
}
void showPasswordDialog(boolean isFirstTime) {
....
 FragmentManager fragmentManager = getActivity().getFragmentManager();

 show(fragmentManager, "dialog");
 ...
}

布局文件是

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<ImageView
    android:layout_width="48dp"
    android:layout_height="48dp"
    android:src="@drawable/ic_img_passwordkey_48"
    android:id="@+id/key_icon"
    android:layout_gravity="center_horizontal"
    android:layout_marginTop="20dp"
    android:contentDescription="@string/password_input_hint_message"/>

<Space
    android:layout_width="match_parent"
    android:layout_height="16dp" />

<EditText
    android:imeOptions="flagNoExtractUi"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:inputType="textPassword"
    android:textColorHint="@color/password_dialogUI_hint_text_color"
    android:textColor="@color/password_dialogUI_text_color"
    android:textSize="12sp"
    android:hint="@string/password_input_hint_message"
    android:ems="10"
    android:id="@+id/dialogUI_edit_text"
    android:textCursorDrawable="@null"
    android:fontFamily="sans-serif"
    android:layout_marginStart="8dp"
    android:layout_marginEnd="8dp"
    android:textDirection="locale"/>

<TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="@string/password_error_warning_message"
    android:textColor="@color/password_dialogUI_warning_color"
    android:id="@+id/dialogUI_warning_text"
    android:textSize="12sp"
    android:visibility="invisible"
    android:fontFamily="sans-serif"
    android:paddingStart="4dp"
    android:paddingEnd="4dp"
    android:layout_marginStart="8dp"/>

<Space
    android:layout_width="match_parent"
    android:layout_height="8dp" />

<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="8dp">

<Button
    android:text="@string/password_ok_button"
    android:textColor="@drawable/layout_disable_text_color"
    android:minWidth="64dp"
    android:layout_width="wrap_content"
    android:layout_height="36dp"
    android:id="@+id/password_dialogUI_ok_button"
    android:layout_alignParentEnd="true"
    style="?android:attr/borderlessButtonStyle"
    android:background="@drawable/layout_password_button_background"
    android:layout_marginEnd="8dp"/>

<Button
    android:text="@string/password_cancel_button"
    android:textColor="@drawable/layout_disable_text_color"
    android:minWidth="64dp"
    android:layout_width="wrap_content"
    android:layout_height="36dp"
    android:id="@+id/password_dialogUI_cancel_button"
    style="?android:attr/borderlessButtonStyle"
    android:layout_toStartOf="@+id/password_dialogUI_ok_button"
    android:background="@drawable/layout_password_button_background"
    android:layout_marginEnd="8dp"/>

  1. 在Activity中,尝试使用你使用的fragment.show(),而不是调用你自己的show()。

    PasswordDialog fragment = PasswordDialog();
    fragment.show(getFragmentManager(), "TAG_HERE");
    


2. 将 android:minWidth 和 android:minHeight 添加到您的 xml。

<LinearLayout android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:minWidth="1000dp"  
android:minHeight="1000dp">

见下文: Full Screen DialogFragment in Android


已添加:

  1. 要调整 DialogFragment 的大小,您可以在 onResume 中设置值。

    public void onResume()
    {
        super.onResume();
        Window window = getDialog().getWindow();
    
        // You can define popup_width and popup_height
        int width = getResources().getDimensionPixelSize(R.dimen.popup_width);
        int height = getResources().getDimensionPixelSize(R.dimen.popup_height); 
    
        window.setLayout(width, height);
        window.setGravity(Gravity.CENTER); // Optional
    }  
    

见下文:
How to set DialogFragment's width and height?

自定义 DialogFragment 的步骤如下:

1.inflate 来自 xml 方法

的自定义视图
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState)
{

    getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE);
    getDialog().setCanceledOnTouchOutside(true);

    View view = inflater.inflate(R.layout.XXX,
            container, false);
    //TODO:findViewById, etc
    return view;
}

2.set 你的对话框的宽度和高度在 onResume() 中,记得在 onResume()/onStart() 中,似乎在其他方法中不起作用

public void onResume()
{
    super.onResume();
    Window window = getDialog().getWindow();
    window.setLayout(width, height);
    window.setGravity(Gravity.CENTER);
    //TODO:
}