TextViewの子が小さいカスタムLinearLayoutがあります。 TextViewでカバーされていない領域をクリックできるようにしたいので、clickable = trueとonclicklistenerをLinearLayoutに設定しますが、onClickはトリガーされません。 TextViewでonclickリスナーを設定すると、期待どおりに動作します...
誰でも助けることができますか?
ar_item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:id="@+id/ar_item" Android:layout_width="202dp"
Android:layout_height="62dp" Android:background="@drawable/bg_item_ar"
Android:clickable="true">
<TextView Android:id="@+id/ar_item_txt"
Android:layout_width="164dp" Android:layout_height="fill_parent"
Android:paddingBottom="8dp" Android:paddingLeft="8dp"
Android:paddingTop="8dp" Android:paddingRight="6dp" Android:gravity="center"
Android:background="#50000000" />
</LinearLayout>
私のカスタムLinearLayout
public class ARView extends LinearLayout
{
public ARView(final Context context, String name, String id)
{
super(context);
getLayoutInflater().inflate(R.layout.ar_item, this ,true);
LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
inflater.inflate(R.layout.ar_item, null);
TextView textView = (TextView) findViewById(R.id.ar_item_txt);
textView.setText(name);
setOnClickListener(new View.OnClickListener()
{
public void onClick(View v)
{
Toast t = Toast.makeText(context, "hey!", Toast.LENGTH_SHORT);
t.show();
}
});
}
}
すべての子供のために
Android:duplicateParentState = "true"
Android:duplicateParentState="true"
は私を助けませんでした。
レイアウトを子でクリック可能にするには、すべてのchildにこのオプションを追加する必要があります。
Android:clickable="false"
次に、クリック処理が行われますup to parent。
これはあなたの場合ではありませんが、クリック可能なViewGroup
で同様の問題がありました。解決策を探して1時間後、onClick()
リスナーをブロックしていたTextView
内でAndroid:inputType
をViewGroup
に設定していることがわかりました(理由はわかりません)
TextViewで
Android:inputType
を使用しないでください
親のLinearLayoutをAndroid:clickable = "true"にします
子ビューのすべてを作成しますAndroid:clickable = "false"
Linearlayoutの下-TextViewからAndroid:inputType = ""を削除
カスタムビューを使用していません。標準のLinearLayoutを使用しています。 XMLタグは次のとおりです。
<com.yourcode.ARView ...> ... </com.yourcode.ARView>
Android:duplicateParentState="true"
私はTextViewを無効にしたように見え、クリックイベントを受信できません。
必要なのはTextViewclickable="false"
。したがって、クリックイベントは親レイアウトにディスパッチされ、TextViewは引き続きタッチイベントに反応することができます(リップル効果があります)。
TextViewの高さは親全体(レイアウト全体)をカバーするため、レイアウトではなく空のスペースをクリックする場合があります。 TextViewにAndroid:layout_heightのwrap_contentを使用してみてください。レイアウトのクリックリスナーも設定します。
確認する必要があるのは、クリックしようとしているビューの上に別のビューがないことです。これは、FrameLayouts(サブLinearLayoutがカバーされている場合)または相対レイアウトでこの行を更新するのを忘れている可能性がある場合に特に一般的です。
Android:layout_below="@id/shouldBeTheIdOfTheViewCurrentlyBeingCovered"
ビューが同じスペースを埋めないようにします。
Linearlayoutに次の属性を追加します。子ビューで処理されないClickイベントは、自動的にLinearLayoutに渡されます。
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
...
Android:focusable="true"
Android:clickable="true">
<child/>
<child/>
</LinearLayout>
私は同じ問題に直面し、すべてのXML属性が機能しませんでした。これは、プログラムでビューを膨らませて追加したために起こると思います。私にとっての修正は、プログラム的にもクリック不可能な膨張したルートビューを設定することでした:
View view = layoutInflater.inflate(R.layout.some_layout, someLinearLayout, false);
view.setClickable(false);
(はい、私はsome_layout
XMLではクリックできません。)
LinearLayoutの変数を作成します
LinearLayout layout;
layout.setOnClicknersetOnClickListener(new View.OnClickListener()
{
public void onClick(View v)
{
Toast t = Toast.makeText(context, "hey!", Toast.LENGTH_SHORT);
t.show();
}
});
問題は、Android:layout_height="fill_parent"
そのレイアウト。それでも問題が解決しない場合は、onClick()イベントが問題である可能性があります。線形レイアウトは、レイアウトであるため、実際にonClick()を呼び出すことはありません。代わりにonTouch()イベントリスナーをオーバーライドしてください。
上記の解決策のどれも私にとって分岐しませんでした。 LinkMovementMethod
内でTextView
がLinearLayout
に設定されていることに気付きました。このクラスは、タッチイベント、クリックイベント、およびクリック可能、フォーカス可能などのTextView
のプロパティをインターセプトします。
問題のビューがTextView
sの場合、テキストビューに焦点を合わせて最初のクリックが使用されないように、focusable="false"
として設定する必要がある場合があります。
私は同じ問題に直面し、すべてのXML属性が機能しませんでした。私はプログラムでビューを膨らませて追加するため、これが起こるかどうかはわかりませんが、これは私が問題を回避した方法です。
TextViewとImageViewでLinearLayoutを拡張するクラスがあります。レイアウトを拡張してビューを取得した後、子ビューにOnClickListenerを割り当て、押されるとLineaLayoutのonClickListnerを実行します。
public class MyView extends LinearLayout {
private OnClickListener clickListener;
ImageView imageView;
TextView textView;
@Override
public void setOnClickListener(@Nullable OnClickListener l) {
super.setOnClickListener(l);
clickListener = l;
}
void afterViews() {
imageView.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
clickListener.onClick(MyView.this);
return false;
}
});
textView.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
clickListener.onClick(MyView.this);
return false;
}
});
}
また、OnTouchListenerをオーバーライドしようとしましたが、子ビューに必要なリップル効果がありませんでした。