1

私はLinearLayoutを持っていて、ユーザーがそれに触れて指を離したときを確認したいと思います。onTouchリスナーを追加してイベントをチェックすることでこれができると思いました。このlinearLayoutは、多数のボタンを保持します。

私の問題は、リスナーが機能していないことではなく、私が思っていたとおりに機能していないことです。リスナーは、レイアウトだけがタッチされた場合にのみアクティブになります。これは理にかなっていますが、私が望むものではありません。ユーザーがレイアウト内のボタンに触れた場合、レイアウトリスナーは呼び出されないので、呼び出されるようにします。

これが私のコードです:

Javaコード:

    ll = (LinearLayout)findViewById(R.id.CategorySelect_lLayout_noID);
    ll.setOnTouchListener(new OnTouchListener() {

        public boolean onTouch(View v, MotionEvent event) {

            if(event.getAction() == MotionEvent.ACTION_DOWN){
                Toast.makeText(CategorySelect.this, "action DOWN called", Toast.LENGTH_SHORT).show();
                return true;
            } 
            if(event.getAction() == MotionEvent.ACTION_UP){
                Toast.makeText(CategorySelect.this, "action Up called", Toast.LENGTH_SHORT).show();
                return true;
            }
            return false;
        }
    });

私のxml:

  <ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="400dp"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginBottom="40dp"
android:scrollbars="none"
 >

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

        <Button
            android:id="@+id/CategorySelect_b_1"
            style="@style/CustomBLUEButtonTextStyle"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:text="@string/CategorySelect_b_1"
        />

        <Button
            android:id="@+id/CategorySelect_b_2"
            style="@style/CustomBLUEButtonTextStyle"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:text="@string/CategorySelect_b_2" />

        <Button
            android:id="@+id/CategorySelect_b_3"
            style="@style/CustomBLUEButtonTextStyle"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:text="@string/CategorySelect_b_3" />

        <Button
            android:id="@+id/CategorySelect_b_4"
            style="@style/CustomBLUEButtonTextStyle"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:text="@string/CategorySelect_b_4" />

        <Button
            android:id="@+id/CategorySelect_b_5"
            style="@style/CustomBLUEButtonTextStyle"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:text="@string/CategorySelect_b_5" />

        <Button
            android:id="@+id/CategorySelect_b_6"
            style="@style/CustomBLUEButtonTextStyle"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:text="@string/CategorySelect_b_6" />

        <Button
            android:id="@+id/CategorySelect_b_7"
            style="@style/CustomBLUEButtonTextStyle"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:text="@string/CategorySelect_b_7" />
    </LinearLayout>

</ScrollView>

読んでくれてありがとう。

コメントの更新されたコード:

私の活動から膨らんだ私のメインのxmlファイル:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/categoryselect_background"
android:scaleType="fitXY"
 >

<TextView
    android:id="@+id/CategorySelect_tv_chooseacat"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="70dp"
    android:gravity="center"
    android:text="@string/CategorySelect_tv_chooseacat"
    android:textColor="#FF5500"
    android:textSize="34dp"
    android:textStyle="bold" 
    />

<Button
    android:id="@+id/CategorySelect_b_settings"
    android:background="@drawable/menu_settings"
    android:layout_alignParentRight="true"
    android:layout_alignParentTop="true"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_margin="10dp"
     />

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="400dp"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginBottom="40dp"
android:scrollbars="none"
>

    <com.tdubstudios.soundboard.hungergames.ScrollAbleLinearLayout
        android:id="@+id/CategorySelect_lLayout_noID"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        >

        <Button
            android:id="@+id/CategorySelect_b_cato"
            style="@style/CustomBLUEButtonTextStyle"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:text="@string/CategorySelect_b_1"
        />

        <Button
            android:id="@+id/CategorySelect_b_cinna"
            style="@style/CustomBLUEButtonTextStyle"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:text="@string/CategorySelect_b_2" />

        <Button
            android:id="@+id/CategorySelect_b_effie"
            style="@style/CustomBLUEButtonTextStyle"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:text="@string/CategorySelect_b_3" />

        <Button
            android:id="@+id/CategorySelect_b_gale"
            style="@style/CustomBLUEButtonTextStyle"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:text="@string/CategorySelect_b_4" />

        <Button
            android:id="@+id/CategorySelect_b_haymitch"
            style="@style/CustomBLUEButtonTextStyle"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:text="@string/CategorySelect_b_5" />

        <Button
            android:id="@+id/CategorySelect_b_katniss"
            style="@style/CustomBLUEButtonTextStyle"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:text="@string/CategorySelect_b_6" />

        <Button
            android:id="@+id/CategorySelect_b_peeta"
            style="@style/CustomBLUEButtonTextStyle"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:text="@string/CategorySelect_b_7" />
    </com.tdubstudios.soundboard.hungergames.ScrollAbleLinearLayout>

