ソフトキーボードはフルキーボードの問題にポップアップする際にAndroidのN(7.0)が自動的にリストビューの表示のEditTextを切り替え?...

オリジナルリンク: http://www.cnblogs.com/AsionTang/p/7730290.html

AndroidのN(7.0)は、自動的にソフトキーボードがリストビューでのEditTextに表示されたときにフルキーボードがポップアップ発行に切り替えるのだろうか?

問題記述の症状

  1. 活動のAndroidManifest.xmlに設定android:windowSoftInputMode="adjustPan"
  2. でリストビュー内の項目を描画します
  3. EditTextのためのアイテムのコントロール
  4. EditTextは数InputTypeに設定しました
  5. Androidの7.0システム上、のEditTextをクリックすると、ポップアップソフトキーボード「デジタル」入力モードが、瞬時に「フルキーボード」モードに切り替わります。

    7.0より前のシステムでは、この問題は発生しませんでした。

暫定ソリューション(ないリスクアセスメント)

/**
 * 尝试性修复了在ListView里显示EditText InputType为 其它非text 类型时,弹出的软键盘会从数字键盘自动切换为 英文全键盘 的问题。
 */
class ListViewEx2 extends ListView
{
public ListViewEx2(final Context context)
{
    super(context);
}

public ListViewEx2(final Context context, final AttributeSet attrs)
{
    super(context, attrs);
}

public ListViewEx2(final Context context, final AttributeSet attrs, final int defStyleAttr)
{
    super(context, attrs, defStyleAttr);
}

@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public ListViewEx2(final Context context, final AttributeSet attrs, final int defStyleAttr, final int defStyleRes)
{
    super(context, attrs, defStyleAttr, defStyleRes);
}

@Override
protected void onLayout(final boolean changed, final int l, final int t, final int r, final int b)
{
    //XXX:经过初步测试,只有在Android 7.0平台以上的系统才会出现软键盘自动切换的问题。
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N && changed)
        super.onLayout(changed, l, t, r, b);
    else
        super.onLayout(changed, l, t, r, b);
}
}

ListView.javaソースの比較

Androidのバージョン名:ヌガーAPIレベル:24 ListView.javaオンライン表示

アンドロイド7.0一部不審な変更されたソース

private class FocusSelector implements Runnable {
    // the selector is waiting to set selection on the list view
    private static final int STATE_SET_SELECTION = 1;
    // the selector set the selection on the list view, waiting for a layoutChildren pass
    private static final int STATE_WAIT_FOR_LAYOUT = 2;
    // the selector's selection has been honored and it is waiting to request focus on the
    // target child.
    private static final int STATE_REQUEST_FOCUS = 3;

    public void run() {
        if (mAction == STATE_SET_SELECTION) {
            setSelectionFromTop(mPosition, mPositionTop);
            mAction = STATE_WAIT_FOR_LAYOUT;
        } else if (mAction == STATE_REQUEST_FOCUS) {
            final int childIndex = mPosition - mFirstPosition;
            final View child = getChildAt(childIndex);
            if (child != null) {
                child.requestFocus();
            }
            mAction = -1;
        }
    }
    }
}

Androidのバージョン名:マシュマロAPIレベル:23 ListView.javaオンライン表示

古いバージョンのアンドロイド6.0疑わしい部分は、対応するソースコードを変更します

private class FocusSelector implements Runnable {       
    public void run() {
        setSelectionFromTop(mPosition, mPositionTop);
    }
    }

参考資料

ます。https://www.cnblogs.com/AsionTang/p/7730290.htmlで再現

おすすめ

転載: blog.csdn.net/weixin_30341745/article/details/98098882