Android中如何指定SnackBar在屏幕的位置及小问题解决

作者:码经笔记 时间:2023-08-07 07:56:19 

Android指定SnackBar在屏幕的位置

Snackbar 常以一个小的弹出框的形式,出现在手机屏幕下方或者桌面左下方,并且是在屏幕所有层的最上方。如果要指定它在屏幕出现的位置,可以把SnackBar放置在android.support.design.widget.CoordinatorLayout内。

在RelativeLayout里添加CoordinatorLayout如下:


<android.support.design.widget.CoordinatorLayout
android:layout_width="match_parent"
android:layout_height="200dp"
android:id="@+id/myCoordinatorLayout"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true">
</android.support.design.widget.CoordinatorLayout>

调用Snackbar.make()把CoordinatorLayout作为第一个参数,如下:


final View viewPos = findViewById(R.id.myCoordinatorLayout);
Snackbar.make(viewPos, R.string.snackbar_text, Snackbar.LENGTH_LONG)
      .setAction(R.string.snackbar_action_undo, showListener)
      .show();

可以通过改变CoordinatorLayout的位置来改变Snackbar的位置,如设置android:paddingBottom="16dp"。

Snackbar位置显示的一点小问题


compile 'com.android.support:design:23.4.0'

Android Studio 新建项目会默认有个展示Snackbar的方法,一直没用。前两天某微信公众号看到
http://www.jianshu.com/p/996dc15d21be 这个文章。写得很好,很全面,基本功能,样式定制都有写到。

其中有处写到自定义显示位置的,感觉很有必要,因为这个和Toast不一样,Toast会显示在软键盘上,而这个会被软键盘挡住。


ViewGroup.LayoutParams vl = v.getLayoutParams();
       CoordinatorLayout.LayoutParams cl = new CoordinatorLayout.LayoutParams(vl.width,vl.height);              
       cl.gravity = Gravity.CENTER;//设置显示位置居中
       v.setLayoutParams(cl);

但是当将位置设置为 


Gravity.TOP

设置偏移距离却无法生效


Rect frame = new Rect();
view.getWindowVisibleDisplayFrame(frame);
l.topMargin =frame.top;

原来是有的View的parent是继承的 FrameLayout这点得注意,需要


FrameLayout.LayoutParams l = (FrameLayout.LayoutParams) v.getLayoutParams();

当然自己写显示在上边很麻烦的,还要处理显示及隐藏动画

在Snackbar.Java的  animateViewIn() 和  animateViewout() 里都有规定

Github上有个很不错的  https://github.com/AndreiD/TSnackBar

是照着系统上的来做的,然后又增加不少小功能。先记一下,如果项目用到就把这个下载来改改

在  design_layout_snackbar.xml  里面有句


android:layout_gravity="bottom"

这个一定要记得改成  top

这样就能在上面显示了。

然后就是相应的动画  R.anim.design_snackbar_in  和  R.anim.design_snackbar_out

不过这两个都是在


Build.VERSION.SDK_INT <Build.VERSION_CODES.ICE_CREAM_SANDWICH//(14)

时调用的,所以可以删掉,不用改

刚好看到系统的final void showView()方法 public void onDismiss(View view)有一行


view.setVisibility(View.GONE);

但是在Tsnackbar里把这句删掉了,好吧看来得注意一下还有没别的大区别.

总结:如果长期显示在顶部可以用Github的项目,否则用design库就行

来源:https://majing.io/posts/10000009761166

标签:android,snackbar,位置
0
投稿

猜你喜欢

  • C# 静态构造函数使用总结

    2022-04-28 16:27:35
  • Android实现按钮拖拽还原功能

    2023-10-22 18:31:13
  • ServletWebServerApplicationContext创建Web容器Tomcat示例

    2023-10-12 12:28:33
  • Spring Cloud Gateway 服务网关的部署与使用详细讲解

    2022-04-09 01:20:00
  • Java字符串的intern方法有何奥妙之处

    2022-07-21 13:38:16
  • java实现置换密码加密解密

    2022-01-21 07:08:48
  • Android自定义ViewGroup实现选择面板

    2022-11-02 09:20:36
  • 在IntelliJ IDEA中多线程并发代码的调试方法详解

    2022-01-09 03:05:45
  • Android WebView 常见问题及处理方案

    2023-04-13 04:11:57
  • C#使用Process类调用外部程序分解

    2022-01-07 16:34:11
  • Android实现在一个activity中添加多个listview的方法

    2023-10-13 14:41:22
  • Java中对list map根据map某个key值进行排序的方法

    2023-09-04 17:10:03
  • Java项目开发中实现分页的三种方式总结

    2021-08-25 21:36:36
  • springboot 微信授权网页登录操作流程

    2022-12-12 08:26:19
  • Mybatis 级联删除的实现

    2022-05-08 21:18:09
  • Java String类简单用法实战示例【字符串输出、比较】

    2021-09-22 11:59:51
  • C# 中闭包(Closure)详解

    2022-12-29 20:36:10
  • Android NotificationListenerService 通知服务原理解析

    2022-03-29 05:34:29
  • Java面试synchronized偏向锁后hashcode存址

    2023-08-09 09:15:06
  • java高并发锁的3种实现示例代码

    2022-05-23 16:45:47
  • asp之家 软件编程 m.aspxhome.com