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

Tol*_*a E 93 android android-layout android-fragments android-dialog android-dialogfragment

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

对于自定义对话框,我有一个具有弯曲边缘的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;
}
Run Code Online (Sandbox Code Playgroud)

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

这是我自定义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>
Run Code Online (Sandbox Code Playgroud)

我尝试了这种风格的各种组合(从我在网上看到的)并且我无法摆脱那种恼人的黑色边界,如果我将LinearLayout背景设置为除了以外的任何其他颜色,我可以将其绘制为白色或任何其他颜色#000000 ...

我已经花了3-4个小时,我希望其他人可以帮忙...

C.d*_*.d. 279

尝试

getDialog().getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
Run Code Online (Sandbox Code Playgroud)

在你DialogFragmentonCreateView

  • 您可能还想删除半透明黑色背景(调光),请查看此答案:http://stackoverflow.com/a/33800422/2115904 (5认同)
  • 同样删除所有边距.对话框扩展到全宽. (3认同)
  • 它会导致异常:`java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.Window android.app.Dialog.getWindow()' on a null object reference`。 (2认同)
  • 您也可以调用 `getDialog().getWindow().setBackgroundDrawableResource(android.R.color.transparent);` 来代替。为了不引发异常,您应该通过“dialogFragment.show(...);”方法从 Activity 或 Fragment 调用“DialogFragment”,而不是 FragmentTransaction 的“add”。 (2认同)
  • 如果有人正在寻找 Kotlin 代码片段,这里是:`dialog?.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))`。 (2认同)

小智 23

试试这个(如何创建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();
Run Code Online (Sandbox Code Playgroud)


San*_*yun 11

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
Run Code Online (Sandbox Code Playgroud)

对于DialogFragment透明


Ame*_*een 11

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

<style name="MyDialog" parent="Base.Theme.AppCompat.Light.Dialog">
    <item name="android:windowBackground">@android:color/transparent</item>
</style>
Run Code Online (Sandbox Code Playgroud)

并在您的对话框片段中设置如下

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);
}
}
Run Code Online (Sandbox Code Playgroud)


use*_*413 7

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

在你的样式文件中覆盖atribute: android:windowBackground@ color/DialogBackgroundBlackSemiTransparent


Nic*_*hek 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);
    }
Run Code Online (Sandbox Code Playgroud)


Nan*_*pal 5

您可以通过在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;
   }
Run Code Online (Sandbox Code Playgroud)