私は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:|