0

これは私のxmlファイルであり、ご覧のとおり、線形レイアウトによって何度もネストされています。


達成したいのは、llOptionA(First Linear Layout)の領域をクリックすると、トーストで通知されます。


llOptionA.setonclickListener()にも乾杯しましたが、テキストをクリックしても何も起こりません。

次に、それぞれにonclicklistenersを設定して、異なるトーストを表示します-> svTest、layout_inner、tvOptionA。また、どこでもクリックして、どの部分がどのトーストを示しているかを確認しました。

     <LinearLayout
            android:id="@+id/llOptionA"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:background="#ff00ff"
            android:paddingLeft="30dp"
            android:paddingRight="30dp"
            android:paddingTop="5dp" >

            <HorizontalScrollView
                android:id="@+id/svTest"
                android:layout_width="fill_parent"
                android:layout_height="fill_parent" >

                <LinearLayout
                    android:id="@+id/layout_inner"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:orientation="vertical" >

                    <TextView
                        android:id="@+id/tvOptionA"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:maxLines="1"
                        android:text="A - Option A "
                        android:textAppearance="?android:attr/textAppearanceMedium"
                        android:textColor="#ffffff"
                        android:textStyle="bold" />
                </LinearLayout>
            </HorizontalScrollView>
        </LinearLayout>
4

1 に答える 1

4

まず、LinearLayoutは、OnClickListenerを設定した場合でも、デフォルトではクリックイベントをリッスンしません。また、この属性をLinearLayoutに追加する必要がありますllOptionA

android:clickable="true"

次に、クリックは最高レベルのTextViewから始まりtvOptionA、ビューがこのイベントを消費するまでずっと下に移動します。したがって、Horizo​​ntalScrollViewに到達llOptionAする前に、デフォルトのOnTouchListenerでクリックをインターセプトし、それをに渡しませんllOptionA...Horizo​​ntalScrollViewのOnTouchListenerでクリックイベントをリッスンして、適切なメソッドを呼び出すことができます。

3番目に、これは単純化されたレイアウトですが、LinearLayoutlayout_innerには子が1つしかないため、必要ないため、次のように使用できます。

<LinearLayout ...>
    <HorizontalScrollView ...>
        <TextView .../>
    </HorizontalScrollView>
</LinearLayout>

もちろんllOptionA、子は1つしかないため、さらに単純化できます。

<HorizontalScrollView ...>
    <TextView .../>
</HorizontalScrollView>

コメントからの追加

すべてをまとめる方法は次のとおりです。

public class Example extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        LinearLayout linearLayout = (LinearLayout) findViewById(R.id.llOptionA);
        linearLayout.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                toast();
            }
        });

        HorizontalScrollView hsv = (HorizontalScrollView) findViewById(R.id.svTest);
        hsv.setOnTouchListener(new OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                if(event.getAction() == MotionEvent.ACTION_UP)
                    toast();
                return false;
            }
        });
    }

    public void toast() {
        Toast.makeText(this, "Click", Toast.LENGTH_SHORT).show();
    }
}
于 2012-08-27T19:48:44.967 に答える