リストビューでマルチタッチをテストしようとすると、Android 3.2 でクラッシュが発生しました。ListView と 20 行未満の Java コードのみを含む単純なレイアウトで例外を再現できます。この問題に関する誰のアドバイスも大歓迎です。
私がやろうとしていること:
ListView のスクロールの邪魔にならないようにドラッグで ListView 上の多くのアイテムを確認できるようにしたいので、ユーザーは 1 本の指で ListView をスクロールし、2 本の指でクリック アンド ドラッグしてアイテムを選択することになると考えました。彼らは上に移動します。当然、マルチタッチ イベントを処理するために、ListView の onTouchListener を設定することにしました。
問題: 1 本の指でのスクロールは完全に機能します。しかし、2 本の指で触れてから持ち上げると、アプリが (時々) すぐにクラッシュします。場合によっては、70% の確率で発生することもあります。これは、指が 2 本から 0 本になることに関係していると私は信じています。クラッシュは私が所有するコードにもありませんが、代わりに ListView 自体によって呼び出される MotionEvent のネイティブ メソッドにあります (ページが乱雑にならないように完全なスタック トレースのペーストビン)。
コード: これは、問題を引き起こすために私が書いたものです。
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) をターゲットにしています。テストする別のタブレットがなく、マルチタッチがサポートされていないため、通常の開発用仮想マシンを使用できません。
ゲッターを呼び出して、値に関係なく false または true を返すと、クラッシュしません。タッチするとListViewがクリックイベントを取得し、リスナーが呼び出されると、2本の指を含むイベントを消費し始めるという事実に関係していると考えています。次に、両方の指を同時に離すと、完了したことを示すイベントが ListView を通過しないため、選択した項目のポインター インデックスを見つけることができると期待されます。
だから私の質問は、「私が書いたものは、ListView が持っているある種の契約を破ったのですか?」です。このテストを別の方法で行う必要がありますか?
また、誰かが API レベル 13 のソースを教えてくれたら、とてもありがたいです。Android SDK マネージャー (14 ~ 16 のみ) からアクセスすることはできません。それがあれば、問題の根本を理解できる可能性が高くなります。