RelativeViewには、下部揃え属性が設定されたいくつかの要素があります。ソフトキーボードが起動すると、要素はソフトキーボードによって非表示になります。
画面スペースが十分にある場合はキーボードの上に表示されるように上に移動するか、ユーザーがまだ要素を表示できるようにキーボードの上のセクションをスクロール可能にしたいです。
これにアプローチする方法についてのアイデアはありますか?
はい、チェックアウト Android開発者のサイトのこの記事 は、フレームワークが表示されるソフトキーボードを処理する方法を説明しています。
Android:windowSoftInputMode
属性を使用して、アクティビティごとに何が起こるかを指定できます。レイアウトのサイズを変更するか、スクロールするかなどです。
onCreate()
メソッドでもこのコードを使用できます。
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
アクティビティにAndroidManifest.xmlを追加します。
Android:windowSoftInputMode="adjustPan|adjustResize"
マニフェストファイルのアクティビティを次のように変更します。
windowSoftInputMode="adjustResize"
または
アクティビティクラスのonCreate()
メソッドを次のように変更します
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
同様の問題は、スクロールビューで構成されるレイアウトに直面していました。 EditTextでテキストを選択しようとするたびに、コピー/カット/貼り付けアクションバーが下のコードで上に移動するため、レイアウトのサイズが変更されません
Android:windowSoftInputMode="adjustPan"
以下のように変更することにより
1)AndroidManifest.xml
Android:windowSoftInputMode="stateVisible|adjustResize"
2)アクティビティスタイルのstyle.xmlファイル
<item name="Android:windowActionBarOverlay">true</item>
動いた。!!!!!!!!!!!!
AndroidManifest.xmlで、設定することを忘れないでください:
Android:windowSoftInputMode="adjustResize"
scrollView内のRelativeLayoutの場合、set:
Android:layout_gravity="center" or Android:layout_gravity="bottom"
大丈夫だよ
oncreateメソッドでのActivityの行の下への挿入
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
onCreateメソッドのフラグメント
getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
画面を上にスクロールするには、3つの手順を実行します。
Android:windowSoftInputMode = "adjustResize"
getWindow()。setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
<?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"を追加することを忘れないでください。
私はディエゴ・ラミレスの方法を試しました、それは動作します。 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>
私は自分の問題の解決策を見つけました。それはあなたのものとほとんど同じです。
まず、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>
マニフェストファイルに次の行を追加します。それが動作します
<activity name="MainActivity"
Android:windowSoftInputMode="stateVisible|adjustResize">
...
</activity>
フラグメントにいる場合は、アクティビティの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**
これは私のために働いた唯一のソリューションです。
トップレベルのレイアウトに次の行を追加したところ、すべてが機能しました。
Android:fitsSystemWindows="true"
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