0

在尝试使用列表视图测试多点触控时,我在 Android 3.2 中遇到了崩溃。我可以使用仅包含 ListView 和不到 20 行 Java 代码的简单布局来重现异常。任何人对此事的建议将不胜感激。

我正在尝试做的事情:

我希望用户能够通过拖动来检查 ListView 上的许多项目,而不会妨碍滚动 ListView,所以我认为用户会用一根手指滚动 ListView,然后用两根手指单击并拖动以选择项目他们搬过去。自然地,我决定为我的 ListView 设置一个 onTouchListener 以处理多点触控事件。

问题: 用一根手指滚动效果很好。但是当我用两根手指触摸然后抬起时,我的应用程序(有时)会立即崩溃。有时意味着大约 70% 的时间,这让我相信这与从 2 根手指到 0 根手指有关。崩溃甚至不在我拥有的任何代码中,而是在由 ListView 本身调用的 MotionEvent 中的本机方法中(完整堆栈跟踪的 pastebin 以便我不会弄乱页面)。

代码: 这是我为了引起问题而写的。

MainActivity.java

public class MainActivity extends Activity {
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ListView lv = ((ListView) findViewById(R.id.listView1));

        String[] list = new String[]{"a", "b", "c", "d", "e", "f", "g"};

        lv.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, list));
        lv.setOnTouchListener(new OnTouchListener() {
            public boolean onTouch(View v, MotionEvent event) {
                if (event.getPointerCount() != 2) {
                    return false;
                }
                return true;
            }
        });
    }
}

activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <ListView
        android:id="@+id/listView1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true" >

    </ListView>

</RelativeLayout>

就是这样。我在运行 Android 3.2.1 的 Thrive 上运行我的程序,我的项目针对 API 级别 13 (3.2)。我没有另一台平板电脑可以测试它,也无法使用我的普通开发虚拟机,因为没有多点触控支持。

如果我调用 getter 并返回 false 或 true,无论它的值如何,它都不会崩溃。我认为这与 ListView 在我进行触摸时获得点击事件有关,然后当我的侦听器被调用时,它开始消耗任何包含两个手指的事件。然后,当我同时抬起两根手指时,没有任何事件通过 ListView 表示它已完成,因此它仍然希望能够找到所选项目的指针索引。

所以我的问题是“我写的东西是否违反了 ListView 的某种合同?” 我应该以其他方式进行此测试吗?

另外,如果有人能指出 API 级别 13 的来源,我将不胜感激。它无法通过 Android SDK 管理器访问(只有 14-16 个),如果我拥有它,我更有可能了解问题的根源。

4

0 回答 0