当EditText在ListView中获得焦点时,被键盘遮挡了。

10

我有一个包含带EditText的行的ListView。

当我点击EditText并且它还没有焦点时,它会获得焦点,键盘出现并且EditText被移动到CandidateView上方(期望的行为)。

但是,当我按下按键时,EditText保持焦点并接收输入,但向下移动并被键盘遮挡(之前的移动被反转)。

当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" 并且在 ListView 中添加了
android:descendantFocusability="beforeDescendants"

如果没有 adjustPan ,EditText 就无法获得焦点,但这并不能完全解决问题。

有人有什么想法吗?


我也遇到了同样的问题,没有找到任何解决方案。这就是为什么我因为研发时间的问题创建了自己的自定义键盘,但这并不是解决方案。让我们点赞它,看看你在这里能找到什么。 - Narendra Pal
相关/重复:ListView中的可聚焦EditText - blahdiblah
2个回答

1

试试这个:

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

在清单文件中。

如果您使用ScrollView,最有可能adjustResize会起作用。


它不起作用了。现在初始移动到正确位置的功能不再存在了。您是指我应该将ListView放入ScrollView中,还是只使用ScrollView并放弃ListView? - Till S
1
如果您正在使用 ListView,那就足够了,它必须自动向上滚动以保持在软键盘上方。只需使用 stateVisible|adjustResize 即可。但让我用一个示例项目来检查一下。 - Archie.bpgc
1
不行。adjustResize 会导致 EditText 短暂地获得焦点(建议被调整),但它立即失去焦点,我无法输入任何内容。到目前为止,adjustPan 是唯一能使 EditText 可以聚焦的标志。 - Till S

0

在这个问题上花费了许多时间后,这是我的解决方案(适用于Android < 4.2):

1)清单文件 => android:windowSoftInputMode="adjustPan"

2)活动(Activity)=> 创建OnTouchListner并传递给Adapter

    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);
        }
        }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接