如何在FragmentDialog下显示SnackBar?

11

我有一个使用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具有适当的尺寸。问题是-如何在屏幕底部显示未受FragmentDialog(具有阴影的那个Activity视图)影响的SnackBar? 是否有办法禁用位于FragmentDialog后台的Activity上的特定视图的阴影?


你找到方法了吗? - Shirane85
@Shirane85 不是的... - KWA
2个回答

6
Material design文档中说:“Snackbars出现在屏幕上大多数元素的上方,它们的高度与浮动操作按钮相同。但是,它们的高度低于对话框、底部工作表和导航抽屉”。因此,我认为您应该考虑在DialogFragment内显示Snackbar,或者只需在其上方显示一个小对话框。
如果您想在对话框片段中显示Snackbar,可以这样做:
public void showSnackBar(final View parent, final String text) {
    Snackbar sb = Snackbar.make(parent, text, Snackbar.LENGTH_LONG);
    sb.show();
}
  • 注意: parent 是整个对话框的视图。你可以通过将片段的根视图设置为CoordinatorLayout并在该视图上显示Snackbar来改善它。

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。这将在父片段底部显示 Snackbar。
showSnackbar 方法应该像这样编写:

对于 Kotlin:

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


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

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