AndroidのN(7.0)は、自動的にソフトキーボードがリストビューでのEditTextに表示されたときにフルキーボードがポップアップ発行に切り替えるのだろうか?
問題記述の症状
- 活動のAndroidManifest.xmlに設定
android:windowSoftInputMode="adjustPan"
- でリストビュー内の項目を描画します
- EditTextのためのアイテムのコントロール
- EditTextは数InputTypeに設定しました
- 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で再現