Android:更改投掷手势事件的选项卡-不适用于TabActivity中的ListActivity

Android:更改投掷手势事件的选项卡-不适用于TabActivity中的ListActivity,android,listactivity,gesture,tabactivity,Android,Listactivity,Gesture,Tabactivity,我有一个包含三个选项卡的选项卡活动。其中一个选项卡包含ListActivity,另外两个选项卡包含简单活动。我已经实现了OnTestureListener来更改fling事件的选项卡 对于具有ListActivity的选项卡,未调用onTouchEvent和“onFling”事件。但是对于简单的活动(没有列表)来说效果很好 这是我的密码: 主要活动类别: public class GestureTest extends TabActivity implements OnGestureListen

我有一个包含三个选项卡的选项卡活动。其中一个选项卡包含ListActivity,另外两个选项卡包含简单活动。我已经实现了OnTestureListener来更改fling事件的选项卡

对于具有ListActivity的选项卡,未调用
onTouchEvent
和“onFling”事件。但是对于简单的活动(没有列表)来说效果很好

这是我的密码:

主要活动类别:

public class GestureTest extends TabActivity implements OnGestureListener {
    private TabHost tabHost;
    private GestureDetector gestureScanner;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.testmainlayoutforgesture);
        gestureScanner = new GestureDetector(this);
        addTabs();
    }

    private void addTabs() {
        Intent i1 = new Intent().setClass(this, SimpleListActivity.class);
        Intent i2 = new Intent().setClass(this, SimpleActivity.class);
        Intent i3 = new Intent().setClass(this, SimpleActivity.class);

        tabHost = getTabHost();
        tabHost.addTab(tabHost.newTabSpec("First").setIndicator("First").setContent(i1));
        tabHost.addTab(tabHost.newTabSpec("Second").setIndicator("Second").setContent(i2));
        tabHost.addTab(tabHost.newTabSpec("Third").setIndicator("Third").setContent(i3));

        tabHost.setCurrentTab(0);
    }

    @Override
    public boolean onTouchEvent(MotionEvent me) {
        return gestureScanner.onTouchEvent(me);
    }

    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
        float dispX = e2.getX() - e1.getX();
        float dispY = e2.getY() - e1.getY();
        if (Math.abs(dispX) >= 200 && Math.abs(dispY) <= 100) {
            // swipe ok
            if (dispX > 0) {
                // L-R swipe
                System.out.println("L-R swipe");
                changeLtoR();
            } else {
                // R-L swipe
                System.out.println("R-L swipe");
            }
        }
        return true;
    }

    private void changeLtoR() {
        int curTab = tabHost.getCurrentTab();
        int nextTab = ((curTab + 1) % 3);
        tabHost.setCurrentTab(nextTab);

    }
//other interface methods    
}
public class SimpleListActivity extends ListActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        List<String> list1Strings = new ArrayList<String>();
        list1Strings.add("List 11");
        list1Strings.add("List 12");
        list1Strings.add("List 13");
        list1Strings.add("List 14");
        setListAdapter(new ArrayAdapter(this, android.R.layout.simple_list_item_1, list1Strings));
    }
}
public class SimpleActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.simplelayouttest);
    }
}
<?xml version="1.0" encoding="utf-8"?>
<TabHost
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/tabhost"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <LinearLayout
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">
        <TabWidget
            android:id="@android:id/tabs"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content" />
        <FrameLayout
            android:id="@android:id/tabcontent"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent">
        </FrameLayout>
    </LinearLayout>
</TabHost>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <TextView
        android:id="@+id/helloTv"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="Hello Hello" />
</LinearLayout>
testmainlayoutforgesture.xml布局:

