onClick事件未触发| 安卓

EGHDK:

我用一个活动和一个布局制作了一个非常简单的测试应用程序。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组件进行交互时,将按从上到下的顺序调用各种侦听器。如果较高优先级的侦听器之一“消费事件”,则较低的侦听器将不会被调用

在您的情况下,按顺序调用这三个侦听器:

  1. OnTouchListener
  2. OnFocusChangeListener
  3. OnClickListener

用户第一次触摸EditText时,它将获得焦点,以便用户可以键入。动作在这里消耗。因此,不会调用优先级较低的OnClickListener。每次连续的触摸都不会改变焦点,因此这些事件会滴落到OnClickListener上。

按钮(以及其他类似组件)不会从触摸事件中获得焦点,这就是为什么每次都调用OnClickListener的原因。

基本上,您有三个选择:

  1. 自己实现一个OnTouchListener:

    ed1.setOnTouchListener(new OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            if(MotionEvent.ACTION_UP == event.getAction())
                editTextClicked(); // Instead of your Toast
            return false;
        }
    });
    

    这将在每次触摸EditText时执行。请注意,侦听器返回false,这使事件可以下移到内置的OnFocusChangeListener,后者会更改焦点,以便用户可以在EditText中键入。

  2. 与OnClickListener一起实现OnFocusChangeListener:

    ed1.setOnFocusChangeListener(new OnFocusChangeListener() {
        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            if(hasFocus)
                editTextClicked(); // Instead of your Toast
        }
    });
    

    当焦点改变时,此侦听器捕获第一个触摸事件,而您的OnClickListener捕获其他所有事件。

  3. (这不是一个有效的答案,但这是一个很好的技巧。)false在XML 中将focusable属性设置为

    android:focusable="false"
    

    现在,OnClickListener将在每次单击时触发但这使EditText变得无用,因为用户无法再输入任何文本...

注意:

getApplicationContext()会造成内存泄漏。一个好的习惯是除非绝对必要,否则避免使用它。您可以放心使用v.getContext()

希望有帮助!

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章