java – onClick事件不触发| Android

我做了一个非常简单的测试应用程序与一个活动和一个布局。 onClick不会在第一次按下时触发,因为它应该。

活动:

package com.example.mytest;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        final EditText ed1 = (EditText) findViewById(R.id.editText1);

        ed1.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub

                Toast.makeText(getApplicationContext(), "1", Toast.LENGTH_LONG)
                        .show();

            }

        });
    }

}

布局:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <EditText
        android:id="@+id/editText1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:ems="10" >

        <requestFocus />
    </EditText>

    <EditText
        android:id="@+id/editText2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/editText1"
        android:ems="10" />

</RelativeLayout>

如果运行此应用程序,并单击第二个editText,然后回到第一个,它不会触发onClick。你可以继续选择来回,它不会触发onClick。我需要这个基本功能,但是没能想到一种方法来使它工作。想法?

注意

我已经尝试所有的方法推荐在我的API级16物理设备和我的API级别8模拟器,但我得到相同的问题。

澄清

当editText1被聚焦并被点击时,onClick方法被触发。如果editText2被聚焦,然后editText1被点击,它不会被触发。大问题。

最佳答案
当用户与UI元素交互时,各个侦听器以自上而下的顺序调用。 (例如:OnTouch – > OnFocusChange – > OnClick。)如果已经定义了侦听器(使用setOn … Listener),并且它使用此事件:将不会调用较低优先级的侦听器。根据其性质,第一次触摸EditText时,它通过OnFocusChangeListener接收焦点,以便用户可以键入。操作在此处被消耗,因此不调用OnClick。每次连续的触摸不会改变焦点,所以事件滴到了OnClickListener。

基本上,你有三个选择:

>在XML中将focusable属性设置为false:

android:focusable="false"

现在OnClickListener将在每次被点击时触发。但这使得EditText无用,因为用户不能再输入任何文本…
>与OnClickListener一起实现OnFocusChangeListener:

ed1.setOnFocusChangeListener(new OnFocusChangeListener() {
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if(hasFocus)
            Toast.makeText(getApplicationContext(), "onFocusChange", Toast.LENGTH_LONG).show();
    }
});

在一起,你可以捕获你的EditText上的每个触摸事件。
>自己实现一个OnTouchListener:

ed1.setOnTouchListener(new OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        if(MotionEvent.ACTION_UP == event.getAction())
            Toast.makeText(getApplicationContext(), "onTouch: Up", Toast.LENGTH_SHORT).show();
        return false;
    }
});

这将在每次触摸EditText时执行。请注意,此事件返回一个布尔值。返回false表示事件将继续向下涓流并到达内置onFocusChangeListener,允许它接收文本。

希望有所帮助!

转载注明原文:java – onClick事件不触发| Android - 代码日志