public class GestureTest extends TabActivity implements OnGestureListener {
    private TabHost tabHost;
    private GestureDetector gestureScanner;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.testmainlayoutforgesture);
        gestureScanner = new GestureDetector(this);
        addTabs();
    }

    private void addTabs() {
        Intent i1 = new Intent().setClass(this, SimpleListActivity.class);
        Intent i2 = new Intent().setClass(this, SimpleActivity.class);
        Intent i3 = new Intent().setClass(this, SimpleActivity.class);

        tabHost = getTabHost();
        tabHost.addTab(tabHost.newTabSpec("First").setIndicator("First").setContent(i1));
        tabHost.addTab(tabHost.newTabSpec("Second").setIndicator("Second").setContent(i2));
        tabHost.addTab(tabHost.newTabSpec("Third").setIndicator("Third").setContent(i3));

        tabHost.setCurrentTab(0);
    }

    @Override
    public boolean onTouchEvent(MotionEvent me) {
        return gestureScanner.onTouchEvent(me);
    }

    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
        float dispX = e2.getX() - e1.getX();
        float dispY = e2.getY() - e1.getY();
        if (Math.abs(dispX) >= 200 && Math.abs(dispY) <= 100) {
            // swipe ok
            if (dispX > 0) {
                // L-R swipe
                System.out.println("L-R swipe");
                changeLtoR();
            } else {
                // R-L swipe
                System.out.println("R-L swipe");
            }
        }
        return true;
    }

    private void changeLtoR() {
        int curTab = tabHost.getCurrentTab();
        int nextTab = ((curTab + 1) % 3);
        tabHost.setCurrentTab(nextTab);

    }
//other interface methods    
}
public class SimpleListActivity extends ListActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        List<String> list1Strings = new ArrayList<String>();
        list1Strings.add("List 11");
        list1Strings.add("List 12");
        list1Strings.add("List 13");
        list1Strings.add("List 14");
        setListAdapter(new ArrayAdapter(this, android.R.layout.simple_list_item_1, list1Strings));
    }
}
public class SimpleActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.simplelayouttest);
    }
}
<?xml version="1.0" encoding="utf-8"?>
<TabHost
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/tabhost"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <LinearLayout
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">
        <TabWidget
            android:id="@android:id/tabs"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content" />
        <FrameLayout
            android:id="@android:id/tabcontent"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent">
        </FrameLayout>
    </LinearLayout>
</TabHost>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <TextView
        android:id="@+id/helloTv"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="Hello Hello" />
</LinearLayout>

simplelayouttest.xml布局:

public class GestureTest extends TabActivity implements OnGestureListener {
    private TabHost tabHost;
    private GestureDetector gestureScanner;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.testmainlayoutforgesture);
        gestureScanner = new GestureDetector(this);
        addTabs();
    }

    private void addTabs() {
        Intent i1 = new Intent().setClass(this, SimpleListActivity.class);
        Intent i2 = new Intent().setClass(this, SimpleActivity.class);
        Intent i3 = new Intent().setClass(this, SimpleActivity.class);

        tabHost = getTabHost();
        tabHost.addTab(tabHost.newTabSpec("First").setIndicator("First").setContent(i1));
        tabHost.addTab(tabHost.newTabSpec("Second").setIndicator("Second").setContent(i2));
        tabHost.addTab(tabHost.newTabSpec("Third").setIndicator("Third").setContent(i3));

        tabHost.setCurrentTab(0);
    }

    @Override
    public boolean onTouchEvent(MotionEvent me) {
        return gestureScanner.onTouchEvent(me);
    }

    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
        float dispX = e2.getX() - e1.getX();
        float dispY = e2.getY() - e1.getY();
        if (Math.abs(dispX) >= 200 && Math.abs(dispY) <= 100) {
            // swipe ok
            if (dispX > 0) {
                // L-R swipe
                System.out.println("L-R swipe");
                changeLtoR();
            } else {
                // R-L swipe
                System.out.println("R-L swipe");
            }
        }
        return true;
    }

    private void changeLtoR() {
        int curTab = tabHost.getCurrentTab();
        int nextTab = ((curTab + 1) % 3);
        tabHost.setCurrentTab(nextTab);

    }
//other interface methods    
}
public class SimpleListActivity extends ListActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        List<String> list1Strings = new ArrayList<String>();
        list1Strings.add("List 11");
        list1Strings.add("List 12");
        list1Strings.add("List 13");
        list1Strings.add("List 14");
        setListAdapter(new ArrayAdapter(this, android.R.layout.simple_list_item_1, list1Strings));
    }
}
public class SimpleActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.simplelayouttest);
    }
}
<?xml version="1.0" encoding="utf-8"?>
<TabHost
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/tabhost"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <LinearLayout
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">
        <TabWidget
            android:id="@android:id/tabs"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content" />
        <FrameLayout
            android:id="@android:id/tabcontent"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent">
        </FrameLayout>
    </LinearLayout>
</TabHost>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <TextView
        android:id="@+id/helloTv"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="Hello Hello" />
</LinearLayout>


我想不出这里出了什么问题。

尝试将此添加到您的活动:

