почему onNothingSelected в spinner не вызывается? - PullRequest
4 голосов
/ 13 августа 2010

У меня есть Android Spinner, и я хочу прослушать событие, когда пользователь нажимает кнопку «Назад», когда отображается панель выбора счетчика. Я реализовал OnItemSelectedListener, но onNothingSelected (AdapterView arg0) не вызывалось при нажатии назадклавиша.

Я просто хочу прослушать событие, когда пользователь ничего не выбирает (или панель выбора исчезает).

Есть ли правильный способ сделать это?

Спасибо!


 Spinner s1 = (Spinner) findViewById(R.id.spinner1);
    ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(
            this, R.array.colors, android.R.layout.simple_spinner_item);
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    s1.setAdapter(adapter);
    s1.setOnItemSelectedListener(
            new OnItemSelectedListener() {
                public void onItemSelected(
                        AdapterView<?> parent, View view, int position, long id) {
                    showToast("Spinner1: position=" + position + " id=" + id);
                }

                public void onNothingSelected(AdapterView<?> parent) {
                    showToast("Spinner1: unselected");
                }
            });

Это пример в Android 2.2 SDK, он также не показывает "Spinner1: unselected", когда исчезает панель выбора.

Ответы [ 2 ]

3 голосов
/ 13 августа 2010

Похоже, вы не сможете делать то, что хотите, не расширяя класс Spinner.Кажется, что Spinner не регистрирует OnCancelListener с AlertDialog, который он создает для отображения элементов.

Код из Spinner.java :

  @Override
    public boolean performClick() {
        boolean handled = super.performClick();

        if (!handled) {
            handled = true;
            Context context = getContext();

            final DropDownAdapter adapter = new DropDownAdapter(getAdapter());

            AlertDialog.Builder builder = new AlertDialog.Builder(context);
            if (mPrompt != null) {
                builder.setTitle(mPrompt);
            }
            mPopup = builder.setSingleChoiceItems(adapter, getSelectedItemPosition(), this).show();
        }

        return handled;
    }

    public void onClick(DialogInterface dialog, int which) {
        setSelection(which);
        dialog.dismiss();
        mPopup = null;
    }

Кроме того, setSelection вызывается только при нажатии элемента в диалоговом окне.Он не будет вызываться, когда пользователь нажимает кнопку «Назад», поскольку это событие * 1013.

Расширение Spinner будет немного болезненным, поскольку вам придется копировать все обратно в AdapterViewв ваш источник из источника Android, поскольку различные поля-члены, необходимые для реализации, доступны только на уровне пакета.

0 голосов
/ 05 мая 2016

Другой подход заключается в создании минимального пользовательского выпадающего элемента счетчика, например:

<com.mypackage.MyTextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/text1"
    style="?android:attr/spinnerDropDownItemStyle"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"

    android:textSize="25dp"
 />

, а затем перехватить onDetachedFromWindow ():

public class MyTextView extends TextView {

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

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

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

    @Override
    protected void onDetachedFromWindow() {
        super.onDetachedFromWindow();
        // Callback here
    }
}

Вы можете уточнить это, если вы используете собственный ArrayAdapter, чтобы установить только один из выпадающих элементов для выполнения обратного вызова, а также настройки подходящий контекст для обратного вызова и т. д.

В зависимости от того, что вы делаете внутри обратного вызова, вы можете захотеть опубликуйте его как работоспособный, чтобы очиститель был полностью очищен прежде чем он что-нибудь сделает.

...