EditText в ListView, скрытый клавиатурой при фокусировке

У меня есть ListView, содержащий строки с EditText's.

Когда я нажимаю на EditText и не фокусируется, он получает фокус, появляется клавиатура, а EditText перемещается над CandidateView (желаемое поведение).

Однако, когда я нажимаю клавишу, EditText сохраняет фокус и получает вход, но движется вниз и скрывается клавиатурой (предыдущее движение отменено).

Когда я нажимаю на EditText, когда он уже выбран без показанной клавиатуры, клавиатура появляется, но EditText не перемещается в правильное положение (над CandidateView). Он все еще получает вход.

Я добавляю заголовок, содержащий EditText, и там все работает правильно.

Это код моего ArrayAdapter, в котором создается представление строки:

View view = inflater.inflate(R.layout.row_profile_entry_text, null);


final String question = getItem(position);

TextView textViewQuestion = (TextView) view.findViewById(R.id.rpeq_TextViewQuestion);
textViewQuestion.setText(question);

final EditText editTextAnswer = (EditText) view.findViewById(R.id.rpeq_EditTextAnswer);

editTextAnswer.addTextChangedListener(new TextWatcher() {
    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
    }

    @Override
    public void beforeTextChanged(CharSequence s, int start, int count,
            int after) {
    }

    @Override
    public void afterTextChanged(Editable s) {
        mAnswers.put(question, s.toString());
    }
});

if (mAnswers.containsKey(question)) {
    editTextAnswer.setText(mAnswers.get(question));
}

return view;

Я также хотел бы подчеркнуть, что я уже добавил, android:windowSoftInputMode="adjustPan" в манифест и android:descendantFocusability="beforeDescendants" в ListView, поскольку большинство ответов на другие вопросы предлагает.

Без adjustPan EditText не может получить фокус на всех, но он не решает проблему полностью.

Есть ли у кого-то идея, что я делаю неправильно?

Ответ 1

Попробуйте следующее:

<activity name="YourActivity"
    android:windowSoftInputMode="stateVisible|adjustResize|adjustPan">
</activity>

в файле манифеста.

Скорее всего, adjustResize должен работать, если вы используете ScrollView.

Ответ 2

после многих часов, потраченных на эту проблему, это мое решение (для Android < 4.2):

1) Manifest = > android: windowSoftInputMode = "adjustPan"

2) Activity = > создать OnTouchListner и перейти к адаптеру

    private OnTouchListener exampleOnTouchListener = new OnTouchListener() {

    @SuppressLint("ClickableViewAccessibility")
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        if (MotionEvent.ACTION_UP == event.getAction()) {
            int position = (Integer) v.getTag();
            myListView.setSelection(position);
        }
        return false;
    }
    };

3) Адаптер

        if (exampleOnTouchListener!= null) {
        myEditText.setTag(position);
        myEditText.setOnTouchListener(exampleOnTouchListener);

        // if last element set padding bottom for spacing
        if (position == items.size() - 1) {
            LinearLayout myLinearLayout = (LinearLayout) convertView
                    .findViewById(R.id.ticketcontolProposedRealvalueLinearLayout);
            myLinearLayout.setPadding(0, 0, 0,SET_PADDING_BOTTOM);
        }
        }