Подтвердить что ты не робот

Внедрить 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>
4b9b3361

Ответ 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;
    }
});