web-dev-qa-db-ja.com

onClickが子を持つLinearLayoutでトリガーされない

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();
            }
        });
    }
}
56
jul

すべての子供のために

Android:duplicateParentState = "true"

57
Blackbelt

Android:duplicateParentState="true"は私を助けませんでした。

レイアウトを子でクリック可能にするには、すべてのchildにこのオプションを追加する必要があります。

 Android:clickable="false"

次に、クリック処理が行われますup to parent

93
Yurets

これはあなたの場合ではありませんが、クリック可能なViewGroupで同様の問題がありました。解決策を探して1時間後、onClick()リスナーをブロックしていたTextView内でAndroid:inputTypeViewGroupに設定していることがわかりました(理由はわかりません)

TextViewでAndroid:inputTypeを使用しないでください

20
elementstyle

親のLinearLayoutをAndroid:clickable = "true"にします

子ビューのすべてを作成しますAndroid:clickable = "false"

Linearlayoutの下-TextViewからAndroid:inputType = ""を削除

2

カスタムビューを使用していません。標準のLinearLayoutを使用しています。 XMLタグは次のとおりです。

<com.yourcode.ARView ...> ... </com.yourcode.ARView>
2
cdhabecker

Android:duplicateParentState="true"私はTextViewを無効にしたように見え、クリックイベントを受信できません。

必要なのはTextViewclickable="false"。したがって、クリックイベントは親レイアウトにディスパッチされ、TextViewは引き続きタッチイベントに反応することができます(リップル効果があります)。

2
nhoxbypass

TextViewの高さは親全体(レイアウト全体)をカバーするため、レイアウトではなく空のスペースをクリックする場合があります。 TextViewにAndroid:layout_heightのwrap_contentを使用してみてください。レイアウトのクリックリスナーも設定します。

2

確認する必要があるのは、クリックしようとしているビューの上に別のビューがないことです。これは、FrameLayouts(サブLinearLayoutがカバーされている場合)または相対レイアウトでこの行を更新するのを忘れている可能性がある場合に特に一般的です。

Android:layout_below="@id/shouldBeTheIdOfTheViewCurrentlyBeingCovered"

ビューが同じスペースを埋めないようにします。

1
ColossalChris

Linearlayoutに次の属性を追加します。子ビューで処理されないClickイベントは、自動的にLinearLayoutに渡されます。

<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    ...
    Android:focusable="true"
    Android:clickable="true">

<child/>
<child/>

</LinearLayout>
0
Sanket Berde

私は同じ問題に直面し、すべてのXML属性が機能しませんでした。これは、プログラムでビューを膨らませて追加したために起こると思います。私にとっての修正は、プログラム的にもクリック不可能な膨張したルートビューを設定することでした:

View view = layoutInflater.inflate(R.layout.some_layout, someLinearLayout, false);
view.setClickable(false);

(はい、私はsome_layout XMLではクリックできません。)

0
Roy Solberg

LinearLayoutの変数を作成します

LinearLayout layout;
layout.setOnClicknersetOnClickListener(new View.OnClickListener()
        {
            public void onClick(View v)
            {                   
                Toast t = Toast.makeText(context, "hey!", Toast.LENGTH_SHORT);
                t.show();
            }
        });
0
AZIM MOHAMAD

問題は、Android:layout_height="fill_parent"そのレイアウト。それでも問題が解決しない場合は、onClick()イベントが問題である可能性があります。線形レイアウトは、レイアウトであるため、実際にonClick()を呼び出すことはありません。代わりにonTouch()イベントリスナーをオーバーライドしてください。

0
A. Abiri

上記の解決策のどれも私にとって分岐しませんでした。 LinkMovementMethod内でTextViewLinearLayoutに設定されていることに気付きました。このクラスは、タッチイベント、クリックイベント、およびクリック可能、フォーカス可能などのTextViewのプロパティをインターセプトします。

0
savepopulation

問題のビューがTextViewsの場合、テキストビューに焦点を合わせて最初のクリックが使用されないように、focusable="false"として設定する必要がある場合があります。

0
CorayThan

私は同じ問題に直面し、すべての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をオーバーライドしようとしましたが、子ビューに必要なリップル効果がありませんでした。

0
Gilles Braun