不使用CoordinatorLayout显示Snackbar

11

我已经使用CoordinatorLayout显示了Snackbar,但在某些布局中我没有使用CoordinatorLayout布局,并且我想显示Snackbar,但遇到了问题。

我尝试了以下方法来实现不使用CoordinatorLayout的Snackbar,但它会显示以下结果。

Snackbar.make(getActivity().getWindow().getDecorView().getRootView(), "Testing Snackbar", Snackbar.LENGTH_LONG).show();

在此输入图片描述

在 Android 8.0 Oreo 上进行测试

有没有办法在没有 CoordinatorLayout 的情况下实现 Snackbar?

提前致谢。

代码

public class FirstFragment extends Fragment {

RelativeLayout rootView;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_first, container, false);

        Log.e("onCreateView", "onCreateView");

        rootView = (RelativeLayout)view.findViewById(R.id.rootView);
        setSnackBar(rootView, "Testing with answered");
        return view;
    }

public static void setSnackBar(View coordinatorLayout, String snackTitle) {
        Snackbar snackbar = Snackbar.make(coordinatorLayout, snackTitle, Snackbar.LENGTH_SHORT);
        snackbar.show();
        View view = snackbar.getView();
        TextView txtv = (TextView) view.findViewById(android.support.design.R.id.snackbar_text);
        txtv.setGravity(Gravity.CENTER_HORIZONTAL);
    }
}
4个回答

25
尝试这段简单的代码...使用 Android 框架自身的虚拟视图 Snackbar.make(findViewById(android.R.id.content),"在这里输入你的文本",Snackbar.LENGTH_SHORT).show();

1
我试图在适配器类中显示一个 snackbar,这很完美地工作了,因为我传递给适配器的只有 Context。 - Manny265
1
完美的点子,谢谢。 - Harvi Sirja
据我所知,它基本上可以与任何视图一起使用,因此在这里,Snackbar 给出了来自 Android 框架本身的视图,可以正常工作。 - Pemba Tamang
1
你应该得到一枚奖章! - Kishan Solanki
这导致应用程序崩溃。android.view.InflateException:在com.webrich.ssatrclite:layout/design_layout_snackbar_include中的二进制XML文件第39行:在com.webrich.ssatrclite:layout/design_layout_snackbar_include中的二进制XML文件第39行:膨胀类错误<unknown> 原因是:android.view.InflateException:在com.webrich.ssatrclite:layout/design_layout_snackbar_include中的二进制XML文件第39行:膨胀类错误<unknown> - nirav dinmali

18
public static void setSnackBar(View root, String snackTitle) {
  Snackbar snackbar = Snackbar.make(root, snackTitle, Snackbar.LENGTH_SHORT);
  snackbar.show();
  View view = snackbar.getView();
  TextView txtv = (TextView) view.findViewById(android.support.design.R.id.snackbar_text);
  txtv.setGravity(Gravity.CENTER_HORIZONTAL);
}

只需调用上述方法并传递任何父布局,如LinearLayoutRelativeLayoutScrollView,例如:

setSnackBar(layout,"This is your SnackBar");  //here "layout" is your parentView in a layout

不要忘记使用findViewById()方法来查找您的视图。


首先感谢您的回答。 我已经尝试过了,但是会出现以下错误: 在给定的视图中找不到合适的父级。请提供一个有效的视图。 - Nilesh Panchal
@NileshPanchal 在我的情况下,它适用于任何视图,我只是将这段代码放在我的 Utils 类中并调用了这个方法,它就像魔法般地工作。 - Shashwat Gupta
@NileshPanchal,你是否已经提供并找到了具有ID的父视图? - Shashwat Gupta
你好@Shashwat Gupta,它在Activity中运行良好,但在Fragment中不起作用,我想要在Fragment中实现。 没关系,我已经接受了你的答案,也许对其他人有帮助,感谢你的回答。 - Nilesh Panchal
1
我还没有在片段中尝试过它,如果你想要在片段中使用它,只需将此方法放入活动中,并从片段中调用它。 - Shashwat Gupta
从Fragment调用Activity方法运行良好。再次感谢,兄弟。 - Nilesh Panchal

2
如其他人所建议,最好的解决方法是通过之前提到的方法完成。我想添加一个选项来显示SnackBar并附带一个按钮以关闭SnackBar。这在你希望给用户阅读你的消息并确认你的应用程序已经让用户阅读了你的消息时非常有用。
   public void setSnackBar(View root, String textToDisplay) {
    Snackbar snackbar = Snackbar.make(root, textToDisplay, Snackbar.LENGTH_INDEFINITE);
    snackbar.setAction("OK", new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            snackbar.dismiss();
            //your other action after user hit the "OK" button
        }
    });
    snackbar.show();

1
使用此 CoordinatorLayoutview 实例:
View view = findViewById(android.R.id.content);
Snackbar snackbar = Snackbar.make(view, "your text", Snackbar.LENGTH_SHORT);
snackbar.show();

与此回答https://dev59.com/4lYO5IYBdhLWcg3wI-Vw#48192738 有何不同? - Arnold Brown

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