如何更改DialogFragment周围的背景颜色?

时间:2013-02-21 16:24:41

标签: android background android-dialogfragment android-styles

我正在构建自定义DialogFragment。对话框布局设置为my_dialog.xml,但如何修改对话框周围的颜色(透明灰色)?

enter image description here

my_dialog.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center" >

    <TextView
        android:id="@+id/hello"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:background="@android:color/holo_orange_light"
        android:gravity="center"
        android:text="hello" />

</RelativeLayout>

MyDialogFragment.java

public class MyDialogFragment extends DialogFragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.my_dialog, container);

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

        return view;
    }
}

8 个答案:

答案 0 :(得分:46)

我必须在对话框样式中将android:windowIsFloating设置为false并将android:windowBackground设置为我的自定义颜色:

styles.xml

<resources xmlns:android="http://schemas.android.com/apk/res/android">

    <style name="MyDialog" parent="@android:style/Theme.Dialog">
        <item name="android:windowFrame">@null</item>
        <item name="android:windowBackground">@color/orange_transparent</item>
        <item name="android:windowIsFloating">false</item>
        <item name="android:windowContentOverlay">@null</item>
        <item name="android:windowTitleStyle">@null</item>
        <item name="android:colorBackgroundCacheHint">@null</item>
        <item name="android:windowAnimationStyle">@android:style/Animation.Dialog</item>
        <item name="android:windowSoftInputMode">stateUnspecified|adjustPan</item>
        <item name="android:gravity">center</item>
    </style>

</resources>

MyDialogFragment

public class MyDialogFragment extends DialogFragment {

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

答案 1 :(得分:26)

我想要DialogFragment的透明背景,并且在代码中,这样可以正常工作:

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

    Window window = getDialog().getWindow();
    window.setBackgroundDrawableResource(android.R.color.transparent);
}

当然,您可以使用DrawablesetBackgroundDrawable()指定任何颜色或setBackgroundDrawableResource()

这至少在 onStart() 中有效,但在onCreate()中却无效,而且不一定在onCreateView()it seems中。

也就是说,在大多数情况下,按照以下方式执行此操作in XML, using styles可能更为清晰:

<style name="MyDialogStyle" parent="@android:style/Theme.Holo.Light.Dialog">
    <item name="android:windowBackground">@android:color/transparent</item>
</style>

答案 2 :(得分:15)

要获得完全透明的对话框,您可以在onCreateView中设置以下

  • setBackgroundDrawableColor.TRANSPARENT
  • setDimAmount0

请参阅此处的代码示例:

public class TextEditor extends DialogFragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_text_editor, container);

        // make dialog itself transparent
        getDialog().getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));

        // remove background dim 
        getDialog().getWindow().setDimAmount(0);

        //[add more custom code here...]

        return view;
    }
}

答案 3 :(得分:14)

我发现我只需要这样做:

<style name="MyDialog" parent="@android:style/Theme.Dialog">
    <!--  other attributes  -->
    <item name="android:backgroundDimEnabled">false</item>
</style>

答案 4 :(得分:2)

覆盖onCreate并设置样式应该有效。

@Override
public void onCreate(Bundle savedInstance){
    super.onCreate(savedInstance);
    setStyle(DialogFragment.STYLE_NO_FRAME, android.R.style.Theme_Translucent);
}

答案 5 :(得分:2)

那些在“onCreateDialog”而不是“onCreateView”中使用AlertDialog构建器的人可以分配以下代码之类的主题。完整的主题集可以从R.style找到。不要忘记他们中的一些最近支持,并且在旧的设备电话上不可用。

@Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {

        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity(), android.R.style.Theme_Translucent);
        View view = getActivity().getLayoutInflater().inflate(R.layout.dialog_album, null);
        builder.setView(view);

        return builder.create();
    }

答案 6 :(得分:1)

7月的答案对我来说几乎是好的。但是在使用AlertDialog.Builder时它似乎不起作用。

我必须在这里设置风格:

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {

    // Use the Builder class for convenient dialog construction
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity(), R.style.MyDialog );

答案 7 :(得分:0)

更改Background上的文字XML 我刚刚编辑了你的代码,用你的代码替换它

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center" >

<TextView
    android:id="@+id/hello"
    android:layout_width="100dp"
    android:layout_height="100dp"
    android:gravity="center"
    android:text="hello" />

因为你的TextView高度和宽度为100dp。并为其设置一个背景,以填充整个对话框。因为你的主要布局是wrap_content。 如果有帮助,请接受答案。
修改:更改background 只需添加到您的布局或textview android:background="#232323"您可以将这些数字更改为您喜欢的任何颜色。或者您可以设置drawable android:background="@drawable/yourpicturename"

中的背景