10

我有一个活动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

4

2 回答 2

5

材料设计文档说“ Snackbars 出现在屏幕上大多数元素的上方,它们的高度与浮动操作按钮相同。但是,它们的高度低于对话框、底部工作表和导航抽屉”。从那里开始,我认为您应该考虑显示Snackbar内部DialogFragment或仅在其顶部显示一个小对话框。

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

public void showSnackBar(final View parent, final String text) {
    Snackbar sb = Snackbar.make(parent, text, Snackbar.LENGTH_LONG);
    sb.show();
}
  • 注意:parent是整个对话框的视图。您可以通过制作片段的根视图 aCoordinatorLayoutSnackbar在该视图上显示来改进它。
于 2016-08-09T13:09:55.020 回答
0

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

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


这并不是问题所要问的,但这将省略对话片段后面的所有阴影。
要在您的父片段而不是对话框片段中显示小吃栏,您可以将父片段引用传递给对话框片段构造函数并使用父视图实例化小吃栏。这将在父片段底部显示小吃栏。
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();
    }
}
于 2020-03-25T12:39:08.267 回答