因此,在我的任务器插件中,用户可以让任务器运行我的插件。当我的插件运行时,它会创建一个透明的 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/