Могу ли я добавить Click Listener в пользовательское всплывающее уведомление

Я создаю собственный тост для своего приложения. Мне нужно добавить OnClickListener на кнопку, которую я добавил в Toast. Все идет хорошо, я вижу кнопку, но она не реагирует на OnClick. Есть идеи.

Пример кода:

Button button = new Button(getApplicationContext());
            button.setText("Click Me");
            button.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    ProgressDialog.show(getApplicationContext(), "Hello", "nothing");

                }
            });
        button.setLayoutParams(new     ViewGroup.LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT));
        Toast toast = new Toast(getApplicationContext());
        toast.setGravity(Gravity.BOTTOM, 0, 0);
        toast.setMargin(0,-80);
        toast.setDuration(Toast.LENGTH_LONG);
        toast.setView(button);  
        toast.show();

Кроме того, я попытался добавить onTouchListener к такой кнопке.

 button.setOnTouchListener(new OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        ProgressDialog.show(getApplicationContext(), "Hello", "nothing");
        return false;
    }
});

Но это тоже не работает.


person Adnan    schedule 20.02.2014    source источник
comment
вместо тоста используйте диалог   -  person Raghunandan    schedule 20.02.2014
comment
Представления не доступны для кликов внутри Toast, поэтому используйте AlertDialog или всплывающее окно.   -  person ρяσѕρєя K    schedule 20.02.2014
comment
Использовать кнопку на тосте — плохая идея. Используйте диалог   -  person JesusS    schedule 20.02.2014


Ответы (2)


Вы не должны включать Button в Toast. Просто покажите кнопку, а затем скройте ее через некоторое время. Вы можете сделать это, добавив RelativeLayout поверх существующего макета. Что-то вроде этого должно работать:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
    <include layout="@layout/main" /><!-- References your existing layout file -->
    <Button 
        android:id="@+id/toast_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_alignParentBottom="true"
        android:visibility="gone"
        android:text="@string/click_me"
        android:onClick="showDialog" /><!-- Should reference a String resource "click me"-->
</RelativeLayout>

Теперь создайте эффект Toast, добавьте следующий метод к вашему Activity:

public void showDialog(View v) {
    if (v.getId() == R.id.toast_button) {
        ProgressDialog.show(this, "Hello", "nothing");
    }
}

Затем в onCreate покажите кнопку нравится Toast:

final Button b = (Button) findViewById(R.id.toast_button);
//optionally add some animations for fading in
b.setVisibility(View.VISIBLE);
Timer t = new Timer();
t.schedule(new TimerTask() {
    @Override
    public void run() {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                //optionally add some animations for fading out
                b.setVisibility(View.GONE);
            }
        });
    }
}, 1000);
person Phil    schedule 20.02.2014
comment
Это не тот случай, Фил. Кнопка не получает событие нажатия. - person Adnan; 20.02.2014
comment
@ Аднан, посмотри мой исправленный ответ - person Phil; 20.02.2014

Библиотека Crouton решила проблему. Надеюсь, это будет полезно и для кого-то еще.

https://github.com/keyboardsurfer/Crouton

person Adnan    schedule 20.02.2014