</ScrollView>
</RelativeLayout>

これはScrollAbleLinearLayoutクラスです。

package com.tdubstudios.soundboard.hungergames;

import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.LinearLayout;

public class ScrollAbleLinearLayout extends LinearLayout {


public ScrollAbleLinearLayout(Context context, AttributeSet attrs) {
    super(context, attrs);
}

@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
    requestDisallowInterceptTouchEvent(true); // Tell parents not to use this event
    return false; // Tell children not to use this event
}
}

はい、以前のコードからいくつかの名前が変更されていることはわかっています。これは、作成しているアプリの種類を(検索結果から)非表示にするために変更したためです。しかし、どういうわけか私は長い間気にしないので、それがその背後にある理由です。

ありがとう。

3番目の編集:

だから私は現在使用しています

@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
    //requestDisallowInterceptTouchEvent(true); // Tell parents not to use this event
    if(event.getAction() == MotionEvent.ACTION_DOWN){
        return false;
    } 
    if(event.getAction() == MotionEvent.ACTION_UP){
        return false;
    }


    return true; // Tell children not to use this event
}

そして、それは私が望むように機能しますが、それは実用的ではありません。ボタンのクリックを実際に登録するには、指を左右/上下にまったく動かさないようにする必要があります。それは正確に下と上にある必要があります。onFlingメソッドを追加して、指が動いた距離を追跡しようとしていました。また、移動したピクセル数がx未満の場合は、mainメソッドがfalseを返すようにします。これにより、ボタンが機能しますが、実際にスワイプ/移動した場合は、ボタンをアクティブにする必要はありません。これが私が意味することです:

@Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {

        if (Math.abs(e1.getY() - e2.getY()) > MORE_THAN_X_INT) {
            booleanVar = false;
            return false;
        }else{
          booleanVar = true;
         }
      return false;
   }

次に実行します:

Override
public boolean onInterceptTouchEvent(MotionEvent event) {
    //requestDisallowInterceptTouchEvent(true); // Tell parents not to use this event
    if(event.getAction() == MotionEvent.ACTION_DOWN){
        return false;
    } 
    if(event.getAction() == MotionEvent.ACTION_UP){
        return false;
    }


    return booleanVar; // Tell children not to use this event
}

それはうまくいくと思いますが、LinearLayoutを拡張するためのonFlingメソッドがないため、テストできません。

助言がありますか?

私がtrue/falseを返すのは逆方向である可能性があることに注意してください、それが私を混乱させるようなものかどうかはわかりません。しかし、誰かがそのonFlingメソッドを作成する方法で私を導くことができれば、私はそれをいじって正しい値を取得することができます。


私は持っています

@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
    //requestDisallowInterceptTouchEvent(true); // Tell parents not to use this event
    while(event.getAction() == MotionEvent.ACTION_DOWN){
        return true;
    } 
    while(event.getAction() == MotionEvent.ACTION_UP){
        return true;
    }


    return false; // Tell children not to use this event
}

そして私のボタンは決してクリック可能ではありません。しかし、ontouchリスナーは完璧に機能しますhaha:|

4

2 に答える 2

4

タッチイベントをキャッチするために拡張LinearLayoutして使用onInterceptTouchEventし、次に戻っtrueてその子にイベントを受け取らないようにすることをお勧めします。

このようなもの:

public class MyLinearLayout extends LinearLayout {
    public MyLinearLayout(Context context) {
        super(context);
    }
    public MyLinearLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
    public MyLinearLayout(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }
    @Override
    public boolean onInterceptTouchEvent(MotionEvent event) {
        return true; // Tell children not to use this event
    }
}

次に、XMLで。に変更LinearLayoutcom.yourpackagename.MyLinearLayoutます。

補遺:との両方でイベントButtonを受信する場合は、を次のように変更できます。LinearLayoutonInterceptTouchEvent

@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
    // Whatever touch event code you want, using the "event" variable
    return false; // Allow children to use the event
}
于 2012-06-16T01:17:28.170 に答える
0

ですから、私の質問に対する答えは実際には見つかりませんでしたが、うまくいく方法を見つけました。リスナーをレイアウトに配置する代わりに、特定のビューではなく、アクティビティ全体にonTouchEventメソッドを追加するだけです。

@Override
public boolean onTouchEvent(MotionEvent event) {
    if(event.getAction() == MotionEvent.ACTION_DOWN){
        Toast.makeText(CategorySelect.this, "action DOWN called", Toast.LENGTH_SHORT).show();
    } 
    if(event.getAction() == MotionEvent.ACTION_UP){
        Toast.makeText(CategorySelect.this, "action Up called", Toast.LENGTH_SHORT).show();
    }
    return super.onTouchEvent(event);
}

どのボタンにも影響しないので、まさに私が欲しかったものです。私と一緒に働いてくれてありがとうSoxxeh。

于 2012-06-16T02:52:31.163 に答える