在旋转器下降时捕获事件被解除

时间:2013-11-07 10:02:48

标签: android drop-down-menu android-spinner

我想在旋转器下拉被取消时捕获一个事件。当用户点击onItemSelected()中的任何项时,我们可以捕获它。但是,即使用户在下拉区域或后退按钮之外触摸,我也想抓住,因为这些也会让它消失。在我观察日志的这两个原因中,它表示“尝试完成输入事件,但输入事件接收器已被处理”

我观察到source code,这是从 finishInputEvent(InputEvent事件,布尔处理)方法中的 InputEventReceiver.java 打印出来的。但这是最后一种方法,所以没有必要重写它。有人可以建议在这些情况下解除下拉时的处理方式吗?

3 个答案:

答案 0 :(得分:0)

如何寻找像onDetachFromWindow这样的其他活动呢?一个微调器没有我们经常使用的任何常规生命周期事件 - 最好有一个onStoponDestroy来处理。当然,您必须扩展微调器类并创建一个接口来定义您自己的侦听器:

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方法中设置变量。

答案 1 :(得分:0)

我使用Popup Menu代替Spinner。因为据我所知,dismiss事件无法通过微调器捕获,但是使用弹出菜单我通过将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 :(得分:0)

如果您真的不需要使用微调器,请尝试使用此代码 ListView里面的Dialog。您可以侦听对话框的取消/关闭事件(相同的事情)。您可以在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>