android - Spinner 下拉菜单出现和消失时是否有任何事件/监听器?

标签 android android-spinner

每当用户要从下拉列表中进行选择时,我想将 Spinner 的主 TextView 的背景颜色设置为蓝色。那么我如何知道下拉菜单何时出现和消失呢?

我认为我们可以在下拉列表出现时在 Spinner 上使用 onTouch 监听器,但我不确定当它消失时我们会做什么。

最佳答案

有一个方法可以告诉我们旋转器的状态。下面是

spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {

        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
            Log.d("","selected")

        }

        @Override
        public void onNothingSelected(AdapterView<?> parent) {
            Log.d("nothing" , "unselected");  
        }

    });

但它不会告诉你当你触摸旋转器外部时的状态。因此,要解决此问题,您必须为此实现自己的逻辑。幸运的是,luksporg 分享了 solution可以帮助你的。

public class CustomSpinner extends Spinner {

   /**
    * An interface which a client of this Spinner could use to receive
    * open/closed events for this Spinner. 
    */
    public interface OnSpinnerEventsListener {

        /**
         * Callback triggered when the spinner was opened.
         */
         void onSpinnerOpened(Spinner spinner);

        /**
         * Callback triggered when the spinner was closed.
         */
         void onSpinnerClosed(Spinner spinner);

    }

    private OnSpinnerEventsListener mListener;
    private boolean mOpenInitiated = false;

    // implement the Spinner constructors that you need

    @Override
    public boolean performClick() {
        // register that the Spinner was opened so we have a status
        // indicator for when the container holding this Spinner may lose focus
        mOpenInitiated = true;
        if (mListener != null) {
            mListener.onSpinnerOpened(this);
        }
        return super.performClick();
    }

    @Override
    public void onWindowFocusChanged (boolean hasFocus) {
        if (hasBeenOpened() && hasFocus) {
            performClosedEvent();
        }
    }

    /**
    * Register the listener which will listen for events.
    */
    public void setSpinnerEventsListener(
            OnSpinnerEventsListener onSpinnerEventsListener) {
        mListener = onSpinnerEventsListener;
    }

    /**
     * Propagate the closed Spinner event to the listener from outside if needed.
     */
    public void performClosedEvent() {
        mOpenInitiated = false;
        if (mListener != null) {
            mListener.onSpinnerClosed(this);
        }
    }

    /**
     * A boolean flag indicating that the Spinner triggered an open event.
     * 
     * @return true for opened Spinner 
     */
    public boolean hasBeenOpened() {
        return mOpenInitiated;
    }

}

关于android - Spinner 下拉菜单出现和消失时是否有任何事件/监听器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59026424/

相关文章:

java - Android DatagramChannel.register() block 执行

Android ListView 错误

android - AppCompatSpinner 与 android.widget.Spinner 对比,适用于最低 SDK 版本 14 的应用

android 致命异常微调器

android - Whatsapp 通过 Intent 向特定群组发送消息

android - 以编程方式覆盖文本文件

android - 如何在 Jetpack Compose 的新线圈版本中使用 `ImageRequest.Builder.target`?

android - 微调器上的监听器

android - 像编辑文本一样的微调器

java - 设置MaterialSpinner的背景颜色