112

我需要在片段上创建一个对话框(占据整个屏幕)。该对话框需要是一个浮动对话框,它将定位在片段上方,片段在片段之外变暗。

对于自定义对话框,我有一个带有弯曲边缘的线性布局,无论我做什么,对话框的所有侧面都有黑色边框(非常小)。我已经尝试了一切让它透明并消失(这样所有的对话框都只是线性布局 - 曲线框)

对于 DialogFragment,这就是我的 onCreateView

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
    LinearLayout layout =(LinearLayout)inflater.inflate(R.layout.custom_dialog, null);
    LinearLayout item = (LinearLayout)layout.findViewById(R.id.display_item);
    populateItemData(item, inflater);
    return layout;
}

custom_dialog 只是一个具有 android:backgroung 设置为 #000000 的 LinearLayout

这是我自定义对话框的风格

<style name="CustomDialog" parent="android:style/Theme.Dialog">
    <item name="android:windowBackground">@null</item>
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowIsFloating">true</item>
    <item name="android:windowIsTranslucent">true</item> 
    <item name="android:alwaysDrawnWithCache">false</item>
    <item name="android:windowContentOverlay">@null</item>
</style>

我尝试了这种风格的各种组合(从我在网上看到的),我无法摆脱那个恼人的黑色边框,如果我将 LinearLayout 背景设置为除#000000...

我已经花了3-4个小时在这上面,我希望其他人能帮忙......

4

10 回答 10

333

尝试

getDialog().getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));

在你DialogFragmentonCreateView

于 2012-02-16T16:43:26.723 回答
24

试试这个(我如何创建一个 100% 自定义的 DialogFragment)这适用于对话框

    Dialog dialog = new Dialog(getActivity());

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

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

        // layout to display
    dialog.setContentView(R.layout.add_edit);

    // set color transpartent
    dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));

    dialog.show();
于 2013-02-12T10:37:41.490 回答
17

像这样设置你的主题对我有用

<style name="MyDialog" parent="Base.Theme.AppCompat.Light.Dialog">
    <item name="android:windowBackground">@android:color/transparent</item>
</style>

在你的对话框片段中像这样

public class Progress extends DialogFragment {


int style = DialogFragment.STYLE_NO_TITLE;
int theme = R.style.MyDialog;

public Progress() {
}

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setStyle(style, theme);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    return inflater.inflate(R.layout.progress, container, false);
}
}
于 2016-03-01T05:41:56.140 回答
12

onActivityCreated

getDialog().getWindow().getAttributes().alpha = 0.9f; // An alpha value to apply to this entire window. An alpha of 1.0 means fully opaque and 0.0 means fully transparent

对于DialogFragment透明

于 2014-11-27T07:01:18.563 回答
12

您可以通过在 Dialog FragmentBottomSheetDialogFragment中添加它来实现

onCreateDialog方法

@Override
   public Dialog onCreateDialog(Bundle savedInstanceState) {
       Dialog dialog = super.onCreateDialog(savedInstanceState);
       dialog.getWindow().setGravity(Gravity.BOTTOM);
       dialog.getWindow().setBackgroundDrawableResource(android.R.color.transparent);
       dialog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
       return dialog;
   }
于 2018-04-11T14:20:43.463 回答
8

对于完全透明的使用: setStyle(DialogFragment.STYLE_NO_FRAME, android.R.style.Theme_Translucent_NoTitleBar_Fullscreen);

对于自定义背景 - 在您的值文件夹 (values/style.xml) 中创建一个样式文件并使用它: setStyle(DialogFragment.STYLE_NO_FRAME, yourpackagename.R.style.YOURE_CUSTOM_STYLE);

在您的样式文件中覆盖属性: android:windowBackground@color/ DialogBackgroundBlackSemiTransparent

于 2015-06-15T13:25:19.617 回答
6
<style name="BaseDialogTheme" parent="Base.Theme.AppCompat.Light.Dialog">
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="colorControlNormal">@color/colorAccent</item>
    <item name="colorControlActivated">@color/colorAccent</item>

    <item name="android:windowFullscreen">true</item>
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowContentOverlay">@null</item>
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:colorBackgroundCacheHint">@null</item>
    <item name="android:colorBackground">@android:color/transparent</item>
    <item name="android:windowIsTranslucent">true</item>


    <item name="android:windowIsFloating">true</item>
    <item name="android:windowSoftInputMode">stateUnspecified|adjustPan</item>
    <item name="android:windowActionModeOverlay">false</item>
    <item name="android:windowCloseOnTouchOutside">true</item>
    <item name="android:backgroundDimAmount">.00</item>//this line is changed alpha from 1.0 to 0.0(full transparent) 

</style>



@Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setStyle(STYLE_NO_FRAME, R.style.BaseDialogTheme);
    }
于 2018-01-14T16:07:20.517 回答
4

那些使用 AlertDialog 构建器onCreateDialog而不是onCreateView可以像以下代码一样分配主题的人。完整的主题集可以从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();
    }
于 2013-10-16T06:37:47.443 回答
3

如果你愿意,试试这个:

public TransparentDialog()
{
    super();
    setStyle(STYLE_NO_FRAME, R.style.AppTheme);
}
于 2012-12-28T20:16:27.917 回答
2

根据接受的答案,在 Kotlin

override fun onCreateView(
    inflater: LayoutInflater,
    container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    var v = super.onCreateView(inflater, container, savedInstanceState)
    dialog?.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
    return v
}
于 2020-08-05T02:16:31.757 回答