无法使自定义的 DialogFragment 在 Fragment 上透明。

120

我需要在一个占据整个屏幕的Fragment上创建一个对话框。对话框需要是一个浮动对话框,会被定位在Fragment上方,而Fragment外部会被暗淡处理。

对于自定义对话框,我有一个具有曲线边缘的LinearLayout,但无论我做什么,对话框都有一个黑色边框(非常小)。我尝试了一切来使它透明并消失(这样对话框只包含线性布局-曲线框),但均未成功。

对于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只是一个LinearLayout,其android:background属性设置为#000000。

这是我的自定义Dialog样式。

<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个小时在这上面了,希望有人能够帮忙解决...

11个回答

353

试试

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

在你的DialogFragmentonCreateView方法中


7
您可能也希望移除半透明黑色背景(变暗),请参考此答案:https://dev59.com/AHrZa4cB1Zd3GeqPyybK#33800422 - Andrii Bas
7
将所有边距都删除,对话框扩展至全宽。 - Udayaditya Barua
2
这会导致一个异常:java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.Window android.app.Dialog.getWindow()' on a null object reference - CoolMind
2
另外,您也可以调用getDialog()。getWindow()。setBackgroundDrawableResource(android.R.color.transparent);。为了避免引发异常,您应该通过dialogFragment.show(...);方法从Activity或Fragment中调用DialogFragment,而不是使用FragmentTransaction的add方法。 - CoolMind
2
如果有人正在寻找Kotlin代码片段,这里是:dialog?.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) - Francis Laclé
显示剩余3条评论

24

尝试这个 (如何创建一个完全自定义的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();

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

14

您可以通过在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;
   }

1
setBackgroundDrawableResourceclearFlags 对我有用 (kotlin,android api v28)。 - Wesely

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 透明


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


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

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

谢谢,这就是我一直在寻找的。 - Milad Faridnia

3

如果您想尝试,请执行以下操作:

public TransparentDialog()
{
    super();
    setStyle(STYLE_NO_FRAME, R.style.AppTheme);
}

3

根据接受的答案,在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
}

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