在尝试使用列表视图测试多点触控时,我在 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 个),如果我拥有它,我更有可能了解问题的根源。