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