web-dev-qa-db-ja.com

TextView複合ドローアブルに対してのみonClickを実装します

左側にドローアブルのあるテキストが必要で、ユーザーが画像(テキストではなく画像のみ)をクリック/タッチしたときにコードを実行したいので、LinearLayoutを使用しましたTextViewおよびImageViewはクリック可能で、onClickイベントを起動します。 XMLパーサーは、これをTextViewcompound drawableに置き換えることを提案しています。これにより、同じものがはるかに少ない行で描画されます[〜#〜] 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>
25
Gianni Costanzi

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

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

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

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

7
Jeremy Edwards

その非常に簡単です。 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開発者サイトからの参照のために ここ をクリックしてください。

40
Vishnuvathsan

@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;
    }
});
5
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; } }
0
Dishant Kawatra