私のメインアクティビティには、2つの子を持つRelativeLayout
があります。
ImageView
LinearLayout
<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つの方法で変更されます。
コンテナBが保持できるフラグメントの1つは、EditText
sおよびその他のビューを含むフォームです。
私の問題は、キーボードが開いているときにアクティビティのサイズを変更できないことです。
マニフェストファイルでadjustResize
を設定しましたが、私のテーマはフルスクリーンテーマではありません(明らかにこの問題の原因です)。また、ビューを編集してScrollViews
を追加しようとしましたが、何も機能しませんでした。
このアクティビティに使用しているテーマは、AppCompat
ライブラリのダークアクションバーを備えたライトテーマです。テーマを編集して、オーバーレイアクションバーを許可しました。これは、notの問題であり、既にこれらの編集を無効にしてみました。
TL; DRadjustResize
/adjustPan
は動作しません。検索し、さまざまなソリューションを試しましたが、何も機能しませんでした。私の質問は私の場合、これの原因は何ですか?
<?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
で囲むことで、新しいアプリケーションで動作するようにできました。何らかの理由で元のアプリで同じ効果を再現できませんでした...まだ理由を解明しようとしています。
ソフトキーボードが画面に表示されると、アプリケーションのUIで使用可能なスペースが減少します。システムは、アプリケーションのUIとソフトキーボードの間の使用可能なスペースを整理する方法を決定します。
ListView
、ScrollView
が含まれる場合、すべてのコンテンツが表示されると、アプリケーションのウィンドウのサイズが変更されます。pan and scan
アプローチが使用されます。これは、現在フォーカスされているビューが表示されるようにアプリケーションのウィンドウをスクロールするだけです。レイアウトにはListView
、ScrollView
が含まれていないため、サイズ変更はできません。
ウィンドウのルートビューは、最初にFrameLayout
を追加していたLinearLayout
です。 LinearLayout
はスクロールをサポートしていないため、pan and scan
アプローチも除外されます。したがって、ScrollView内でレイアウトをラップすると、スクロールの問題が解決します。
詳細については、 Android Developers blog を参照してください。
更新1:
OPは、この answer に示されているように、問題を解決できました。この問題は、アニメーション後に1つのフラグメントが別のフラグメントに重なっており、これらのFragment
の親がLinearLayout
であったために発生していました。オーバーレイのためには、RelativeLayout
またはFrameLayout
のみを使用する必要があります。
「AndroidManifest.xml」のアクティビティに対する次のステートメントでモードを「resize」に変更するには。
<activity Android:name=".ActivityName" Android:windowSoftInputMode="adjustResize">
また、RelativeLayoutを使用する代わりに、LinearLayoutの複雑さを削除してください(複数レベルのLinearLayoutを使用していることを意味します)。これを使用すると、必要に応じて簡単にレイアウトを設定できます。
これがお役に立てば幸いです。
このコードをフラグメントでも使用できます
このコードは、ビューのサイズ変更のヘルプを提供します
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
}
}
マニフェストファイルでこの行を使用して、結果が必要なアクティビティに役立ててください。
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クラスを使用して
クレジット:Mikepenz
私の問題は完全に予想外のソースによって引き起こされたことが判明しました。
起こったのは、2つのフラグメントコンテナの親としてLinearLayout
を使用したことです。
次に、拡大アニメーションで、下のコンテナを持ち上げて他のコンテナとオーバーラップさせました。
私は本当に知りませんなぜが、LinearLayout
は重複する子を保持することになっていないため、RelativeLayout
またはFrameLayout
に切り替えるとすぐに解決しました問題。
この原因は、私が投稿したコードからは明らかではない可能性があるため、情報が不足していることをおtoびしたいと思います。
R.layout.layout_uiの下のDialogFragment Oncreateviewにこのコード行を追加します
getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN | WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);