web-dev-qa-db-ja.com

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

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

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

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

126
Dinedal

はい、チェックアウト Android開発者のサイトのこの記事 は、フレームワークが表示されるソフトキーボードを処理する方法を説明しています。

Android:windowSoftInputMode属性を使用して、アクティビティごとに何が起こるかを指定できます。レイアウトのサイズを変更するか、スクロールするかなどです。

94
Christopher Orr

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

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

アクティビティにAndroidManifest.xmlを追加します。

Android:windowSoftInputMode="adjustPan|adjustResize"
30

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

windowSoftInputMode="adjustResize"

または

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

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
21
Jose Kurian

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

Android:windowSoftInputMode="adjustPan"

以下のように変更することにより

1)AndroidManifest.xml

Android:windowSoftInputMode="stateVisible|adjustResize"

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

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

動いた。!!!!!!!!!!!!

16
Ronak Poriya

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

 Android:windowSoftInputMode="adjustResize"

scrollView内のRelativeLayoutの場合、set:

 Android:layout_gravity="center" or Android:layout_gravity="bottom" 

大丈夫だよ

12
Zahra.HY

oncreateメソッドでのActivityの行の下への挿入

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

onCreateメソッドのフラグメント

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

画面を上にスクロールするには、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>

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

7
Heena Arora

私はディエゴ・ラミレスの方法を試しました、それは動作します。 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>
5
CoolMind

私は自分の問題の解決策を見つけました。それはあなたのものとほとんど同じです。

まず、2つの要素を持つImageLayoutとLinearLayoutに2つのEditTextと1つのButtonが含まれるLinearLayoutのみがあるため、キーボードなしでフルスクリーンでそれらを別々に保つ必要があり、キーボードが表示されたらそれらは近くに見えるはずです。

そこで、0dpのheight属性とweight 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
Dantalian

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

<activity name="MainActivity"
    Android:windowSoftInputMode="stateVisible|adjustResize">
    ...
</activity>
1
Shivam Garg

フラグメントにいる場合は、アクティビティのonCreateに以下のコードを追加する必要があります

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

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

<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
Omar Boshra

トップレベルのレイアウトに次の行を追加したところ、すべてが機能しました。

Android:fitsSystemWindows="true"
0
Darush

enter image description here

Here is the solution for this fix
- Android:windowSoftInputMode="adjustResize" in Manifest File
- Make a class "CommentKeyBoardFix.Java" and copy and paste the below code.

public class CommentKeyBoardFix
{
private View mChildOfContent;
private int usableHeightPrevious;
private FrameLayout.LayoutParams frameLayoutParams;
private Rect contentAreaOfWindowBounds = new Rect();

public CommentKeyBoardFix(Activity activity)
{
    FrameLayout content = activity.findViewById(Android.R.id.content);
    mChildOfContent = content.getChildAt(0);
    mChildOfContent.getViewTreeObserver().addOnGlobalLayoutListener(this::possiblyResizeChildOfContent);
    frameLayoutParams = (FrameLayout.LayoutParams) mChildOfContent.getLayoutParams();
}

private void possiblyResizeChildOfContent()
{
    int usableHeightNow = computeUsableHeight();
    if (usableHeightNow != usableHeightPrevious)
    {
        int heightDifference = 0;
        if (heightDifference > (usableHeightNow /4))
        {
            // keyboard probably just became visible
            frameLayoutParams.height = usableHeightNow - heightDifference;
        }
        else
        {
            // keyboard probably just became hidden
            frameLayoutParams.height = usableHeightNow;
        }
        mChildOfContent.layout(contentAreaOfWindowBounds.left, contentAreaOfWindowBounds.top, contentAreaOfWindowBounds.right, contentAreaOfWindowBounds.bottom);
        mChildOfContent.requestLayout();
        usableHeightPrevious = usableHeightNow;
    }
}

private int computeUsableHeight()
{
    mChildOfContent.getWindowVisibleDisplayFrame(contentAreaOfWindowBounds);
    return contentAreaOfWindowBounds.height();
}
}

And then call this class in your Activity or Fragment
setContentView(R.layout.your_comments_layout)
CommentKeyBoardFix(this) ---> For Kotlin
or
new CommentKeyBoardFix(this) ---> For Java
0
yash786