ListView
があり、各アイテムのレイアウトを個別のXMLファイルで定義しました。このファイルには、RatingBar
とEditText
を含めました。
このListView
に7〜8個のアイテムをプログラムで作成しました。それらをスクロールすると、かなりバグがあるようです。ここではいくつかの例を示します。
最初の行のEditText
にフォーカスを設定してから、ListView
を下にスクロールすると、他の行のランダムなEditTexts
にフォーカスがあります。フォーカスされたものが消えた後の次のEditText
がフォーカスを受け取るようです。これは意図的なものかもしれませんが、ユーザーとしては非常に奇妙に思えます。
フォーカスをEditText
に設定し、仮想キーボードを受け取り、何かを入力して、仮想キーボードの[完了]ボタンをクリックすると、仮想キーボードが消えるとすぐにEditText
が空になります。
EditText
をクリックして仮想キーボードを受け取り、文字の入力を開始すると、入力するとすぐに文字が消えてしまうことがあります。
EditText
をクリックすると、仮想キーボードが表示されますが、EditText
はフォーカスを失い、もう一度EditText
をクリックする必要があります。
RatingBar
をfocusable="false"
に設定しましたが、スクロールホイールを動かすと、フォーカスを取得します。
私の問題の1つは、仮想キーボードに文字を入力すると、表示されているすべてのリストアイテムが再描画されることです(また、EditText
のテキストが空のデータに設定されているため、クリアされます。 Androidが、文字を入力するたびにリストを再描画することを決定する理由がわかりません。
これが私がそれらを描くために使っているXMLです。それらは白い泡で、灰色の境界線があり、中にはRatingBar
とEditText
のテキストがあります。
<?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="wrap_content"
Android:paddingTop="10dip"
Android:paddingBottom="10dip"
Android:paddingLeft="15dip"
Android:paddingRight="15dip"
>
<LinearLayout
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:padding="2dip"
Android:background="@drawable/shape_outer">
<LinearLayout
Android:orientation="vertical"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:padding="2dip"
Android:background="@drawable/shape_inner">
<TextView
Android:id="@+id/rating_category"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:textColor="@color/dark_gray"
Android:textStyle="bold"
Android:layout_marginBottom="10dip" />
<RatingBar
Android:id="@+id/rating_rating"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:numStars="5"
Android:rating="0"
Android:stepSize="1"
Android:focusable="false"
Android:clickable="false"
/>
<EditText
Android:id="@+id/rating_text"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:layout_column="1"
Android:padding="6dip"
Android:textColor="#000000"
Android:gravity="left|top"
Android:lines="3"
Android:hint="Comment"
Android:imeOptions="actionDone" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
ListViewsはEditTextsをうまく処理できないようです。私はいくつかの調査を行いましたが、コンセンサスは「それをしないでください」のようです。したがって、私が頼ったのは、LinearLayoutを内部に持つScrollViewである単純なレイアウトファイルを作成することです。 onCreateメソッドで、リストアイテムに使用していたビューを拡張し、LinearLayoutに追加します。また、後で各ビューにデータを保存できるように、ビューをArrayListに追加しています。
これは合理的に聞こえますか?
まあ、これをマニフェストのアクティビティに追加してください...
Android:windowSoftInputMode="adjustPan"
例...
<activity Android:name=".mapview.AddParkingLotActivity" Android:screenOrientation="portrait" Android:windowSoftInputMode="adjustPan"/>
私も同じ問題を抱えていました。キーボードが表示されたときにListView内のEditTextがフォーカスを失っていたので、ListViewアイテムからgetViewを配置しました
final EditText editInput = (EditText)convertView.findViewById(R.id.edit_input);
editInput.requestFocusFromTouch();
そして、これは私のために働きます。
これらの2つの手順で、私が抱えていた同様の問題が解決されました(ListView内の行のEditText +面白いキーボードの動作)。
これは実際の例です:
AndroidManifest.xml
<activity
Android:name=".SubscriptionListActivity"
Android:windowSoftInputMode="adjustPan"
Android:label="@string/title_activity_subscriptions" >
</activity>
layout.xmlファイル
<ListView
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:descendantFocusability="afterDescendants"
Android:id="@+id/subscriptionList" />
私はSamsungGalaxy S3でテストしましたが、SamsungおよびSwiftKeyキーボードで正常に動作します。
この行にコメントするだけで解決した問題があります
this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);