[英]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.