无法使自定义 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));
在您的DialogFragment
的onCreateView
中
【讨论】:
您可能还想删除半透明的黑色背景(变暗),请查看此答案:***.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;
【讨论】:
setBackgroundDrawableResource
和 clearFlags
为我工作(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 上透明的主要内容,如果未能解决你的问题,请参考以下文章