Улавливание события при выпадении счетчика

Я хочу, чтобы поймать событие, когда выкручивание спиннера отклонено. Мы можем поймать его, когда пользователь нажимает на любой элемент в onItemSelected(). Но я хочу поймать, даже когда пользователь прикасается за пределы области раскрывающегося списка или назад, поскольку они тоже заставляют его исчезать. В этих двух случаях, когда я наблюдал журнал, он говорит "Попытка закончить входное событие, но приемник входных событий уже установлен"

Я наблюдал исходный код, это напечатано из InputEventReceiver.java в finishInputEvent ( Событие InputEvent, обработанное булевым способом). Но это окончательный метод, поэтому нет смысла его переопределять. Может кто-нибудь, пожалуйста, предложите способ обращения, когда выпадение будет отклонено в этих случаях?

Ответы

Ответ 1

Я использовал Popup Menu вместо Spinner. Поскольку, насколько я знаю, событие отклонения не может быть захвачено spinner, но с помощью всплывающего меню я сделал это, установив onDismissListerner() во всплывающее меню

popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {  
             public boolean onMenuItemClick(MenuItem item) {  
              Toast.makeText(MyActivity.this,"Clicked on: " + item.getTitle(),Toast.LENGTH_LONG).show();  
              return true;  
             }  
            });  
popup.setOnDismissListener (new PopupMenu.OnDismissListener(){

public void onDismiss()
{
   //catch dismiss event here.
}
});

Ответ 2

Как насчет поиска другого события, такого как onDetachFromWindow? У Spinner нет каких-либо регулярных событий жизненного цикла, с которыми мы работаем много - было бы неплохо работать с onStop или onDestroy. Конечно, вам нужно будет расширить класс spinner и создать интерфейс для определения вашего собственного слушателя:

public class ChattySpinner extends Spinner {
    private ChattySpinnerListener chattyListener;

    public ChattySpinner(Context context) {
        super(context);
    }

    public ChattySpinner(Context context, int mode) {
        super(context, mode);
    }

    public ChattySpinner(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public ChattySpinner(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    public ChattySpinner(Context context, AttributeSet attrs, int defStyle, int mode) {
        super(context, attrs, defStyle, mode);
    }

    public void setChattyListener(ChattySpinnerListener listener) {
        this.chattyListener = listener;
    }

    @Override
    protected void onDetachedFromWindow() {
        if(chattyListener != null) {
            chattyListener.onDetach();
        }

        super.onDetachedFromWindow();
    }

    public interface ChattySpinnerListener {
        public void onDetach();
    }
}

И в вашем XML-макете вы должны убедиться, что вы указали этот элемент управления вместо своего обычного счетчика, а в своем коде установите слушателя с реализацией того, что вы хотите сделать, когда отделитель спиннинга. Вам будет необходимо выяснить на стороне клиента, как отслеживать, было ли что-то выбрано или нет, возможно, установив переменную в методе onItemSelected, которую вы предоставите слушателю выбора.

Ответ 3

Если вам действительно не нужно использовать spinner, попробуйте использовать этот код.
ListView внутри диалога. Вы можете прослушать событие Отменить/отклонить диалог (То же самое). Вы можете использовать это в API 11.

final Dialog dialog = new Dialog(context);
            dialog.setContentView(R.layout.custom_list_popup);
            //dialog.setCancelable(false);
            dialog.setTitle("Title");

            dialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
                @Override
                public void onCancel(DialogInterface dialog) {
                    //
                    //Do your onCancel things here
                    //
                }
            });


            final ListView listView = (ListView) dialog.findViewById(R.id.lv_sales_tax);
            listView.setAdapter(adapter);

            listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

                    //
                    //Do your stuff here
                    //

                    dialog.dismiss();
                }
            });

            dialogButton.setVisibility(View.GONE);
            dialog.show();

        }
    });

содержимое custom_list_popup.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="20dp"
android:orientation="vertical">

<ListView
    android:id="@+id/lv_sales_tax"
    android:divider="@drawable/list_divider"
    android:dividerHeight="20dp"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />

</LinearLayout>