我一直在设计一个包含可扩展列表的应用程序。在每个列表的末尾,空EditText
已准备好接收注释。我有以下问题;当我触摸EditText
时,屏幕会稍微调整大小(不是问题因为调整大小并不总是发生,这取决于我的布局和列表中EditText
int的位置)并且出现了软键盘。但是,在这些事件中,EditText
会失去焦点而不会重新获得它。这是非常不方便的,因为没有焦点,尽管键盘可用,键盘的输入没有到达EditText
。一旦我再次触摸它,EditText
就会按预期运行。
它变得更加奇怪。键盘仍然显示,我可以触摸不同的EditText
,同样的情况发生;它失去了焦点。然而,一旦我通过最初失去焦点,我可以在先前被触及的EditText
之间自由移动而没有任何与焦点相关的问题。只有当我隐藏软键盘时,“状态”才会消失,我需要点击EditText
两次才能编辑它们。
以下是我的代码的摘录。首先是empty_comment.xml
:
<?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="vertical" >
<EditText
android:id="@+id/blank_box"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:inputType="textCapSentences"
android:imeOptions="actionDone"
android:hint="@string/hint"
android:layout_marginLeft="30dip" >
</EditText>
</LinearLayout>
这里是我使用相关布局的片段的摘录:
convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.comment_empty, null);
final EditText editText = (EditText) convertView.findViewById(R.id.blank_box);
editText.setOnEditorActionListener(new OnEditorActionListener()
{
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event)
{
if(actionId == EditorInfo.IME_ACTION_DONE)
{
// Unrelated code
}
return true;
}
});
我没有在清单文件中指定任何特定输入,但如果认为有用,我可以提供。
更新
在Activity
添加一行以调整平移android:windowSoftInputMode="adjustPan"
可以部分解决问题。它将当前意外行为替换为EditText
视图可能被软键盘隐藏的问题。
截至目前,尚未找到理想的解决方案,但接近了。看看接受的答案中的评论,它们可能对您有用!
答案 0 :(得分:43)
您需要更改AndroidManifest.xml
在包含列表视图的活动中添加android:windowSoftInputMode="adjustPan"
。这将解决您的问题。
<activity android:name=".MyEditTextInListView"
android:label="@string/app_name"
android:windowSoftInputMode="adjustPan">
答案 1 :(得分:5)
解决方案是发布延迟的runnable,检查EditText视图是否仍然是焦点,如果不是,请将其聚焦。
editText.setOnFocusChangeListener(new OnFocusChangeListener() {
@Override
public void onFocusChange(final View v, boolean hasFocus) {
if (hasFocus) {
// Request focus in a short time because the
// keyboard may steal it away.
v.postDelayed(new Runnable() {
@Override
public void run() {
if (!v.hasFocus()) {
v.requestFocus();
}
}
}, 200);
}
}
});
答案 2 :(得分:2)
我遇到了同样的问题......我通过扩展EditText解决了这个问题。
我创建了一个onClickListener,在这个方法中我得到了以下代码:
public OnClickListener clickListener = new OnClickListener() {
@Override
public void onClick(View v) {
EditTextInput.this.setFocusable(true);
EditTextInput.this.setFocusableInTouchMode(true);
EditTextInput.this.requestFocus();
}
};
然后我将以下代码放在onKeyPreIme回调中。您必须扩展EditText才能访问它。
@Override
public boolean onKeyPreIme(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK & event.getAction() == KeyEvent.ACTION_UP) {
EditTextInput.clearFocus();
EditTextInput.this.setFocusable(false);
EditTextInput.this.setFocusableInTouchMode(false);
return false;
}
return super.dispatchKeyEvent(event);
}
我发现我必须切换可聚焦标志才能在第一次点击时启动键盘。希望这有帮助......对我有用。
答案 3 :(得分:1)
您可以尝试以下方式:
editText.requestFocus();
您也可以设置:
android:windowSoftInputMode="stateHidden"
清单文件中的
答案 4 :(得分:1)
您可以在下面的代码中尝试使用android manifest.xml
将代码添加到android清单 android:windowSoftInputMode =“adjustPan”
并且还添加到xml布局
<EditText
android:background="#FFFFFF"
android:capitalize="sentences"
android:inputType="textVisiblePassword"
android:layout_height="35px"
>
<requestFocus />
答案 5 :(得分:0)
我在android.support.design.widget.TextInputEditText
遇到了这个问题,它是通过更改清单中的标记顺序解决的:
android:windowSoftInputMode="stateHidden|adjustPan"
到
android:windowSoftInputMode="adjustPan|stateHidden"
答案 6 :(得分:0)
除了android:windowSoftInputMode="adjustPan"
外,请尝试以下操作:
android:descendantFocusability="afterDescendants"
设置为您的ListView
。android:focusable="true"
和android:focusableInTouchMode="true"
设置为您的EditText
。