1

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 グループの質問へのリンクです。

4

1 に答える 1

1

あなたの説明はあまり明確ではありません。あなたは実際に何が間違っていると思いますか?さらに、あなたの説明は、独自のバージョンの候補者を作成したいように聞こえますか? 実装onCreateCandidateViews()はあなたのニーズに合わないのですか?

アップデート

スクリーンショットを見て、私はあなたの意味を理解しました。

あなたは本質的に痛みへの道を進んでいると思います。作成したのは、KeyboardViewそのサイズの でView、その高さにはそれらのTextView列が含まれます (当然のことながら)。アプリが入力メソッドと対話する方法は、入力メソッド次第ではなく、アプリ自体次第です。この場合、メッセージングアプリは次のようにandroid:windowSoftInputMode設定されているように見えますadjustResize(したがって、向きの変更に続いて「座っている」KeyboardView-入力方法が最初に表示されたときにサイズが変更されない理由がわかりません)。

さらに、基礎となるアプリを動作させることができたとしても、入力メソッドがアプリ自体からタッチ イベントを盗む可能性があるという問題に直面することになります (つまりKeyboardView、画面の下部にある長方形のままです。そこにどんな透明性があっても。

本質的に、Android の IME フレームワークは、単一のルート ビューである入力メソッドを対象としており、それは に固定されDialog、画面の下部に表示されます。より最近のフレームワークの変更がこれからシフトした可能性があります。サイズのパーセンテージが画面の幅/高さであるKeyboardと仮定するのではなく、クライアントが幅と高さを指定できるようにする新しいctor が追加されました。Key

とにかく、他のことを行うことは可能かもしれませんが、IME がユーザーのアプリと相互運用しない場合、IME がユーザーのアプリを使用しないため、IME はアプリが期待することを行う必要があります。これが黄金律です。

于 2012-10-04T22:32:18.183 に答える