8

私はカスタムキーボードに取り組んでいます.onCreateCandidatesView()でsetCandidatesViewShown(true)関数を設定しましたが、問題はUIが適切に再調整されないことです。

どんな支援も素晴らしいでしょう..以下は私がやったことです

@Override 
public View onCreateCandidatesView() {      

    LayoutInflater li = (LayoutInflater) getApplicationContext()
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View wordBar = li.inflate(R.layout.wordbar, null);
    LinearLayout ll = (LinearLayout) wordBar.findViewById(R.id.words);
    Button voiceCmd = (Button) wordBar.findViewById(R.id.voiceword);
    LinearLayout ll1 = null;
    Button voiceCmd1 = null;
    //comment this block in the event of showing only one keyboard so that we can only
    //one autocorrect bar
    if (isLargeScreen) {
        ll1 = (LinearLayout) wordBar.findViewById(R.id.words1);
        voiceCmd1 = (Button) wordBar.findViewById(R.id.voiceword1);
    }

    voiceCmd.setOnClickListener(voiceClickListener);

    mCandidateView = new CandidateView(this);
    mCandidateView.setService(this);
    setCandidatesViewShown(true);
    mCandidateView.setLayoutParams(new LayoutParams(
            LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));

    ll.addView(mCandidateView);             

    return wordBar;

}
4

2 に答える 2

14

私も同じ問題を抱えていました。Ced hereの投稿で答えを見つけました。

解決策は、これをインプット メソッド サービスに追加することです。

@Override public void onComputeInsets(InputMethodService.Insets outInsets) {
    super.onComputeInsets(outInsets);
    if (!isFullscreenMode()) {
        outInsets.contentTopInsets = outInsets.visibleTopInsets;
    }
}

候補ビューがアプリケーションを押し上げないようにするのは意図的です。ドキュメントから、

候補ビューは頻繁に表示および非表示になる傾向があるため、ソフト入力ビューと同じようにアプリケーション UI に影響を与えることはありません。アプリケーション ウィンドウのサイズが変更されることはなく、必要に応じてパンされるだけですユーザーに現在のフォーカスを表示します。

上記のハックは、候補ビュー領域を含むように「コンテンツ」領域を増やします。のドキュメントはonComputeInsets、概念を理解するのに役立ちます。

興味深いインセットを UI に計算します。デフォルトの実装では、候補フレームの上部を表示インセットに使用し、入力フレームの上部をコンテンツ インセットに使用します。

于 2014-03-18T20:13:48.387 に答える