是否可以创建可点击的类似Toast的通知?

时间:2014-07-09 12:02:07

标签: android android-toast

我需要显示一个最小侵入性的非阻止通知, 与其显示的活动相关联(如Toast可点击。任何人都知道这是否可行?不幸的是,Toast通知(自定义或其他)似乎无法点击(即在其视图上设置OnClickListener无效)。并且,如果我错了,请纠正我,所有替代方案(AlertDialgPopupWindowCrouton)都会显示与其显示的活动相关的通知(即他们赢了'在活动结束时继续显示)。有什么建议吗?

4 个答案:

答案 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。特别是:你可以使其外部透明,给它一个对话式的外观。