Внедрить onClick только для составного компонента TextView
Мне нужно иметь текст с возможностью рисования слева, и я хочу выполнить некоторый код, когда пользователь нажимает/касается изображения (только изображение, а не текст), поэтому я использовал LinearLayout с TextView и ImageView, который можно щелкнуть и запускает событие onClick. Парсер XML предлагает мне заменить это на TextView с помощью составного чертежа, который будет рисовать то же самое с гораздо меньшими строками XML. Мой вопрос: "Могу ли я указать, что я хочу обрабатывать событие onClick только при извлечении из TextView, а не на самом TextView? Я видел некоторые решения, которые включают в себя создание собственного расширения TextView, но я заинтересован только в том, чтобы иметь возможность сделать это в ресурсе макета, если это возможно, иначе я сохраню следующее Код XML:
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="horizontal" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="bottom"
android:paddingTop="10dp"
android:paddingLeft="10dp"
android:paddingRight="10dp"
android:text="@string/home_feedback_title"
android:textColor="@android:color/primary_text_dark"
android:textStyle="bold"
android:paddingBottom="4dp"/>
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/action_feedback"
android:clickable="true"
android:onClick="onClickFeedback"
android:contentDescription="@string/action_feedback_description"/>
</LinearLayout>
Ответы
Ответ 1
Вы можете пойти в любом случае. Использование составного ресурса быстрее, хотя, поскольку оно предназначалось для оптимизации. Он использует меньше бара, потому что вы уменьшаете 3 вида на 1, и это быстрее, потому что вы теряете 1 глубину.
Если бы я был вами, я бы подумал о том, чтобы вернуться, чтобы увидеть, как и текст, и изображение, перехватывающие прикосновение, чтобы сделать любое действие, возможно, хорошо. В целом, с большей сенсорной областью, легче нажимать. Некоторые пользователи могут быть склонны касаться текста вместо изображения.
Наконец, если вы идете по этому пути слияния 2, вам может потребоваться использовать Button
вместо TextView
. Вы можете стилизовать кнопку, чтобы не иметь вокруг нее прямоугольника. Они называют это безграничной кнопкой. Это приятно, потому что вы получаете визуальную обратную связь, которую вы нажимали на элемент, способный действовать, когда ImageView
или TextView
обычно не действуют.
Как создать кнопки Borderless в Android
Ответ 2
Это очень просто. Допустим, у вас есть возможность рисования по левой стороне вашего TextView 'txtview'. Следующее сделает трюк.
TextView txtview = (TextView) findViewById(R.id.txtview);
txtview.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if(event.getAction() == MotionEvent.ACTION_UP) {
if(event.getRawX() <= txtview.getTotalPaddingLeft()) {
// your action for drawable click event
return true;
}
}
return true;
}
});
Если вы хотите изменить правильное изменение, оператор if:
if(event.getRawX() >= txtview.getRight() - txtview.getTotalPaddingRight())
Аналогично, вы можете сделать это для всех составных чертежей.
txtview.getTotalPaddingTop();
txtview.getTotalPaddingBottom();
Этот вызов метода возвращает все дополнения с этой стороны, включая любые чертежи. Вы можете использовать это даже для TextView, Button и т.д.
Нажмите здесь для справки с сайта разработчика Android.
Ответ 3
@Ответ на Vishnuvathsan почти идеален, но getRaw()
возвращает абсолютную позицию x точки касания. Если текстовое представление расположено не на левом краю представления, вы должны сравнить его с абсолютным положением текстового поля, используя getLocationOnScreen
. Приведенный ниже код является примером для проверки как левого выдвижного крана, так и правого выдвижного крана.
textView.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if(event.getAction() == MotionEvent.ACTION_UP) {
int[] textLocation = new int[2];
textView.getLocationOnScreen(textLocation);
if(event.getRawX() <= textLocation[0] + textView.getTotalPaddingLeft()) {
//Left drawable was tapped.
return true;
}`
if(event.getRawX() >= textLocation[0] + textView.getWidth() - textView.getTotalPaddingRight()){
//Right drawable was tapped.
return true;
}
}
return true;
}
});