Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/192.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在关闭微调器下拉列表时捕捉事件_Android_Drop Down Menu_Android Spinner - Fatal编程技术网

Android 在关闭微调器下拉列表时捕捉事件

Android 在关闭微调器下拉列表时捕捉事件,android,drop-down-menu,android-spinner,Android,Drop Down Menu,Android Spinner,我想在spinner下拉列表被取消时捕捉一个事件。当用户单击onItemSelected()中的任何项目时,我们可以捕获它。但我想捕捉,即使当用户触摸到下拉区域或后退按钮之外时,这些也会使它消失。在这两个原因中,当我观察日志时,它说“试图完成输入事件,但输入事件接收器已被释放” 我观察到,这是从finishInputEvent(InputEvent事件,布尔处理)方法中的InputEventReceiver.java打印出来的。但这是最终的方法,所以没有必要重写它。在这种情况下,当下拉列表被取消

我想在spinner下拉列表被取消时捕捉一个事件。当用户单击onItemSelected()中的任何项目时,我们可以捕获它。但我想捕捉,即使当用户触摸到下拉区域或后退按钮之外时,这些也会使它消失。在这两个原因中,当我观察日志时,它说“试图完成输入事件,但输入事件接收器已被释放”


我观察到,这是从finishInputEvent(InputEvent事件,布尔处理)方法中的InputEventReceiver.java打印出来的。但这是最终的方法,所以没有必要重写它。在这种情况下,当下拉列表被取消时,有人可以建议处理方法吗?

如何查找另一个事件,如
onDetachFromWindow
?微调器没有我们经常处理的任何常规生命周期事件——最好有一个
在顶部
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
方法中设置一个变量。

我使用了
弹出菜单
而不是微调器。因为据我所知,spinner无法捕捉到Dislose事件,但在弹出菜单中,我将
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.
}
});

如果确实不需要使用微调器,请尝试使用此代码。
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();

        }
    });
final Dialog=新建对话框(上下文);
setContentView(R.layout.custom\u list\u弹出窗口);
//对话框。可设置可取消(false);
对话框。设置标题(“标题”);
setOnCancelListener(新的DialogInterface.OnCancelListener(){
@凌驾
public void onCancel(对话框接口对话框){
//
//在这里做你曾经做过的事
//
}
});
最终ListView ListView=(ListView)dialog.findViewById(R.id.lv\u sales\u tax);
setAdapter(适配器);
setOnItemClickListener(新的AdapterView.OnItemClickListener(){
@凌驾
public void onItemClick(AdapterView父对象、视图、整型位置、长id){
//
//在这里做你的事
//
dialog.dismise();
}
});
dialogButton.setVisibility(View.GONE);
dialog.show();
}
});
自定义\u列表\u 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>


您是否使用检查?@rekire是,它将覆盖onnothingselect()function@rekire是的,但是当控件被解除时,它不会变成空的selected()。@Appu面临同样的问题。你找到解决办法了吗?@SyedMuhammadUmair我完全忘记了这个问题,所以没有回答我的问题。我现在已经自我回答了,但如果你严格地想使用旋转器,这对你来说是无用的。我使用了弹出菜单。谢谢,但这需要最小API 14,我需要支持API 11。我最终使用了ListPopupWindow(添加到API级别11中)