安卓全屏碎片对话框问题

5
我创建了一个“全屏”DialogFragment,在其中加入了黑色透明背景。最终结果可见下面的截图:

enter image description here

这是我制作它的方法:

@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));
        }
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            // if >= LOLLIPOP, then I color the the statusbar
dialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
            dialog.getWindow().setStatusBarColor(SOME_COLOR_HERE);
        }

    }

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

这是我在setStyle()中设置的主题:

<style name="DialogFullScreen">
    <item name="android:windowIsFloating">false</item>
    <item name="android:windowContentOverlay">@null</item>
</style>

这是我为片段充气的布局:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="br.com.emotiondigital.sempreeditora.Fragments.LockedContentFragment"
android:id="@+id/popup_parent_layout">


<LinearLayout
    android:clickable="true"
    android:id="@+id/popup_black_bg"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#b9000000"/>

<RelativeLayout
    android:id="@+id/popup_main_layout"
    android:clickable="true"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerInParent="true"
    android:background="@android:color/white"
    android:elevation="10dp"
    android:layout_marginBottom="70dp"
    android:layout_marginTop="70dp"
    >


    <LinearLayout
        android:layout_alignTop="@+id/bg_popup"
        android:layout_alignBottom="@+id/bg_popup"
        android:layout_alignRight="@+id/bg_popup"
        android:layout_alignLeft="@+id/bg_popup"
        android:background="@color/bg_grey"
        android:layout_width="280dp"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="51dp"
            android:orientation="vertical"
            android:background="@android:color/white"
            android:elevation="2dp"
            >

            <TextView
                android:id="@+id/selectNewspaperText"
                android:layout_width="wrap_content"
                android:layout_height="50dp"
                android:gravity="center"
                android:text="@string/selecione_jornal"
                android:layout_marginLeft="15dp"
                android:textSize="20dp"
                android:textColor="@color/colorPrimary"
                />

            <LinearLayout
                android:orientation="vertical"
                android:id="@+id/topLine"
                android:layout_width="match_parent"
                android:layout_height="1dp"
                android:background="@color/colorPrimaryDark"/>

        </LinearLayout>

        <android.support.v7.widget.RecyclerView
            android:overScrollMode="ifContentScrolls"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/recyclerViewJornais"
            />

        <LinearLayout
            android:orientation="vertical"
            android:id="@+id/bottomLine"
            android:layout_width="match_parent"
            android:layout_height="1dp"
            android:background="@color/colorPrimaryDark"/>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:orientation="horizontal">

            <Button
                android:id="@+id/btnCancelar"
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:background="@android:color/white"
                android:textColor="@color/colorPrimary"
                android:text="@string/cancelar"/>

            <Button
                android:id="@+id/btnOk"
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:textColor="@android:color/white"
                android:background="@color/colorPrimary"
                android:text="@string/ok"/>

        </LinearLayout>




    </LinearLayout>



</RelativeLayout>

这些截图来自运行Android 5.1的Xperia Z3手机。在许多设备上都可以正常工作,甚至在一些低端的三星4.2设备上进行了测试。问题在于它在搭载Android 5.1的Nexus 4上无法正常工作。在Nexus 4上,似乎透明度不起作用,并且视图在背景上被复制多次。以下是一张屏幕截图:

enter image description here

这是Xperia Z3和Nexus 4之间的另一个比较:

enter image description here

enter image description here

Nexus 4上正在发生什么情况?任何帮助都将不胜感激!


这是一个奇怪的图形故障,但你为什么要首先使用“全屏”对话框呢?这似乎只是复制对话框的默认行为(对话框默认会使背景变暗)。 - Bryan
@Bryan 我喜欢控制视图的所有方面。例如,这样我就可以将背景作为视图来控制,并在运行时对其不透明度进行动画处理。我用它来创建一些有趣的效果。 - Felipe Ribeiro R. Magalhaes
2个回答

0

创建一个自定义布局的对话框,然后在onCreate方法或对话框方法的开头使用下面的代码。

Dialog dialog = new Dialog(context);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
        dialog.setContentView(R.layout.your_dialog_layout);
        dialog.getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);

这对我很有用。我使用了一种方法来创建全屏对话框。


0

在onCreate()中使用以下代码对我有用:

 setStyle(STYLE_NO_FRAME, android.R.style.Theme_Holo_Light);`

在onStart()中使用以下内容

dialog.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                    WindowManager.LayoutParams.FLAG_FULLSCREEN);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接