Вопрос по android, android-layout – Реализуйте onClick только для составного объекта TextView.

25

У меня должен быть текст с отрисовкой слева, и я хочу выполнить код, когда пользователь нажимает / касается изображения (только изображение, а не текст), поэтому я использовалLinearLayout сTextView иImageView который кликабелен и запускает событие onClick. Анализатор XML предлагает мне заменить этоTextView сcompound drawableчто бы нарисовать то же самое с гораздо меньшим количеством линийXML.. Мой вопрос & quot; могу ли я указать, что я хочу обработать событие 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>

Ваш Ответ

3   ответа
35

у вас есть отрисовка на левой стороне вашего TextView & lt; txtview & reg ;. Следующий сделает свое дело.

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();

Этот вызов метода возвращает все отступы на этой стороне, включая любые drawables. Вы можете использовать это даже для TextView, Button и т. Д.

НажмитеВот для справки с сайта разработчика Android.

Кажется, безопаснее просто использовать оригинальный макет ...
4

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;
    }
});
7

оисходит быстрее, потому что она была предназначена для оптимизации. Он использует меньше оперативной памяти, потому что вы уменьшаете 3 вида до 1, и это более быстрый макет, потому что вы теряете 1 глубину.

Если бы я был вами, я бы подумал о том, чтобы вернуться назад, чтобы увидеть, является ли текст и изображение, перехватывающие прикосновение, для выполнения каких-либо действий полезными. Как правило, наличие большей сенсорной области облегчает нажатие. Некоторые пользователи могут быть склонны касаться текста вместо изображения.

Наконец, если вы идете по этому пути слияния 2, вы можете рассмотреть возможность использованияButton вместоTextView, Вы можете стилизовать кнопку так, чтобы вокруг нее не было прямоугольника. Они называют это кнопкой без границ. Это хорошо, потому что вы получаете визуальную обратную связь, когда вы нажимаете на элемент, который можноImageView или жеTextView обычно не действуют.

Как создать кнопки без полей в Android

Похожие вопросы