java - 如何让 Activity 触摸直通(除了 snackbar )

标签 java android

因此,在我的任务器插件中,用户可以让任务器运行我的插件。当我的插件运行时,它会创建一个透明的 Activity ,显示一个 snackbar ,然后在完成后终止。唯一的问题是,当 Activity 显示时,用户无法与他们当前正在查看的屏幕进行交互。我知道应用程序链接气泡允许通过,同时显示 snackbar ,因此这是可能的。非常感谢所有帮助。

这是 SnackbarActivity.java:

public class SnackbarActivity extends AppCompatActivity {

    public String message = "Not Set";
    public String button = "Not Set";
    public String length = "Short";
    public String color = "#5F9691";
    public String command = "Button";
    public Intent messageIntent;
    public String result = "";

    @Override
    protected void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.invisible_activity);
        messageIntent = getIntent();
        message = messageIntent.getStringExtra("message");
        button = messageIntent.getStringExtra("button");
        length = messageIntent.getStringExtra("length");
        command = messageIntent.getStringExtra("command");
        switch (length) {
            case "Short":
                Snackbar.make(findViewById(R.id.toolbar), message, Snackbar.LENGTH_SHORT)
                        .setAction(button, new View.OnClickListener() {
                            @Override
                            public void onClick(View v) {
                                result = command;
                            }
                        }).setCallback(new Snackbar.Callback() {
                    @Override
                    public void onDismissed(Snackbar snackbar, int event) {
                        super.onDismissed(snackbar, event);
                        finish();
                        switch (event) {
                            case Snackbar.Callback.DISMISS_EVENT_TIMEOUT:
                                result = "Timeout";
                                break;
                            case Snackbar.Callback.DISMISS_EVENT_SWIPE:
                                result = "Swipe";
                                break;
                        }
                    }
                }).show();
                break;
            case "Long":
                Snackbar.make(findViewById(R.id.toolbar), message, Snackbar.LENGTH_LONG)
                        .setAction(button, new View.OnClickListener() {
                            @Override
                            public void onClick(View v) {
                                result = command;
                            }
                        }).setCallback(new Snackbar.Callback() {
                    @Override
                    public void onDismissed(Snackbar snackbar, int event) {
                        super.onDismissed(snackbar, event);
                        finish();
                        switch (event) {
                            case Snackbar.Callback.DISMISS_EVENT_TIMEOUT:
                                result = "Timeout";
                                break;
                            case Snackbar.Callback.DISMISS_EVENT_SWIPE:
                                result = "Swipe";
                                break;
                        }
                    }
                }).show();
                break;
            case "Forever":
                Snackbar.make(findViewById(R.id.toolbar), message, Snackbar.LENGTH_INDEFINITE)
                        .setAction(button, new View.OnClickListener() {
                            @Override
                            public void onClick(View v) {
                                result = command;
                            }
                        }).setCallback(new Snackbar.Callback() {
                    @Override
                    public void onDismissed(Snackbar snackbar, int event) {
                        super.onDismissed(snackbar, event);
                        finish();
                        switch (event) {
                            case Snackbar.Callback.DISMISS_EVENT_TIMEOUT:
                                result = "Timeout";
                                break;
                            case Snackbar.Callback.DISMISS_EVENT_SWIPE:
                                result = "Swipe";
                                break;
                        }
                    }
                }).show();
                break;
        }
    }

    @Override
    protected void onStop() {
        if ( TaskerPlugin.Setting.hostSupportsVariableReturn(messageIntent.getExtras())) {
            Bundle vars = new Bundle();
            vars.putString("%sb_command", result);
            TaskerPlugin.Setting.signalFinish(getApplicationContext(), messageIntent, TaskerPlugin.Setting.RESULT_CODE_OK, vars);
        }
        super.onStop();
    }
}

这是 styles.xml:

<style name="Theme.AppCompat.Translucent">
        <item name="android:windowNoTitle">true</item>
        <item name="android:windowBackground">@android:color/transparent</item>
        <item name="android:colorBackgroundCacheHint">@null</item>
        <item name="android:windowIsTranslucent">true</item>
        <item name="colorPrimaryDark">@android:color/transparent</item>
        <item name="android:windowAnimationStyle">@android:style/Animation</item>
        <item name="windowActionBar">false</item>
        <item name="windowNoTitle">true</item>
    </style>

最佳答案

即使您的应用程序未运行,您也可以使用 WindowManager 显示 snackbar ,并使背景屏幕可点击。

private static final int mLayoutParamFlags = WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH
        | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL;
        //| WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;

public void onCreate() {
    super.onCreate();

    LayoutInflater layoutInflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
    mSnackbarView = layoutInflater.inflate(R.layout.activity_snackbar, null);

    WindowManager.LayoutParams params = new WindowManager.LayoutParams(
            WindowManager.LayoutParams.WRAP_PARENT,
            WindowManager.LayoutParams.WRAP_PARENT,
            WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
            mLayoutParamFlags,
            PixelFormat.TRANSLUCENT);

    WindowManager windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
    windowManager.addView(mSnackbarView, params);
}

在上面的代码中,mSnackbar 是一个 View,activity_snackbar 是您想要在 WindowManager 中显示的 View 。

您可以使用服务显示WindowManager。创建一个类并使用 Service 扩展它。上面给出的是 Service 的 onCreate() 方法的代码。

编辑

以下是自定义 snackbar 的方法

将 mSnackbarView 初始化为 Snackbar 而不仅仅是 View

private Snackbar mSnackbarView;

使用 Snackbar 类转换 mSnackbarView

mSnackbarView = (Snackbar) layoutInflater.inflate(R.layout.activity_snackbar, null);

现在 mSnackbarView 是一个普通的 Snackbar View,您可以像自定义实际 Snackbar View 一样自定义它。

// Changing action button text color
View sbView = mSnackbarView.getView();
TextView textView = (TextView)     sbView.findViewById(android.support.design.R.id.snackbar_text);
textView.setTextColor(Color.YELLOW);

编辑2

为了使 Snackbar 和背景屏幕都可点击,我注释了 WindowManager WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE 的第三个布局参数。

并在mSnackbarView上添加onClickListener。

mSnackbarView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            System.out.println("Snackbar clicked");
        }
    });

现在, snackbar 和背景屏幕都可以点击。

编辑3

这就是启动服务的方式

Intent snackbarIntent = new Intent(context, snackbarService.class);
context.startService(snackbarIntent);

这就是停止服务的方法

Intent snackbarIntent = new Intent(context, snackbarService.class);
context.stopService(snackbarIntent);

关于java - 如何让 Activity 触摸直通(除了 snackbar ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33578026/

相关文章:

java - NetBeans 中的编译问题

Java MMO游戏数据传输

android - Android 中的 GLES20.glTexImage2d() 和 GLUtils.texImage2d() 有什么区别?

android - 工具栏重叠其他内容android

java - 我的 fragment 内的按钮无法识别

java - 无法访问java中的内部类问题

android - Android Studio Gradle sourceSets复制

android - 如何在 React Native 中实现类似 CoordinatorLayout 的功能?

Java - 如何使ObjectInputStream从文件中读取所有对象

android - firebase 和 googlemaps 会在 huawei-mate 30 中工作吗