web-dev-qa-db-ja.com

キーボードを開いたときにフラグメントを含むアクティビティのサイズが変更されない

私のメインアクティビティには、2つの子を持つRelativeLayoutがあります。

  • 背景として機能するImageView
  • 2つのフラグメントコンテナを持つLinearLayout

activity_main.xml

<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:tools="http://schemas.Android.com/tools"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:layout_gravity="bottom"
    tools:context="${packageName}.${activityClass}">

    <ImageView
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        Android:adjustViewBounds="true"
        Android:baselineAlignBottom="false"
        Android:scaleType="fitStart"
        Android:src="@drawable/bg_image" />

    <LinearLayout
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        Android:orientation="vertical"
        Android:paddingTop="?android:attr/actionBarSize"
        Android:layout_alignParentBottom="true">

        <LinearLayout
            Android:id="@+id/ContainerA"
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content"
            Android:layout_gravity="center"
            Android:orientation="vertical" />

        <LinearLayout
            Android:id="@+id/ContainerB"
            Android:layout_width="match_parent"
            Android:layout_height="match_parent"
            Android:background="@color/background_gray"
            Android:orientation="vertical" />

    </LinearLayout>
</RelativeLayout>

コンテナAは、変化しないフラグメントを単に示しています。
ただし、コンテナBは、ユーザーのクリックに応じて変化するフラグメントを保持します。

コンテナBは次の2つの方法で変更されます。

  • (約70%の高さから全高まで)拡張できます。
  • フラグメントを変更します。

コンテナBが保持できるフラグメントの1つは、EditTextsおよびその他のビューを含むフォームです。

私の問題は、キーボードが開いているときにアクティビティのサイズを変更できないことです。
マニフェストファイルでadjustResizeを設定しましたが、私のテーマはフルスクリーンテーマではありません(明らかにこの問題の原因です)。また、ビューを編集してScrollViewsを追加しようとしましたが、何も機能しませんでした。

このアクティビティに使用しているテーマは、AppCompatライブラリのダークアクションバーを備えたライトテーマです。テーマを編集して、オーバーレイアクションバーを許可しました。これは、notの問題であり、既にこれらの編集を無効にしてみました。

フォームレイアウトへのリンク

TL; DRadjustResize/adjustPanは動作しません。検索し、さまざまなソリューションを試しましたが、何も機能しませんでした。私の質問は私の場合、これの原因は何ですか?

更新:AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android" ...>

    <uses-sdk Android:minSdkVersion="11" Android:targetSdkVersion="19" />

    <application ... Android:theme="@style/AppTheme">
        <activity Android:name=".SplashScreenActivity"
            Android:label="@string/app_name"
            Android:screenOrientation="portrait"
            Android:theme="@Android:style/Theme.Black.NoTitleBar">
            <intent-filter>
                <action Android:name="Android.intent.action.MAIN" />

                <category Android:name="Android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity Android:name=".MainActivity"
            Android:configChanges="keyboardHidden|screenSize" Android:label="@string/app_name"
            Android:screenOrientation="portrait" Android:theme="@style/OverlayActionBarTheme"
            Android:windowSoftInputMode="adjustResize"  />
        <activity Android:name=".SettingsActivity"
            Android:label="@string/title_activity_settings"
            Android:parentActivityName=".MainActivity"
            Android:windowSoftInputMode="adjustResize">
            <meta-data Android:name="Android.support.PARENT_ACTIVITY"
                Android:value=".MainActivity" />
        </activity>
    </application>

</manifest>

更新2:
完全に新しいアプリを作成し、フォームレイアウトをメインレイアウトとして追加し、レイアウト自体に問題があるかどうかをテストしました。結局のところ、この新しく作成されたアプリでもサイズ変更されていないようです。

上記のように、レイアウトへのリンクを見つけることができますここ

