onClick事件不会触发| Android的

我用一个活动和一个布局做了一个非常简单的testing应用程序。 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 。 你可以继续select来回,并不会触发onClick 。 我需要这个基本的function,但一直没能想办法让它工作。 想法?

注意

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

澄清

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

当用户与UI元素进行交互时,各种监听器将按照自上而下的顺序进行调用。 (例如:OnTouch – > OnFocusChange – > OnClick。)如果已经定义了一个侦听器(使用setOn … Listener),并且它使用此事件:不会调用较低优先级的侦听器。 就其性质而言,第一次触摸EditText时,它会使用OnFocusChangeListener获得焦点,以便用户可以input。 该操作在此消耗,因此不会调用OnClick。 每个连续的触摸都不会改变焦点,因此事件会慢慢向下传递给OnClickListener。

基本上,你有三个select:

  1. 在XML中将可聚焦属性设置为false:

     android:focusable="false" 

    现在,OnClickListener 每次点击都会触发。 但是,这使得EditText无用,因为用户不能再input任何文本…

  2. 与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上的每个触摸事件。

  3. 自己实现一个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表示该事件将继续stream下,并到达内置的onFocusChangeListener,允许它接收文本。

希望有所帮助!

使编辑文本可点击。在XML android:clickable="true"或在代码中

 ed1.setClickable(true); 

然后做

 ed1.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getBaseContext(), "1",Toast.LENGTH_SHORT).show(); } }); 

我可能来不及派对了,但是这里有一个修改了onClick()没有被调用的问题的代码:

 ed1.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_UP && !v.hasFocus()) { // onClick() is not called when the EditText doesn't have focus, // onFocusChange() is called instead, which might have a different // meaning. This condition calls onClick() when click was performed // but wasn't reported. Condition can be extended for v.isClickable() // or v.isEnabled() if needed. Returning false means that everything // else behaves as before. v.performClick(); } return false; } }); 
 public class TestProject extends Activity implements OnClickListener { TextView txtmsg; EditText ed1, ed2; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); txtmsg = (TextView) findViewById(R.id.txtmsg); ed1 = (EditText) findViewById(R.id.edt1); ed2 = (EditText) findViewById(R.id.edt2); ed1.setOnClickListener(this); ed2.setOnClickListener(this); } @Override public void onClick(View v) { if(v==ed1){ txtmsg.setText("1"); Toast.makeText(this, "first",Toast.LENGTH_SHORT).show(); } if(v==ed2){ txtmsg.setText("2"); Toast.makeText(this, "second",Toast.LENGTH_SHORT).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/edt1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:ems="10" /> <EditText android:id="@+id/edt2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_below="@+id/edt1" android:layout_marginTop="14dp" android:ems="10" /> <TextView android:id="@+id/txtmsg" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignRight="@+id/edt2" android:layout_below="@+id/edt2" android:layout_marginRight="22dp" android:layout_marginTop="160dp" android:textAppearance="?android:attr/textAppearanceLarge" /> </RelativeLayout> 

当我发生这种事时,花了一分钟来弄清楚这一点。 我的ImageButtonsetOnClickListeneronClick似乎没有触发,然后我意识到它实际上是在我的XML布局中的另一个元素下,所以我把这个:

  <RelativeLayout> <ImageButton> <LinearLayout></LinearLayout> </RelativeLayout> 

进入这个:

  <RelativeLayout> <LinearLayout></LinearLayout> <ImageButton> </RelativeLayout> 

突然间ImageButton没有被其他布局重叠,因为它现在被添加到父布局,现在已经在顶部,每次都有效。 祝你好运,总是有趣的基本的东西突然间似乎停止工作

避免使用FocusChangeListener因为当你不需要它的时候(例如,当你input一个活动的时候)它会performance不正常。 只需像这样设置一个OnTouchListenerOnClickListener

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

这将导致您的EditText首先获得焦点,而您的onClick将在第一次正常运行。

发生这种情况是因为第一次敲击将焦点集中到视图中。 下一次点击触发点击。

如果你dynamic地膨胀视图,你可以做的是,在元素集上:

 android:clickable="true" android:focusable="false" android:focusableInTouchMode="false" 

如果这不起作用,请尝试在父视图上应用它。

尝试这个:

 public class MainActivity extends Activity implements OnClickListener { //rest of your code }