Google Inbox如何显示覆盖键盘的小吃店? [英] How does Google Inbox show a snackbar covering the keyboard?

查看:121
本文介绍了Google Inbox如何显示覆盖键盘的小吃店?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

Google收件箱如何在(覆盖,分层)键盘上方显示小吃店?这不是默认行为,我已经用基本的协调器布局,键盘打开和小吃栏进行了测试:默认行为是在键盘后面 显示小吃栏.这个问题有很多答案:如何在键盘上上方显示小吃栏" ,但是我还没有找到如何重现Google自己的Inbox应用的小吃栏的方法.行为.

How does Google Inbox show the snackbar over (covering, layering) the keyboard? This is not the default behaviour, which I've tested with a basic coordinator layout, the keyboard open and a snackbar: the default behaviour is showing the snackbar behind the keyboard. There are many answers on SO to the question: 'How do I show the snackbar above the keyboard', but I haven't found how to reproduce Google's own Inbox app's snackbar behaviour.

您能告诉我如何实现吗?

Can you show me how to achieve this?

推荐答案

收件箱既不使用标准的Snackbar,也不使用覆盖窗口,而是使用自定义视图.我对APK进行了反编译,以验证它们如何实现此效果,并尝试重现一个最小的示例.

Inbox doesn't use the standard Snackbar nor uses an overlay window, it uses a custom view. I decompiled the APK to verify how they achieve this effect and I tried to reproduce a minimal example.

首先创建一个新布局 custom_snackbar.xml :

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="#323232"
    android:paddingLeft="10dp"
    android:paddingRight="10dp">

    <TextView
        android:id="@+id/text"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:gravity="center_vertical"
        android:text="Marked done"
        android:textColor="@android:color/white"/>

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:background="@android:color/transparent"
        android:gravity="center_vertical"
        android:minWidth="48dp"
        android:text="undo"
        android:textAllCaps="true"
        android:textColor="#a1c2fa"/>

</LinearLayout>

然后创建以下方法以显示和关闭自定义Snackbar:

Then create these methods to show and dismiss the custom Snackbar:

private View customSnackbar;

private void showCustomSnackbar(final Context context) {
    customSnackbar = LayoutInflater.from(context).inflate(R.layout.custom_snackbar, null, false);
    customSnackbar.findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            //action implementation
        }
    });

    WindowManager.LayoutParams lp = new WindowManager.LayoutParams();
    lp.height = WindowManager.LayoutParams.WRAP_CONTENT;
    lp.width = WindowManager.LayoutParams.MATCH_PARENT;
    lp.format = PixelFormat.TRANSLUCENT;
    lp.gravity = Gravity.BOTTOM;
    lp.flags = WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH |
            WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |
            WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL;
    customSnackbar.setLayoutParams(lp);

    WindowManager windowManager = (WindowManager) context.getSystemService(WINDOW_SERVICE);

    if (windowManager != null) {
        windowManager.addView(customSnackbar, customSnackbar.getLayoutParams());

        Point m = new Point();
        windowManager.getDefaultDisplay().getSize(m);
        int childMeasureSpecWidth = ViewGroup.getChildMeasureSpec(View.MeasureSpec.makeMeasureSpec(m.x, View.MeasureSpec.EXACTLY), 0, lp.width);
        int childMeasureSpecHeight = ViewGroup.getChildMeasureSpec(View.MeasureSpec.makeMeasureSpec(m.y, View.MeasureSpec.EXACTLY), 0, lp.height);
        customSnackbar.measure(childMeasureSpecWidth, childMeasureSpecHeight);

        customSnackbar.setTranslationY(customSnackbar.getMeasuredHeight());
        customSnackbar.animate()
                .setDuration(300)
                .translationX(0.0f)
                .translationY(0.0f);
    }
}

private void dismissCustomSnackbar(final Context context) {
    customSnackbar.animate()
            .setDuration(300)
            .translationX(0.0f)
            .translationY(customSnackbar.getMeasuredHeight())
            .withEndAction(new Runnable() {
                @Override
                public void run() {
                    WindowManager windowManager = (WindowManager) context.getSystemService(WINDOW_SERVICE);
                    if (windowManager != null) {
                        windowManager.removeView(customSnackbar);
                    }
                }
            });
}

这是获得的结果:

这篇关于Google Inbox如何显示覆盖键盘的小吃店?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