web-dev-qa-db-ja.com

adjustPanはキーボードがEditTextをカバーするのを妨げません

ListViewの下部にテキストとEditTextが表示され、EditTextの右側に「送信」ボタンがある、かなり基本的なチャット画面を作成しようとしています。すべてが機能していますが、EditTextをクリックすると、仮想キーボードがそれを覆います。画面は少し移動しますが、キーボードの上に表示されるのに十分ではありません。マニフェストに「adjustPan」タグがあり、「adjustResize」タグも使用できませんでした。レイアウトの設定方法と関係があると思いますが、正直なところ何もわかりません。助けてください!

現在のレイアウト...

<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:orientation="vertical"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent">

<ListView Android:id="@+id/Android:list" 
    Android:layout_height="0dip" 
    Android:layout_width="fill_parent"
    Android:layout_weight="1"
    Android:stackFromBottom="true">
</ListView>

<LinearLayout Android:orientation="horizontal"
    Android:layout_width="fill_parent"
    Android:layout_height="wrap_content">

    <EditText Android:id="@+id/sendMessageBox"
        Android:focusable="true"
        Android:layout_width="fill_parent"
        Android:layout_height="wrap_content"
        Android:layout_weight="1"
        Android:scrollbars="vertical"
        Android:maxLines="4"
        Android:text=""
        Android:inputType="textShortMessage|textAutoCorrect|textCapSentences|textMultiLine"
        Android:maxLength="1000"
        Android:hint="Type your message..."
        Android:imeOptions="actionSend"/>

    <Button Android:id="@+id/sendMessageButton" 
        Android:layout_width="wrap_content" 
        Android:layout_height="wrap_content"
        Android:layout_gravity="bottom"
        Android:text="Send"/>

</LinearLayout>
44
honeal

明らかに多くの検索を行った後、それは私がバグと呼んでいるものです。 (アクティビティからステータスバーを削除するために)フルスクリーンタグを使用する場合、ScrollViewでアクティビティをラップせずに "adjustResize"を使用することはできません。残念ながら、私はさらに別の問題を引き起こすListViewを使用しています。私はそれをいじるのはうんざりだし、おそらくその活動のフルスクリーンを放棄するでしょう。

49
honeal

マニフェストファイルで、適切なAndroid:windowSoftInputModeプロパティ。この属性はAPI 3以降有効です。

<activity
    ...
    Android:windowSoftInputMode="adjustPan" >
</activity>

オプションは次のとおりです。 http://developer.Android.com/guide/topics/manifest/activity-element.html#wsoft

  • stateUnspecifiedソフトキーボードの状態(非表示または表示)は指定されていません。システムは適切な状態を選択するか、テーマの設定に依存します。 これはソフトキーボードの動作のデフォルト設定です。
  • stateUnchangedアクティビティが前面に来たとき、ソフトキーボードは、表示または非表示にかかわらず、最後の状態に保持されます。
  • "stateHidden"ユーザーがアクティビティを選択すると、つまりユーザーが戻るのではなく、積極的にアクティビティに進むと、ソフトキーボードが非表示になります別のアクティビティを残すためです。
  • stateAlwaysHiddenアクティビティのメインウィンドウに入力フォーカスがある場合、ソフトキーボードは常に非表示になります。
  • stateVisibleソフトキーボードは、通常適切な場合(ユーザーがアクティビティのメインウィンドウに進んでいる場合)に表示されます。
  • stateAlwaysVisibleソフトキーボードは、ユーザーがアクティビティを選択したとき、つまり、ユーザーがアクティビティに戻るのではなく、積極的にアクティビティに進むときに表示されます。別のアクティビティを残すため。
  • adjustUnspecifiedアクティビティのメインウィンドウのサイズを変更してソフトキーボード用のスペースを確保するか、ウィンドウの内容をパンして現在のフォーカスを表示するかは指定されていません画面上で。システムは、ウィンドウのコンテンツにコンテンツをスクロールできるレイアウトビューがあるかどうかに応じて、これらのモードのいずれかを自動的に選択します。そのようなビューがある場合、スクロールによりウィンドウのコンテンツがすべてより小さい領域内で表示されると仮定して、ウィンドウのサイズが変更されます。これは、メインウィンドウの動作のデフォルト設定です。
  • adjustResizeアクティビティのメインウィンドウは、画面上のソフトキーボード用のスペースを確保するために常にサイズ変更されます。
  • adjustPanアクティビティのメインウィンドウは、ソフトキーボード用のスペースを確保するためにサイズ変更されません。むしろ、ウィンドウのコンテンツは自動的にパンされるため、現在のフォーカスがキーボードによって隠されることはなく、ユーザーは入力内容を常に見ることができます。これは、ユーザーがソフトキーボードを閉じてウィンドウの不明瞭な部分にアクセスしたり、操作したりする必要があるため、一般にサイズ変更よりも望ましくありません。
29
LocalPCGuy

マニフェストのアクティビティにAndroid:windowSoftInputMode="adjustResize"を設定すると、ScrollView(または他の折りたたみ可能なViewGroups)が縮小して、ソフトキーボードに対応します。ただし、アクティビティのテーマでAndroid:windowFullscreen="true"を設定した場合、ScrollViewは画面全体に表示されるため、縮小しません。ただし、テーマにAndroid:fitsSystemWindows="false"を設定すると、adjustResizeが機能しなくなります

9
BadYous

AndroidManifestでこれがありました。 adjustPanが正しく動作しなくなる原因となりました。下のブロックを削除すると、すべて正常に動作します。

<supports-screens
        Android:smallScreens="true"
        Android:normalScreens="true"
        Android:largeScreens="true"
        Android:xlargeScreens="false"
        Android:anyDensity="false" />
1
JeffRegan

ここに私が見つけた1つの回避策があります。問題のあるeditTextを開き、RETURNキーを押します。 editTextが、撮影する位置により近く移動することに注意してください。

そのため、ハックしますが、基本的には編集テキストの先頭に改行を挿入してください。

これも下部の改行を使用して動作するようですが、ソフトキーボードが所定の位置にアニメーション化されるまで、遅延を使用して改行を追加する必要があります。

注:この問題は特定の携帯電話(DroidX)でのみ発生します。

if (Android.os.Build.MODEL.equals("DROIDX")) {
        inputEt.setOnFocusChangeListener(new OnFocusChangeListener() {
            @Override
            public void onFocusChange(View v, boolean hasFocus) {
                    String text = inputEt.getText().toString();
                    text = "\n\n" + text.trim();
                    inputEt.setText(text);  
                    inputEt.setSelection(text.length());
                }
            });
        }
0
paulpooch