TextView это кража событие onfocus? - PullRequest
2 голосов
/ 04 мая 2011

когда я устанавливаю прослушиватель щелчков для моего 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. текстовое представление получает фокус
нажатие 2. OnClick запускается

Мне нужно нажать 1, чтобы запустить его также

Ответы [ 5 ]

2 голосов
/ 04 мая 2011

Ты очень близко ...

link.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {
        // do something fancy
    }
});
1 голос
/ 26 февраля 2015

Первый щелчок будет ловушкой для события фокуса.Вы также можете просто перехватить фокус:

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);
            }
        }
    });
0 голосов
/ 04 июля 2012

Для справки в будущем у меня была похожая проблема, когда первый щелчок изменил бы цвет фокусируемого TextView из селектора, а второй щелкнул бы мою связанную функцию onClick, и я хотел, чтобы один щелчок обрабатывал оба.Использование глобального слушателя изменения фокуса решило эту проблему. Я использую поддержку совместимости v4 на Android 2.3 с фрагментами.

<?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"/>

В моемЯва файл (фрагмент) У меня есть

    @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;
                }
            }
        });
}
0 голосов
/ 04 мая 2011

Зарегистрируйте onTouchListener вместо onClickListener - он должен дать вам то, что вы хотите.

0 голосов
/ 04 мая 2011

Попробуйте запросить фокус для этого вида.

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