点击事件仅在第二次编辑文本时起作用

61

我有一个EditText,当用户点击这个EditText时,我想显示一个AlertDialog。
我的代码如下:

            edt.setInputType(InputType.TYPE_NULL);
            edt.setFocusableInTouchMode(true);
            edt.requestFocus();

            edt.setCursorVisible(false);

            edt.setOnClickListener(new OnClickListener() {

                public void onClick(View v) {
                    CommentDialog.buildDialog(mContext, identifier, false, edt.getId());
                }
            });

我不希望用户在点击EditText时弹出键盘,所以我将输入类型设置为TYPE_NULL。
但是当EditText没有焦点并且我点击它时,onClick事件不会执行。第二次点击时,AlertDialog会正确显示。

我该如何解决这个问题?


2
使用 onFocusChangeListener - Pratik Butani
Android框架表现极其不一致和误导性。近3年过去了,问题依旧存在。 - stdout
9个回答

135

尝试将以下内容添加到您的XML文件中即可。当widget获得焦点时,您的键盘会弹出。 为了防止这种行为,请将focusable设置为false。然后正常使用OnClickListener

<EditText
  android:focusable="false"
  ...
/>

现在,它应该可以工作了。


7
点击有效,但是键盘未打开,且在点击时没有聚焦到该字段。 - An-droid
你又修改了,太棒了。 - Naveed Ahmad
如果您将视图封装在像LinearLayout或其他容器中 - 也请将它们的focusable属性设置为FALSE。 - Zon
在我的情况下,我需要处理两个事件:焦点变化和点击事件,我该如何同时处理它们? - Juturu Yugandhar

24

你可以使用onTouch而不是onClick,这样无论EditText是否具有焦点都没有关系。

edt.setOnTouchListener(new OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) { 
        CommentDialog.buildDialog(mContext, identifier, false, edt.getId());                    
        return false;
    }
});

7
没什么事情可做,您只需要
edt.setFocusable(false);

7
如果将focusableInTouchMode设置为true,则仅在第二次触摸时触发触摸,因此除非您想要这种情况,否则请将其设置为false。如果您想在视图中启用可聚焦性,请将focusable设置为true。
<EditText android:focusable="true"  android:focusableInTouchMode="false" ... />

我认为如果你在意图中添加一些解释,那么对于提问者和其他访客来说会更有帮助。 - Reporter

5
让你的警报对话框出现在

setOnFocusChangedListener()

上。

3
你应该添加 onFocusChangeListener:
edt.setKeyListener(null);
edt.setOnFocusChangeListener(new View.OnFocusChangeListener() {
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if(hasFocus)
        {
            edt.callOnClick();
        }
    }
});
edt.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        CommentDialog.buildDialog(mContext, identifier, false, edt.getId());
    }
});

3
避免使用FocusChangeListener,因为当您不需要它时(例如,当您进入活动时),它会表现不稳定。只需像这样设置OnTouchListenerOnClickListener
    @Override
    public boolean onTouch(View view, MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                view.requestFocus();
                break;
        }
        return false;
    }

这将使您的EditText在onClick调用之前获得焦点。

1

如果您不需要键盘,可以使用“Editable=false”和“Focus=false”而不是设置输入类型。

这可能对您有所帮助。


-1
这对我来说是一个真正的问题,当软键盘弹出时,我试图从EditText中复制一个“点击”声音;我只能每隔一次才能得到一个点击声。对我来说解决这个问题的方法与@neaGaze相反。这在我的_layout.xml文件中对我起作用。
<EditText android:focusable="true"  android:focusableInTouchMode="true" ... />

每当用户输入 EditText 时,它允许点击声音/事件发生,同时也允许软键盘显示。当然,你必须处理 OnClickListener 才能实现这一点,即使你什么也不做:

myEditText = (EditText) findViewById(R.id.myEditText);
...

// implement the onClick listener so we get the click sound and event if needed
myEditText.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View view) {
        //do something or nothing; up to you
    }
});

提到那个令人头疼的软键盘,如果我在对话框样式活动中带着软键盘结束,无论我尝试了什么,当我返回到MainActivity时键盘都会保持弹出状态。我已经尝试了所有常见建议,如关闭/隐藏Android软键盘如何以编程方式关闭Android软键盘等等。但都没有起作用。
在我的情况下,我不需要MainActivity中的软键盘。以下内容在AndroidManifest.xml文件内MainActivity部分解决了问题。
<activity

    android:name=".MainActivity"
    android:windowSoftInputMode="stateAlwaysHidden">

</activity>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接