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

Posted

技术标签:

【中文标题】无法使自定义 DialogFragment 在 Fragment 上透明【英文标题】:Can't make the custom DialogFragment transparent over the Fragment 【发布时间】:2011-12-24 03:19:03 【问题描述】:

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

对于自定义对话框,我有一个带有弯曲边缘的线性布局,无论我做什么,对话框的四面都有黑色边框(非常小)。我已尽一切努力使其透明并消失(因此所有对话框都只是线性布局 - 曲线框)

对于 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 个小时在这上面,我希望其他人可以帮忙...

【问题讨论】:

【参考方案1】:

试试

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

在您的DialogFragmentonCreateView

【讨论】:

您可能还想删除半透明的黑色背景(变暗),请查看此答案:***.com/a/33800422/2115904 同时删除所有边距。对话框扩展为全宽。 而且会引发异常:java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.Window android.app.Dialog.getWindow()' on a null object reference. 您也可以致电getDialog().getWindow().setBackgroundDrawableResource(android.R.color.transparent);。为了不调用异常,您应该通过dialogFragment.show(...); 方法从Activity 或Fragment 调用DialogFragment,而不是FragmentTransaction 的add 如果有人在寻找 Kotlin sn-p,这里是:dialog?.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))【参考方案2】:

试试这个 (How to I create a 100% custom 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();

【讨论】:

【参考方案3】:

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

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


【讨论】:

【参考方案4】:

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

【讨论】:

【参考方案5】:

你可以通过添加这个来实现 对话框片段BottomSheetDialogFragment

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;
   

【讨论】:

setBackgroundDrawableResourceclearFlags 为我工作(kotlin,android api v28)【参考方案6】:

对于完全透明的使用: 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

【讨论】:

【参考方案7】:
<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);
    

【讨论】:

【参考方案8】:

那些在onCreateDialog而不是onCreateView中使用AlertDialog builder的人可以像下面的代码一样分配主题。完整的主题集可以从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();
    

【讨论】:

谢谢,这是我正在寻找的。​​span> 【参考方案9】:

如果你愿意,试试这个:

public TransparentDialog()

    super();
    setStyle(STYLE_NO_FRAME, R.style.AppTheme);

【讨论】:

【参考方案10】:

每个接受的答案,在 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

【讨论】:

以上是关于无法使自定义 DialogFragment 在 Fragment 上透明的主要内容,如果未能解决你的问题,请参考以下文章

使用 SwiftUI 使自定义 UIView 方面比例适合/填充的麻烦

使自定义容器可迭代

使自定义viewcontroller覆盖导航栏

如何使自定义 UIButton 变暗

使自定义 Airflow 宏扩展其他宏

使自定义 QWidget 可选