59

我有一个编辑文本,当用户单击此编辑文本时,我想显示一个警报对话框。
我的代码如下:

            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());
                }
            });

我不希望用户单击编辑文本时出现键盘,因此我将 inputtype 设置为 TYPE_NULL。
但是当edittext没有焦点并且我点击它时,onClick事件不会被执行。当我再次单击它时,警报对话框正确显示。

我该如何解决?

4

9 回答 9

134

只需尝试将其添加到您的XML文件中。widget获得焦点时,您的键盘会弹出。因此,为了防止这种行为将 focusable 设置为false. 然后正常使用OnClickListener

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

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

于 2012-09-24T07:30:49.197 回答
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;
    }
});
于 2012-09-24T07:29:46.590 回答
7

没什么可做的,你只需要

edt.setFocusable(false);
于 2012-09-24T07:40:13.657 回答
7

如果 focusableInTouchMode 为 true,则仅在第二次触摸时触发触摸,因此除非您希望在这种情况下使用 false 作为 focusableInTouchMode。如果您想在视图中启用可聚焦性,请设置 focusable true

<EditText android:focusable="true"  android:focusableInTouchMode="false" ... />
于 2014-07-01T11:28:38.130 回答
5

使您的警报对话框出现在

setOnFocusChangedListener()

于 2012-09-24T07:30:37.057 回答
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());
    }
});
于 2016-10-03T22:52:58.967 回答
3

避免使用 a FocusChangeListener,因为当你真的不需要它时(例如,当你进入一个活动时)它会表现得不规律。只需像这样设置OnTouchListener一个OnClickListener

    @Override
    public boolean onTouch(View view, MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                view.requestFocus();
                break;
        }
        return false;
    }

这将导致您EditText在 onClick 调用之前获得焦点。

于 2016-11-07T19:33:47.110 回答
1

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

也许对你有帮助。

于 2012-09-24T07:30:28.543 回答
-1

当软键盘弹出时,尝试从 EditText 再现“点击”声音时,这对我来说是一个真正的问题;我每秒钟只有一次点击。为我解决的问题与@neaGaze 的工作相反。这在 my_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
    }
});

说到那个讨厌的软键盘,如果我从 Dialog 风格的 Activity 中完成,软键盘向上,无论我尝试什么,当我返回 MainActivity 时,键盘仍然向上。我已经尝试了所有常见的建议,例如关闭/隐藏 Android 软键盘如何以编程方式关闭 Android 软键盘等。这些都不起作用。

就我而言,我不需要 MainActivity 中的软键盘。在我的 AndroidManifest.xml 文件中的 MainActivity 部分中起作用的是以下内容

<activity

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

</activity>
于 2017-06-07T13:38:14.057 回答