45

下部にテキストとEditTextを表示し、EditTextの右側に[送信]ボタンを表示するListViewを使用して、非常に基本的なチャット画面を作成しようとしています。すべてが機能していますが、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>

4

7 に答える 7

54

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

于 2011-01-25T04:10:41.067 に答える
32

マニフェストファイルで、適切なプロパティを設定する必要がありandroid:windowSoftInputModeます。この属性はAPI3以降有効です。

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

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

  • stateUnspecified ソフトキーボードの状態(非表示か表示か)は指定されていません。システムは適切な状態を選択するか、テーマの設定に依存します。 これは、ソフトキーボードの動作のデフォルト設定です。
  • stateUnchanged ソフトキーボードは、アクティビティが前面に出たときに、表示されているか非表示になっているかに関係なく、最後にあった状態に保たれます。
  • 「stateHidden」 ソフトキーボードは、ユーザーがアクティビティを選択したとき、つまり、ユーザーが別のアクティビティを離れたためにアクティビティに戻るのではなく、アクティビティに積極的に移動したときに非表示になります。
  • stateAlwaysHidden アクティビティのメインウィンドウに入力フォーカスがある場合、ソフトキーボードは常に非表示になります。
  • stateVisible ソフトキーボードは、通常は適切な場合(ユーザーがアクティビティのメインウィンドウに移動している場合)に表示されます。
  • stateAlwaysVisible ソフトキーボードは、ユーザーがアクティビティを選択したとき、つまり、ユーザーが別のアクティビティを離れたためにアクティビティに戻るのではなく、アクティビティに積極的に移動したときに表示されます。
  • AdjustUndefined アクティビティのメインウィンドウのサイズを変更してソフトキーボード用のスペースを確保するか、ウィンドウの内容をパンして現在のフォーカスを画面に表示するかは指定されていません。ウィンドウのコンテンツにコンテンツをスクロールできるレイアウトビューがあるかどうかに応じて、システムはこれらのモードの1つを自動的に選択します。そのようなビューがある場合、スクロールによってウィンドウのすべてのコンテンツがより小さな領域内に表示されることを前提として、ウィンドウのサイズが変更されます。これは、メインウィンドウの動作のデフォルト設定です。
  • AdjustResize アクティビティのメインウィンドウは、画面上のソフトキーボード用のスペースを確保するために常にサイズ変更されます。
  • AdjustPan アクティビティのメインウィンドウは、ソフトキーボード用のスペースを確保するためにサイズ変更されていません。むしろ、ウィンドウの内容が自動的にパンされるため、現在のフォーカスがキーボードによって隠されることはなく、ユーザーは入力内容を常に確認できます。これは、サイズ変更よりも一般的に望ましくありません。これは、ユーザーがウィンドウの隠された部分にアクセスして操作するために、ソフトキーボードを閉じる必要がある場合があるためです。
于 2014-01-22T20:53:19.263 に答える
10

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

于 2015-10-27T14:37:59.737 に答える
1

これはAndroidManifestにありました。がadjustPan正しく機能しなくなりました。下のブロックを削除すると、すべてが正常に機能します。

<supports-screens
        android:smallScreens="true"
        android:normalScreens="true"
        android:largeScreens="true"
        android:xlargeScreens="false"
        android:anyDensity="false" />
于 2014-09-10T21:45:07.573 に答える
0

これが私が見つけた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());
                }
            });
        }
于 2011-10-08T21:34:23.983 に答える
-1

android:windowSoftInputMode="adjustResize|stateVisible|stateAlwaysHidden"マニフェストに追加してみてください。

于 2015-06-20T15:39:21.790 に答える
-14

次の設定を試すことができます。

<supports-screens
android:anyDensity="true"/>
于 2015-07-12T15:33:48.680 に答える