ソフトキーボードが表示されているときにレイアウトを上に移動しますか?


139

RelativeViewにいくつかの要素があり、align bottom属性が設定されています。ソフトキーボードが表示されると、要素はソフトキーボードによって非表示になります。

画面スペースが十分にある場合はキーボードの上に表示されるように上に移動したり、キーボードの上にあるセクションをスクロール可能にしてユーザーが要素を引き続き表示できるようにしたりします。

これにアプローチする方法についてのアイデアはありますか?



@Dinedalどのようにしてalign bottom属性をur RelativeViewに設定しますか?
KJEjava48

回答:



95

onCreate()メソッドでこのコードを使用することもできます。

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);

11
私にとって、adjustPan scrennを設定しても、レイアウト全体ではなく、クリックしたエディットテキストまでしか移動しません
murt


22

マニフェストファイルのアクティビティを次のように変更します

windowSoftInputMode="adjustResize"

または

次のonCreate()ようにアクティビティクラスのメソッドに変更を加えます

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);

11
なぜ別のフラグを使用するのですか?
CoolMind 2018年

現在のバージョンにはandroidプレフィックスが必要です:android:windowSoftInputMode = "adjustResize"
Andrea Leganza

21

内部のスクロールビューで構成されるレイアウトで直面していた同様の問題。EditTextでテキストを選択しようとすると、コピー/カット/貼り付けのアクションバーが下のコードで上に移動するため、レイアウトのサイズが変更されません

android:windowSoftInputMode="adjustPan"

以下のように変更する

1)AndroidManifest.xml

android:windowSoftInputMode="stateVisible|adjustResize"

2)アクティビティスタイルのstyle.xmlファイル

<item name="android:windowActionBarOverlay">true</item>

出来た。!!!!!!!!!!!!


18

AndroidManifest.xmlで、設定することを忘れないでください:

 android:windowSoftInputMode="adjustResize"

ScrollView内のRelativeLayoutの場合は、次のように設定します。

 android:layout_gravity="center" or android:layout_gravity="bottom" 

大丈夫だよ


android:layout_gravity = "center"が機能しました。ありがとうございます。:)今、EditTextはキーボード上で思い通りに動きます
Pavel Biryukov '26

11

oncreateメソッドのアクティビティの場合、行の下に挿入

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);

およびonCreateメソッドのフラグメントの場合

getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);

10

画面を上にスクロールするには、3つの手順があります。

  1. アクティビティのマニフェストファイルに書き込みます。

android:windowSoftInputMode = "adjustResize"

  1. アクティビティのoncreate()メソッドに次の行を追加します

getWindow()。setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);

  1. 次に、次のようにXMLファイルの「Scrollview」にビュー全体を配置します。
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:background="@drawable/bg"
    android:layout_height="match_parent" 
    > 
    <RelativeLayout
         android:layout_width="fill_parent"
        android:layout_height="match_parent"
        android:layout_gravity="center" >
        <TextView />
         .........
        <TextView />
        <EditText >
            <requestFocus />
        </EditText>
        <Button />
    </RelativeLayout>
 </ScrollView>

PS親の相対レイアウトにandroid:layout_gravity = "center"を追加することを忘れないでください。


6

私はディエゴ・ラミレスの方法を試しました、それはうまくいきます。AndroidManifestの場合:

    <activity
        android:name=".MainActivity"
        android:windowSoftInputMode="stateHidden|adjustResize">
        ...
    </activity>

activity_main.xml内:

<LinearLayout ...
    android:orientation="vertical">

<Space
    android:layout_width="wrap_content"
    android:layout_height="0dp"
    android:layout_weight="1" />

<EditText
    android:id="@+id/edName"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:ems="10"
    android:hint="@string/first_name"
    android:inputType="textPersonName" />

<EditText ...>
...
</LinearLayout>

6
<activity name="ActivityName"
    android:windowSoftInputMode="adjustResize">
    ...
</activity>

スクロールしたいレイアウトの周りにNestedScrollViewを追加します。これは完全に機能します


3

私はそれがあなたのものとかなり同じである私の問題の解決策を見つけました。