@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
    if (gestureScanner != null) {
        if (gestureScanner.onTouchEvent(ev))
            return true;
    }
    return super.dispatchTouchEvent(ev);
}
实现此功能将告诉您的设备gestureScanner已使用onFling事件

再次编辑:

public class GestureTest extends TabActivity implements OnGestureListener {
    private TabHost tabHost;
    private GestureDetector gestureScanner;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.testmainlayoutforgesture);
        gestureScanner = new GestureDetector(this);
        addTabs();
    }

    private void addTabs() {
        Intent i1 = new Intent().setClass(this, SimpleListActivity.class);
        Intent i2 = new Intent().setClass(this, SimpleActivity.class);
        Intent i3 = new Intent().setClass(this, SimpleActivity.class);

        tabHost = getTabHost();
        tabHost.addTab(tabHost.newTabSpec("First").setIndicator("First").setContent(i1));
        tabHost.addTab(tabHost.newTabSpec("Second").setIndicator("Second").setContent(i2));
        tabHost.addTab(tabHost.newTabSpec("Third").setIndicator("Third").setContent(i3));

        tabHost.setCurrentTab(0);
    }

    @Override
    public boolean onTouchEvent(MotionEvent me) {
        return gestureScanner.onTouchEvent(me);
    }

    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
        float dispX = e2.getX() - e1.getX();
        float dispY = e2.getY() - e1.getY();
        if (Math.abs(dispX) >= 200 && Math.abs(dispY) <= 100) {
            // swipe ok
            if (dispX > 0) {
                // L-R swipe
                System.out.println("L-R swipe");
                changeLtoR();
            } else {
                // R-L swipe
                System.out.println("R-L swipe");
            }
        }
        return true;
    }

    private void changeLtoR() {
        int curTab = tabHost.getCurrentTab();
        int nextTab = ((curTab + 1) % 3);
        tabHost.setCurrentTab(nextTab);

    }
//other interface methods    
}
public class SimpleListActivity extends ListActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        List<String> list1Strings = new ArrayList<String>();
        list1Strings.add("List 11");
        list1Strings.add("List 12");
        list1Strings.add("List 13");
        list1Strings.add("List 14");
        setListAdapter(new ArrayAdapter(this, android.R.layout.simple_list_item_1, list1Strings));
    }
}
public class SimpleActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.simplelayouttest);
    }
}
<?xml version="1.0" encoding="utf-8"?>
<TabHost
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/tabhost"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <LinearLayout
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">
        <TabWidget
            android:id="@android:id/tabs"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content" />
        <FrameLayout
            android:id="@android:id/tabcontent"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent">
        </FrameLayout>
    </LinearLayout>
</TabHost>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <TextView
        android:id="@+id/helloTv"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="Hello Hello" />
</LinearLayout>
您还需要将onFling方法更改为:

    private static final int SWIPE_MIN_DISTANCE = 120;
    private static final int SWIPE_MAX_OFF_PATH = 250;
    private static final int SWIPE_THRESHOLD_VELOCITY = 200;

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

        // Check movement along the Y-axis. If it exceeds SWIPE_MAX_OFF_PATH, then dismiss the swipe.
        if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH)
            return false;

        // Swipe from right to left.
        // The swipe needs to exceed a certain distance (SWIPE_MIN_DISTANCE) and a certain velocity (SWIPE_THRESHOLD_VELOCITY).
        if (e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE
                && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
            // do stuff
            return true;
        }

        // Swipe from left to right.
        // The swipe needs to exceed a certain distance (SWIPE_MIN_DISTANCE) and a certain velocity (SWIPE_THRESHOLD_VELOCITY).
        if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE
                && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
            // do stuff
            return true;
        }

        return false;
    }
}    

另一种可能是,如果您的ListView没有填满屏幕,并且“空”空间不可单击,并且您在这个“空”空间上乱扔,则触摸事件将不会被注册和发送。如果你在ListView的顶部猛掷,它能工作吗?

谢谢,它能工作。我无法理解你的“另一种可能性”。是的,如果我在我的应用程序的标题(显示应用程序名称的部分)上掷骰子,我的原始代码正在处理掷骰子事件,但我发现这种方法存在另一个问题。所有物品都不可触摸。我的意思是,我不能选择(触摸)列表项和选项卡。你能在这里发布解决方案吗?我刚刚添加了你的代码。投掷姿势做得很好。但是还有一个问题,我理解这一点,我相信没有一个项目是可触摸的,原因是onFling方法可能会消耗所有的touchevents。