TextView是onfocus窃取onclick事件?

时间:2011-05-04 17:09:59

标签: android android-layout android-widget textview android-ui

当我为TextView设置单击侦听器时,初始单击不会触发事件。这是textview:

<TextView 
  style="@android:style/Widget.EditText"
  android:id="@+id/my_text_area"
  android:layout_width="0dip"
  android:layout_height="wrap_content"
  android:textColorHint="@color/text_hint"
  android:singleLine="true"
  android:focusable="true"
  android:focusableInTouchMode="true"
  android:clickable="true"
  android:padding="10dip"
  android:background="@android:color/transparent"
  android:layout_weight="1"
  ></TextView>

// OnCreate:
TextView link = (TextView)findViewById(R.id.my_text_area);
// "this" is my Activity that implements OnClickListener
link.setOnClickListener(this); 

void OnClick(view v) {
    //only gets fired after the first time
}

当我点击文本视图时,会发生以下情况:

单击1. textview收到焦点
单击2. OnClick被触发

我需要点击1来解雇它

5 个答案:

答案 0 :(得分:2)

你非常接近......

link.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {
        // do something fancy
    }
});

答案 1 :(得分:1)

首先点击将是焦点事件的陷阱。您也可以简单地拦截onFocus:

final View.OnClickListener listener = new View.OnClickListener() {
        @Override
        public void onClick(final View view) {
            // Do something...
        }
    };
    link.setOnClickListener(listener);
    link.setOnFocusChangeListener(new View.OnFocusChangeListener() {
        @Override
        public void onFocusChange(final View v, final boolean hasFocus) {
            if(hasFocus) {
                listener.onClick(v);
            }
        }
    });

答案 2 :(得分:0)

尝试请求该视图的焦点。

TextView link = (TextView)findViewById(R.id.my_text_area);
link.requestFocus();
link.setOnClickListener(this);

答案 3 :(得分:0)

注册onTouchListener而不是onClickListener - 它应该为您提供所需的内容。

答案 4 :(得分:0)

对于Future Reference,我遇到了类似的问题,第一次单击会从选择器更改可聚焦TextView的颜色,第二次单击将触发我关联的onClick函数,我想要一次单击来处理两者。使用全局焦点更改侦听器解决了这个问题。我正在使用android 2.3上的兼容性支持v4和片段。

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" android:color="@color/yellow" />
<item android:state_pressed="false" android:state_focused="true" android:color="@color/darkgrey" />
<item android:state_pressed="false" android:color="@color/grey" />
</selector>

... Layout.xml

    <TextView
    android:id="@+id/tv1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textColorHint="@color/text_hint"
    android:focusable="true"
    android:focusableInTouchMode="true"
    android:clickable="true"
    android:textColor="@drawable/textviewSelector"
    android:text="some text"/>

在我的java文件(Fragment)中我有

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        ViewTreeObserver VTO=getView().getViewTreeObserver();
        VTO.addOnGlobalFocusChangeListener(new
        ViewTreeObserver.OnGlobalFocusChangeListener() {
            @Override
            public void onGlobalFocusChanged(View oldFocus, View newFocus) {
                switch(newFocus.getId()){
                case R.id.tv1:
                //On click Code
                break;
                }
            }
        });
}