簡體   English   中英

鍵盤即使在單擊后也不會顯示在膨脹的editText上

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM