我需要显示一个最小侵入性的非阻止通知, 与其显示的活动相关联(如Toast
)和可点击。任何人都知道这是否可行?不幸的是,Toast
通知(自定义或其他)似乎无法点击(即在其视图上设置OnClickListener
无效)。并且,如果我错了,请纠正我,所有替代方案(AlertDialg
,PopupWindow
,Crouton
)都会显示与其显示的活动相关的通知(即他们赢了'在活动结束时继续显示)。有什么建议吗?
答案 0 :(得分:4)
您可以使用development
,添加PopupWindow
并添加onClickListener
以在n次后自动取消它(就像handler
的行为一样)。像这样:
toast
xml layout:
public static void showToast(Activity a, String title, String message) {
// inflate your xml layout
LayoutInflater inflater = a.getLayoutInflater();
View layout = inflater.inflate(R.layout.custom_toast,
(ViewGroup) a.findViewById(R.id.toast_layout_root));
// set the custom display
((TextView) layout.findViewById(R.id.title)).setText(title);
((TextView) layout.findViewById(R.id.message)).setText(message);
// initialize your popupWindow and use your custom layout as the view
final PopupWindow pw = new PopupWindow(layout,
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT, true);
// set windowType to TYPE_TOAST (requires API 23 above)
// this will make popupWindow still appear even the activity was closed
pw.setWindowLayoutType(WindowManager.LayoutParams.TYPE_TOAST);
pw.showAtLocation(layout, Gravity.CENTER | Gravity.TOP, 0, 500);
// handle popupWindow click event
layout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// do anything when popupWindow was clicked
pw.dismiss(); // dismiss the window
}
});
// dismiss the popup window after 3sec
new Handler().postDelayed(new Runnable() {
public void run() {
pw.dismiss();
}
}, 3000);
}
答案 1 :(得分:1)
你是对的,Toast
对象无法与之交互,但是有很多库可以提供与吐司相同的外观和感觉,但具有一些交互性。我使用的是https://github.com/JohnPersano/SuperToasts
答案 2 :(得分:0)
我认为您所需要的实际上是PopupWindow
可以在这里看到" http://developer.android.com/reference/android/widget/PopupWindow.html"。
Toast有一个非常具体的任务,即通知用户,而不需要任何输入。因此,不要试图扩展Toast的目的,而是使用可由用户与之交互的PopupWindow。
答案 3 :(得分:0)
'对话框'活动类型可能是您最好的选择。
在清单中:
<activity android:name=".ToastLikeActivity"
android:theme="@android:style/Theme.Dialog"
android:label="@string/label"
></activity>
并使onCreate()中的活动超时:
class ToastLikeActivity extends Activity {
@Override
public void onCreate(Bundle state)
// auto-kill activity after X seconds <-------------------------
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
ToastLikeActivity.this.finish(); // kill after X seconds
}
}
}, VisibleTimeSecs*1000);
}
要显示对话框,请将其与其他任何活动一起启动:
Intent i = new Intent(this, ToastLikeActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(i);
它将显示并在X秒后自动消失。
这样的弹出不会与来电活动挂钩。实际上 - 它甚至不需要来电活动。您 即使从服务中也可以激活它(不好主意,但可能)。
您可以基本上实现您想要的任何类型的敏感(即接受用户点击)界面 ToastLikeActivity。特别是:你可以使其外部透明,给它一个对话式的外观。