Update 3:レイアウト全体をScrollViewで囲むことで、新しいアプリケーションで動作するようにできました。何らかの理由で元のアプリで同じ効果を再現できませんでした...まだ理由を解明しようとしています。

20
Asaf

ソフトキーボードが画面に表示されると、アプリケーションのUIで使用可能なスペースが減少します。システムは、アプリケーションのUIとソフトキーボードの間の使用可能なスペースを整理する方法を決定します。

  • ウィンドウのコンテンツにListViewScrollViewが含まれる場合、すべてのコンテンツが表示されると、アプリケーションのウィンドウのサイズが変更されます。
  • サイズ変更が実行できない場合、pan and scanアプローチが使用されます。これは、現在フォーカスされているビューが表示されるようにアプリケーションのウィンドウをスクロールするだけです。

レイアウトにはListViewScrollViewが含まれていないため、サイズ変更はできません。

ウィンドウのルートビューは、最初にFrameLayoutを追加していたLinearLayoutです。 LinearLayoutはスクロールをサポートしていないため、pan and scanアプローチも除外されます。したがって、ScrollView内でレイアウトをラップすると、スクロールの問題が解決します。

詳細については、 Android Developers blog を参照してください。

更新1:

OPは、この answer に示されているように、問題を解決できました。この問題は、アニメーション後に1つのフラグメントが別のフラグメントに重なっており、これらのFragmentの親がLinearLayoutであったために発生していました。オーバーレイのためには、RelativeLayoutまたはFrameLayoutのみを使用する必要があります。

22
Manish Mulimani

「AndroidManifest.xml」のアクティビティに対する次のステートメントでモードを「resize」に変更するには。

 <activity Android:name=".ActivityName"
        Android:windowSoftInputMode="adjustResize">

また、RelativeLayoutを使用する代わりに、LinearLayoutの複雑さを削除してください(複数レベルのLinearLayoutを使用していることを意味します)。これを使用すると、必要に応じて簡単にレイアウトを設定できます。

これがお役に立てば幸いです。

11

このコードをフラグメントでも使用できます

このコードは、ビューのサイズ変更のヘルプを提供します

public static class MyDialog extends DialogFragment {

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    // Dialog layout inflater code
    // getDialog() need to be called only after onCreateDialog(), which is invoked between onCreate() and onCreateView(). 
      getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN |     WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
   // return view code
  }
}
10
Ramkailash

マニフェストファイルでこの行を使用して、結果が必要なアクティビティに役立ててください。

   Android:windowSoftInputMode="adjustPan|stateAlwaysHidden" 

お気に入り

  <activity
            Android:name="com.Android.youractivity"
            Android:windowSoftInputMode="adjustPan|stateAlwaysHidden" />

BottomSheetFragment/DailogfragmentのonCreateDialogでこれを使用します

KeyboardUtil(getActivity(), view);

または

フラグメント用

new KeyboardUtil(this, findViewById(R.id.fragment_container));

このUtilクラスを使用して

https://github.com/mikepenz/MaterialDrawer/blob/aa9136fb4f5b3a80460fe5f47213985026d20c88/library/src/main/Java/com/mikepenz/materialdrawer/util/KeyboardUtil.Java

クレジット:Mikepenz

5
LOG_TAG

私の問題は完全に予想外のソースによって引き起こされたことが判明しました。

起こったのは、2つのフラグメントコンテナの親としてLinearLayoutを使用したことです。
次に、拡大アニメーションで、下のコンテナを持ち上げて他のコンテナとオーバーラップさせました。

私は本当に知りませんなぜが、LinearLayoutは重複する子を保持することになっていないため、RelativeLayoutまたはFrameLayoutに切り替えるとすぐに解決しました問題。

この原因は、私が投稿したコードからは明らかではない可能性があるため、情報が不足していることをおtoびしたいと思います。

5
Asaf

R.layout.layout_uiの下のDialogFragment Oncreateviewにこのコード行を追加します

getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN |     WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
0
Kishore Reddy