Android Sample SoftKeyboard の例を拡張しました。この拡張機能が必要とするのは、LatinKeyBoardView に加えて、キーボードの上に 2 つの垂直方向の AlphabetLinearLayouts (LinearLayout から拡張されたもの) を追加することです。LatinKeyboardView は標準キーボードです。
これら 2 つのサイド ビューをレイアウトから削除すると、動作は期待どおりです。EditText 内を選択すると、ソフト キーボードが表示され、画面上にあったすべてのビューが上に移動します。
通常、キーボードが縦向きにポップアップすると、画面に表示されていたコンテンツがキーボードの上に移動し、一部のコンテンツが画面から効果的に押し出され、キーボード用のスペースが確保されます。
キーボードの一部としてこれら 2 つの余分な垂直方向のビューがあるため、フレームワークはコンテンツを押し上げようとして失敗すると思います。
この問題を解決する方法を見つけようとしています。最良のシナリオは、ソフト キーボードを表示するのに必要なもの以外に移動させずに、垂直方向のビューを元のコンテンツの上に表示することです。
次のように KeyboardView を作成します。
@Override public View onCreateInputView() {
RelativeLayout outer = (RelativeLayout) getLayoutInflater().inflate(
R.layout.input, null);
// Set up keyboard view.
mInputView = (LatinKeyboardView) outer.findViewById(R.id.keyboard);
mInputView.setOnKeyboardActionListener(this);
mInputView.setKeyboard(mQwertyKeyboard);
// Maintain reference to APC.
mAlphabetViewLeft = (AlphabetColumnLayout)outer.findViewById(R.id.alphabet_list_left);
mAlphabetViewRight = (AlphabetColumnLayout)outer.findViewById(R.id.alphabet_list_right);
// Set of references to handle touches.
mAlphabetViewLeft.setTouchResolver(mTouchResolver);
mAlphabetViewRight.setTouchResolver(mTouchResolver);
return outer;
}
私のinput.xmlファイルは次のようになります。
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res/com.example.android.softkeyboard">
<com.example.android.softkeyboard.AlphabetColumnLayout
android:id="@+id/alphabet_list_left"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_above="@+id/keyboard"
android:orientation="vertical"
app:available_letters="BGHIJKLMNOPUVY"/>
<com.example.android.softkeyboard.AlphabetColumnLayout
android:id="@+id/alphabet_list_right"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_above="@+id/keyboard"
android:orientation="vertical"
app:available_letters="ACDEFQRSTWXZ"/>
<com.example.android.softkeyboard.LatinKeyboardView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/keyboard"
android:layout_alignParentBottom="true"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</RelativeLayout>
最後に、次のコードを使用して AlphabetColumnLayouts を設定します。これが何をするかというと、キーボードの上の画面の両側に一連の文字を作成します (上記の 2 つの入力ビュー)。AlphabetTextView は通常の TextView であり、私が望む方法でタッチを解決するのに役立ついくつかの追加機能があります。char[] 文字は、input.xml の app:available_letters スタイルを使用してインスタンス化されます。
public void instantiateViews(char[] letters, int appSize) {
Context context = mWeakContext.get();
assertNotNull(context);
// Set up layout params of parent based on the screen size available,
// keeping XML-defined params.
RelativeLayout.LayoutParams lp =
(RelativeLayout.LayoutParams) getLayoutParams();
if (lp == null) {
lp = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT,
RelativeLayout.LayoutParams.WRAP_CONTENT);
}
lp.height = appSize/2;
Log.e(TAG, "LinearLayout = " + lp.debug(""));
setLayoutParams(lp);
// Set up the child TextViews.
final int nLetters = letters.length;
for (char c : letters) {
AlphabetTextView tv = new AlphabetTextView(context, this);
LinearLayout.LayoutParams tlp = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
lp.height/nLetters);
tv.setLayoutParams(tlp);
//tv.setGravity(Gravity.CENTER);
tv.setText(String.valueOf(c));
tv.setTextSize(12);
tv.setTypeface(Typeface.DEFAULT_BOLD);
// Add child to Layout.
addView(tv);
}
setOnTouchListener(this);
}
これは、いくつかの画像を添付して投稿した Android グループの質問へのリンクです。