[英]Keyboard not shown on inflated editText even after clicking on it
我有一个类似表单的活动,其中包含一些可以在按下时动态创建的视图。
我正在为单击按钮时会膨胀的每个字段使用xml。
我需要的是,在选择添加新项目时,它将获得焦点,在需要时滚动并显示键盘,以便用户可以在其中键入内容。 添加字段时或单击EditText时可能会显示键盘。
由于某些原因,在某些设备上(并且我认为这甚至不是android版本的问题),在扩大新视图时,其中的editText可以获得焦点,但是即使它具有焦点并且用户点击它。
在这种情况下,显示键盘的唯一方法是单击另一个EditText。
我已经对其进行了测试,并注意到当我完全不使用xml时(即仅在代码中创建视图时)不会发生这种情况。
为什么会发生? 我该怎么做才能修复它?
我已经尝试了很多可能的解决方案,但是在所有设备上都无法使用。
下一个代码在xperia j(android 4.0.4)和galaxy mini(android 2.3.6)上具有描述的问题。
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final ViewGroup container = (ViewGroup) findViewById(R.id.LinearLayout1);
final LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
findViewById(R.id.button).setOnClickListener(new OnClickListener() {
@Override
public void onClick(final View v) {
final View view = inflater.inflate(R.layout.field, null);
// using the next code works when using it instead of inflating a layout:
// final EditText editText = new EditText(MainActivity.this);
// editText.setText("item " + container.getChildCount());
container.addView(view);
}
});
}
字段布局文件:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/RelativeLayout1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#FFffffff"
android:gravity="center_vertical" >
<Spinner
android:id="@+id/typeSpinner"
android:layout_width="80dp"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_centerVertical="true"
android:background="@null"
android:padding="5dp" />
<include
android:id="@+id/removeItemView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
layout="@layout/remove_item_view" />
<EditText
android:id="@+id/fieldEditText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_toLeftOf="@+id/removeItemView"
android:layout_toRightOf="@+id/typeSpinner"
android:ems="10"
android:focusable="true"
android:focusableInTouchMode="true"
android:hint="field"
android:imeOptions="actionDone"
android:inputType="phone"
android:minWidth="200dp"
android:padding="5dp"
android:singleLine="true"
tools:ignore="HardcodedText" >
<requestFocus />
</EditText>
</RelativeLayout>
主布局文件:
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/scrollView"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<LinearLayout
android:id="@+id/LinearLayout1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="click"
tools:ignore="HardcodedText" />
</LinearLayout>
</ScrollView>
编辑:找到了部分解决方案,该解决方案不会立即显示键盘,但至少在按下editText时将显示该解决方案:
public static void forceFocusOnView(final View view) {
if (view == null)
return;
view.post(new Runnable() {
@Override
public void run() {
view.clearFocus();
view.post(new Runnable() {
@Override
public void run() {
view.requestFocus();
}
});
}
});
}
我不确定是该问题的原因。 改写Android SDK以匹配某些设备时,可能会出现一些不匹配的情况。 因此,我认为对您来说最好的解决方案是手动显示键盘,不要尝试移动火车,只需走阻力最小的路径即可:
EditText et=(EditText)this.findViewById(R.id.edit_text);
et.setOnFocusChangeListener(new OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(et, 0);<----------------
}
});
过来,老兄 祝您好运。
哦,我明白了...
private EditText et;
private Runnable setFocus;
......
protected void onCreate(...){
.
.
.
setFocus=new Runnable(){
@Override
public void run() {
et.requestFocus();
}
};
}
....
findViewById(R.id.button).setOnClickListener(new OnClickListener() {
@Override
public void onClick(final View v) {
final View view = inflater.inflate(R.layout.field, null);
//try this:
et=(EditText)view.findViewById(r.id.fieldEditText);
et.setOnFocusChangeListener(new OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(et, 0);<----------------
}
});
container.addView(view);
container.requestLayout();<--------------
et.postDelayed(setFocus,300);
}
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.