ListFragment 内にある EditText (「Your answer here ...」フィールドは下のスクリーン キャップを参照) をタップすると、フォーカスが維持されず、使用できなくなります。テキスト カーソルが EditText フィールドに表示されるとすぐに消え、EditText フィールドはフォーカスを失います。
関連するスタック投稿はほとんど見つかりませんでしたが、何かが EditText からフォーカスを奪っているのではないかと疑っています。関連記事はこちら. フォーカスの強制に関する投稿も読みましたが、何も意味がありません。
プログラムでビューを作成することもできますが、標準の ListFragment および ArrayAdapter コードを使用する方がはるかに簡単です。リストはユーザーの入力によって大きくなり、Android が提供するインフラストラクチャを使用すると管理が容易になります。
下の私の画面を見てください。画面の右側には、行のカスタム レイアウトを含む ListFragment があります。各行には、テキストを送信するための EditText と Button が含まれています。
ListFragment のコードは次のとおりです。
public class ItemDetailFragment extends ListFragment {
/**
* The fragment argument representing the item ID that this fragment
* represents.
*/
public static final String ARG_ITEM_ID = "item_id";
private static final String STATE_ACTIVATED_POSITION = "activated_position";
/**
* The dummy content this fragment is presenting.
*/
private static DetailArrayAdapter mAdapter;
/**
* Mandatory empty constructor for the fragment manager to instantiate the
* fragment (e.g. upon screen orientation changes).
*/
public ItemDetailFragment() {
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ArrayList<DetailData> items = new ArrayList<DetailData>();
items.add(new DetailData("1"));
mAdapter = new DetailArrayAdapter(getActivity(), R.layout.detail_layout, items);
// TODO: replace with a real list adapter.
setListAdapter(mAdapter);
}
class DetailArrayAdapter extends ArrayAdapter<DetailData> {
Context context = null;
int layoutResourceId;
ArrayList<DetailData> data;
public DetailArrayAdapter(Context context, int layoutResourceId, ArrayList<DetailData> data){
super(context, layoutResourceId, data);
this.context = context;
this.layoutResourceId = layoutResourceId;
this.data = data;
}
public View getView(int position, View convertView, ViewGroup parent){
View row = convertView;
LayoutInflater inflater = ((Activity)context).getLayoutInflater();
row = inflater.inflate(layoutResourceId, parent, false);
DetailData data = this.data.get(position);
EditText text = (EditText) row.findViewById(R.id.answer);
text.setText(data.detail_number + "You answer here ...");
Button submit_button = (Button) row.findViewById(R.id.answer_submit);
submit_button.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
int count = mAdapter.getCount();
int item_num = count + 1;
DetailData d = new DetailData(""+item_num);
mAdapter.add(d);
}
});
return row;
}
}
class DetailData {
public String detail_number;
public DetailData(String num){
this.detail_number = num;
}
}
}
カスタム行のレイアウト コードは次のとおりです。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal" >
<EditText
android:id="@+id/answer"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="Your answer here..."
android:maxLines="1"
android:singleLine="true"/>
<Button
android:id="@+id/answer_submit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Go" />
</LinearLayout>