まず、LinearLayoutには2つの要素があり、ImageViewとLinearLayoutには2つのEditTextと1つのButtonが含まれているため、キーボードなしでフルスクリーンでそれらを分離しておく必要があり、キーボードが表示されたとき、それらはより近くに見えるはずです。

そこで、0 dpとweight 1の高さ属性を使用してビューを追加しました。これにより、ビューを1つに分離できます。キーボードが表示されるときは、高さが決まっていないため、サイズを変更してアスペクトを維持します。

出来上がり!キーボードの有無にかかわらず、レイアウトのサイズ変更とビュー間の距離は同じです。


6
理解を深めるために、コードを投稿してみませんか?
johnkarka

上記のサンプルコードを投稿しました:stackoverflow.com/a/31994697/2914140
CoolMind 2018年

を使用してConstraintLayout、上部セクションを上部に固定し、下部セクションを下部に固定することで、これを簡単な方法で実現できます。キーボードが開くと、中央のスペースを圧迫することで自然にサイズが変更されます(使用する場合adjustResize
hmac

2
If user want this task using manifest then add this line in manifest
In manifest add this line: - android:windowSoftInputMode="adjustPan"
    e.g.
     <activity
           android:name=".ui.home.HomeActivity"
           android:screenOrientation="portrait"
           android:windowSoftInputMode="adjustPan">
     </activity>


    In Java File or Kotlin File(Programically) : - If user want this using Activity then add below line in onCreate Method

    activity!!.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);

こんにちは、stackoverflowへようこそ。回答ありがとうございます。コードのブロックを投稿するだけでなく、問題の解決方法と解決方法について簡単に説明できますか?これは、将来この質問を見つけた人が問題とその対処方法をよりよく理解するのに役立ちます。
Plutian、

1

ここに完全なマニフェストコードがあります

<activity
        android:name=".activities.MainActivity"
        android:windowSoftInputMode="adjustResize"
        android:label="@string/app_name">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

1

あなたが断片化している場合は、あなたのonCreateに以下のコードを追加する必要があります

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);

1

マニフェストファイルに次の行を追加します。それが動作します

<activity name="MainActivity"
    android:windowSoftInputMode="stateVisible|adjustResize">
    ...
</activity>

1

最上位のレイアウトに次の行を追加したところ、すべてが機能しました。

android:fitsSystemWindows="true"

@ yash786はおそらくフォーカスを受け取るedittextの下にボタンを表示していますか?2番目の質問では、レイアウトファイルを共有したり、キーボードの上部にedittextを追加したりする方法を教えてください。
Heroes84

android:windowSoftInputMode = "stateVisible | adjustResize"なしのイベントで機能します
ズーム

0

申し訳ありませんが、これは非常に遅いですが、編集テキストの下にリストビューを追加すると、キーボードがリストビューを移動せずに、その編集テキストの下のすべてのレイアウトを移動することを発見しました

<EditText
android:id="@+id/et"
android:layout_height="match_parent"
android:layout_width="match_parent"



/>

<ListView
    android:layout_width="match_parent"
    android:layout_height="match_parent"//can make as 1dp
    android:layout_below="@+id/et" // set to below editext
    android:id="@+id/view"
    >
**<any layout**

これは私のために働いた唯一の解決策です。


0

単一のアドバイスでは私の問題を解決できません。パンの調整は、仕事のサイズ変更の調整とほとんど同じです。レイアウトよりも調整を設定しないと、上に移動しませんが、現在書いている最下部の編集テキストが非表示になります。したがって、24時間の継続的な検索の後に、私はこのソースを見つけ、それが私の問題を解決しました。


0

遅いかもしれませんが、少し追加したいと思います。Android Studioバージョン4.0.1およびGradleバージョン6.1.1では、 windowSoftInputMode アクティビティに次のフラグを追加している場合、は期待どおりに機能しません。

getWindow().setFlags(
                WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS,
                WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS
        );

多くの時間を浪費した後、私はそのハックを見つけました。ためにはadjustResizeまたはAdjustPanまたはのいずれかの属性をwindowSoftInputMode正しく動作させるには、あなたがあなたの活動からそれを削除する必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.