Move layouts up when soft keyboard is shown?

丶灬走出姿态 提交于 2019-11-25 19:11:23
Christopher Orr

Yes, check out this article on the Android developers' site which describes how the framework handles the soft keyboard appearing.

The android:windowSoftInputMode attribute can be used to specify what happens on a per-activity basis: whether the layout is resized or whether it scrolls etc.

You can also use this code in onCreate() method:

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

Add in AndroidManifest.xml for your activity:

android:windowSoftInputMode="adjustPan|adjustResize" 
Jose Kurian

Make changes in the activity of your Manifest file like

windowSoftInputMode="adjustResize" 

OR

Make changes in your onCreate() method in the activity class like

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

similar issue i was facing with my layout which consist scroll view inside. Whenever i try to select text in EditText,Copy/Cut/Paste action bar gets moved up with below code as such it does not resize layout

android:windowSoftInputMode="adjustPan" 

By modifying it to as below

1) AndroidManifest.xml

android:windowSoftInputMode="stateVisible|adjustResize" 

2) style.xml file ,in activity style

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

It worked.!!!!!!!!!!!!

In AndroidManifest.xml, don't forget to set:

 android:windowSoftInputMode="adjustResize" 

and for RelativeLayout inside ScrollView ,set :

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

it will be okay

for Activity in its oncreate methode insert below line

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

and for fragments in its onCreate method

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

There are 3 steps to follow to scroll screen up.

  1. Write in manifest file for your activity:

android:windowSoftInputMode="adjustResize"

  1. Add following line in oncreate() method of your activity

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

  1. Then place your whole view in "Scrollview" in XML file like :
<?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> 

P.S. Don't forget to add android:layout_gravity="center" in parent Relative layout.

I tried a method of Diego Ramírez, it works. In AndroidManifest:

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

In 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> 

I have found a solution to my problems that it's pretty same as yours.

First of all, I only have a LinearLayout with 2 elements, an ImageView and a LinearLayout wich contains 2 EditText and one Button, so I needed to keep them separate in full screen without keyboard, and when the keyboard appears they should look closer.

So I added the view between them with the height attribute in 0dp and weight 1, that let me keep my views separate one form each other. and when the keyboard appers, as they don't have a fix height, they just resize and keep the aspect.

Voila! The layout resize and the distance between my views is the same when the keyboard is or not present.

Here is full manifest code

<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> 
Pratik Mohanrao Gondil

if you are in fragments then you have to add the below code to your onCreate on your activity it solves issue for me

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

In your manifest file add the below line. It will work

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

Alright this is very late however I've discovered that if you add a List View under your edit text then the keyboard will move all layouts under that edittext without moving the ListView

<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** 

This is the only solution that worked for me.

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 

I just added the following line to the top level layout and everything worked:

android:fitsSystemWindows="true" 
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!