OnClick事件仅在edittext上第二次运行

时间:2012-09-24 07:24:07

标签: android

我有一个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时显示键盘,因此我将inputtype设置为TYPE_NULL。
但是当edittext没有焦点并且我单击它时,onClick事件不会被执行。当我再次单击它时,alertdialog会正确显示。

我该如何解决这个问题?

9 个答案:

答案 0 :(得分:114)

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

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

现在,它应该有效。

答案 1 :(得分:21)

您可以使用onTouch代替onClick,因此EditText是否具有焦点并不重要。

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

答案 2 :(得分:6)

你无需做什么

edt.setFocusable(false);

答案 3 :(得分:5)

上显示警告对话框

setOnFocusChangeListener()

答案 4 :(得分:5)

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

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

答案 5 :(得分: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调用之前获得焦点。

答案 6 :(得分:1)

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

这对你有帮助。

答案 7 :(得分:1)

你应该添加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());
    }
});

答案 8 :(得分:-1)

在尝试重现&#34;点击时,这对我来说是一个真正的问题。当弹出软键盘时,来自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风格活动,无论我尝试什么,当我回到MainActivity时键盘都保持不动。我曾尝试过所有常见的建议,例如Close/Hide the Android soft keyboardHow to close Android soft keyboard programmatically等。这些都没有效果。

在我的情况下,我不需要MainActivity中的软键盘。在我的AndroidManifest.xml文件中,MainActivity部分

中的工作原理如下
<activity

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

</activity>