左側にドローアブルのあるテキストが必要で、ユーザーが画像(テキストではなく画像のみ)をクリック/タッチしたときにコードを実行したいので、LinearLayoutを使用しましたTextViewおよびImageViewはクリック可能で、onClickイベントを起動します。 XMLパーサーは、これをTextViewをcompound 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>
どちらにでも行くことができます。ただし、最適化を目的としていたため、複合ドローアブルの使用は高速です。 3つのビューを1つに減らすため、RAMの使用量が少なくなり、1つの深度が失われるため、レイアウトが高速になります。
もし私があなたなら、テキストと画像の両方がタッチをインターセプトして何かのアクションを実行することがおそらく良いことであるかどうかを確認するために一歩下がることを検討したいと思います。一般に、タッチ領域が大きいほど、押しやすくなります。一部のユーザーは、実際には画像ではなくテキストに触れたいと思うかもしれません。
最後に、2つをマージするルートを使用する場合は、Button
の代わりにTextView
を使用することを検討してください。ボタンの周りに長方形がないようにボタンのスタイルを設定できます。彼らはそれをボーダレスボタンと呼んでいます。 ImageView
またはTextView
は通常はアクション可能ではないのに、アクション可能なアイテムをクリックしたという視覚的なフィードバックが得られるので、それは素晴らしいことです。
その非常に簡単です。 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開発者サイトからの参照のために ここ をクリックしてください。
@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;
}
});
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; } }