使不可编辑的EditText响应第一次单击

时间:2014-06-10 21:17:24

标签: android

我尝试在用户点击EditText时显示弹出菜单,但我不想让EditText本身可编辑。我尝试了许多操作,比如将KeyListener设置为null,将其InputType设置为null,但总是会发生第一次点击给出View焦点和第二次点击实际上注册我的OnClickListener。因此,用户必须单击两次才能弹出菜单。有什么想法吗?

public class PopupEditText extends EditText implements OnClickListener
{
    private PopupMenu mMenu;
    private Context   mContext;

    public PopupEditText(Context context)
    {
        super(context);
        init(context);
    }

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

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

    private void init(Context context)
    {
        mContext = context;
        setKeyListener(null);
        mMenu = new PopupMenu(context, this);
    }

    @Override
    public void onClick(View view)
    {
        mMenu.show();
    }

1 个答案:

答案 0 :(得分:1)

你离我不远。我建议您直接覆盖onTouchEvent(),并仅回复ACTION_UP个事件。 (可选)强制禁用它并且不可聚焦。例如:

public class UnmodifiableEditText extends EditText {
    private PopupMenu mPopupMenu;

    public UnmodifiableEditText(Context context) {
        super(context);
        init(context);
    }

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

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

    private void init(Context ctx) {
        super.setEnabled(false);
        super.setFocusable(false);
        mPopupMenu = new PopupMenu(ctx, this);
    }

    @Override public boolean onTouchEvent(MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_UP) {
            Toast.makeText(getContext(), "Showing Popup", Toast.LENGTH_SHORT).show();
            mPopupMenu.show();
        }

        return true;
    }

    @Override public void setEnabled(boolean enabled) {
        // Do not allow enabling the EditText
    }

    @Override public void setFocusable(boolean focusable) {
        // Do not allow focusability changes
    }
}