28

左側にドローアブルのあるテキストが必要で、ユーザーが画像(テキストではなく画像のみ)をクリック/タッチしたときにコードを実行したいので、TextViewImageViewLinearLayoutを使用しました。クリック可能で、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>
4

5 に答える 5

45

その非常に簡単です。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などにも使用できます。

アンドロイド開発者サイトからの参照のためにここをクリックしてください。

于 2015-03-23T15:23:44.870 に答える
8

どちらにでも行くことができます。ただし、最適化を目的としていたため、複合ドローアブルを使用すると高速になります。3つのビューを1つに減らすため、RAMの使用量が少なくなり、1つの深度が失われるため、レイアウトが高速になります。

もし私があなただったら、テキストと画像の両方がタッチをインターセプトして何かアクションを実行するのが良いことかどうかを確認するために一歩下がることを検討したいと思います。一般に、タッチ領域を大きくすると、押しやすくなります。一部のユーザーは、実際には画像ではなくテキストに触れる傾向がある場合があります。

最後に、2つをマージするルートを使用する場合は、のButton代わりにを使用することを検討してくださいTextView。ボタンの周りに長方形がないようにボタンのスタイルを設定できます。彼らはそれをフチなしボタンと呼んでいます。ImageViewまたはTextView通常はアクションできないアクション可能なアイテムをクリックしたという視覚的なフィードバックが得られるので便利です。

Androidでボーダレスボタンを作成する方法

于 2012-05-19T17:24:35.547 に答える
6

@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;
    }
});
于 2017-11-27T03:32:14.960 に答える
0
final int DRAWABLE_LEFT = 0;
final int DRAWABLE_TOP = 1;
final int DRAWABLE_RIGHT = 2;
final int DRAWABLE_DOWN = 3;

このクリックリスナーはタッチリスナーに参加しています

 if (event.getAction() == MotionEvent.ACTION_DOWN) 
if (event.getAction() == MotionEvent.ACTION_DOWN) {
            if (event.getX() >= (tvFollow.getTop() - tvFollow.getCompoundDrawables()[DRAWABLE_TOP].getBounds().width())) {
                   // your action here
                return true; } }
于 2019-07-04T12:57:00.203 に答える
0

getRaw()とgetRight()はどちらも画面全体の座標に関して戻るため、ビューが画面の左端にない場合、これは機能しません。以下のソリューションは、レイアウトの位置に関係なく、どこでも使用できます。右側のドローアブルタッチ用です。

  textView.setOnTouchListener(OnTouchListener { _, event ->
                if (event.action == MotionEvent.ACTION_UP)
                {
                    if (event.x >= textView.width - textView.totalPaddingEnd)
                    {
                        <!---DO YOUR ACTIONS HERE--->
                        return@OnTouchListener true
                    }
                }
                true
            })

PS:Kotlinコード

于 2021-12-16T19:32:34.090 に答える