私のアプリケーションには基本的にアンケートであるリストビューがあるため、ユーザーが入力する必要のある EditTexts がいくつかあります。次の問題が発生しました。
一部の EditText には数値入力が必要なため、対応する xml タイプの inputType を数値として設定しますが、EditText をクリックすると数値キーボードが表示されますが、ほとんどすぐに表示されなくなり、通常のキーボードが表示されます。
ご想像のとおり、ユーザーが入力した値をこれらの EditText に格納する必要があります。これに関する問題は、SOME EditTexts にテキストを入力して下にスクロールした後、戻るとテキストが消えてしまうことです。私のコードで、これを防止しようとしたことがわかります。チェックボックスを使用しても問題なく動作することに言及する必要があります。
最初はフォーカスを失うことに問題がありましたが、他の質問を見て解決しました(ListViewとwindowSoftInputMode = "adjustPan"にdescendantFocusablity = "beforeDescendants"を追加しました)。EditText が画面の半分より下にある場合、入力を開始するとすぐにフォーカスが失われることを除いて、正常に動作します。 リスト アダプタの getView メソッド:
public View getView(final int position,View result,ViewGroup parent) { final ViewHolder vh; final Question question = values.get(position); if(holders[position]==null) vh = new ViewHolder(); else vh = holders[position]; LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); if(question.getQuestionType().equals(Question.TYPE_CLOSED)) { result = inflater.inflate(R.layout.closed_question_list_item, null); vh.cb = (CheckBox)result.findViewById(R.id.checkbox); vh.cb.setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { vh.isChecked = isChecked; holders[position] = vh; } }); vh.cb.setChecked(vh.isChecked); } else { result = inflater.inflate(R.layout.numeric_question_list_item, null); vh.et = (EditText)result.findViewById(R.id.question_et); vh.et.addTextChangedListener(new TextWatcher() { @Override public void afterTextChanged(Editable s) { vh.tvValue = s.toString(); holders[position] = vh; Log.i(TAG,"Entered afterTextChanged for "+ question.getText()); } @Override public void beforeTextChanged(CharSequence s, int start,int count, int after) { } @Override public void onTextChanged(CharSequence s, int start,int before, int count) { } }); vh.et.setText(vh.tvValue); } vh.tv = (TextView)result.findViewById(R.id.question_text); vh.tv.setText(question.getText()); holders[position] = vh; result.setTag(vh); return result; }