如何在FragmentDialog下显示SnackBar?

时间:2015-12-11 07:52:11

标签: android android-fragments android-snackbar

我有FragmentDialog的活动。在此对话框的onResume中,我通过代码将其高度和重量设置为80%和90%:

WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams();
layoutParams.copyFrom(getDialog().getWindow().getAttributes());
layoutParams.width = (int)(screenWidth * 0.9);
layoutParams.height = (int)(screenHeight * 0.8);

getDialog().getWindow().setAttributes(layoutParams);

完美无缺,背景有阴影,前景FragmentDialog有适当的尺寸。问题是 - 如何在没有阴影的情况下在屏幕底部显示SnackBar不受FragmentDialog(具有阴影的活动视图)影响?有没有办法在FragmentDialog背景的活动中禁用特定视图的阴影?

2 个答案:

答案 0 :(得分:1)

材料设计文档说" Snackbars appear above most elements on screen, and they are equal in elevation to the floating action button. However, they are lower in elevation than dialogs, bottom sheets, and navigation drawers"。从那里开始,我认为您应该考虑在Snackbar内显示DialogFragment,或者只在其上方显示一个小对话框。

如果要在对话框片段中显示Snackbar,可以执行以下操作:

public void showSnackBar(final View parent, final String text) {
    Snackbar sb = Snackbar.make(parent, text, Snackbar.LENGTH_LONG);
    sb.show();
}
  • 注意:parent是整个对话框的视图。您可以通过将片段的根视图设为CoordinatorLayout并在该视图上显示Snackbar来改进它。

答案 1 :(得分:0)

已经很晚了,但是我认为有一种解决方案可能对其他人有用。
要禁用对话框片段阴影(实际上称为DIM),请在对话框片段onResume方法中添加以下代码。
对于Kotlin:

override fun onResume() {
        super.onResume()
        dialog?.window!!.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND)  
    }


对于Java:

@Override
    public void onResume() {
        super.onResume();
        if(getActivity()!=null)
        getActivity().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
    }


到这里,这并不是在问什么问题,但这会忽略对话框片段后面的所有阴影。
要在您的父片段而不是对话框片段中显示Snackbar,可以将父片段引用传递给对话框片段构造函数,并使用父视图实例化Snackbar。这将在父片段的底部显示小吃栏。
showSnackbar方法如下:

对于Kotlin:

private fun showSnackbar(messege: String) = 
        Snackbar.make(parent.view!!, messege, Snackbar.LENGTH_SHORT).show()


对于Java:

private void showSnackBar(String messege) {
    if (parent.getView() != null)
        Snackbar.make(parent.getView(), messege, Snackbar.LENGTH_SHORT).show();
}


对话框片段的完整代码如下:

对于Kotlin:

class MyDialogFramgent(parent: Fragment) : DialogFragment() {
    // class code ...

    override fun onResume() {
        super.onResume()
        dialog?.window!!.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND)
    }

    private fun showSnackbar(messege: String) =
            Snackbar.make(parent.view!!, messege, Snackbar.LENGTH_SHORT).show()
}


对于Java:

public class MyDialogFragment extends DialogFragment {

    private Fragment parent;

    public MyDialogFragment(Fragment parent) {
        this.parent = parent;
    }

    @Override
    public void onResume() {
        super.onResume();
        if (getActivity() != null)
            getActivity().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
    }

    private void showSnackBar(String messege) {
        if (parent.getView() != null)
            Snackbar.make(parent.getView(), messege, Snackbar.LENGTH_SHORT).show();
    }
}