15

I am using scroll view in a fragment but the screen does not scroll up when the keyboard is shown as it should be. Here is the scenario: I have mainActivity which has bottom navigation bar plus a frame layout which works as container for the activity. Here is the code:

<?xml version="1.0" encoding="utf-8"?>
<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"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    tools:context=".MainActivity"
    >
    <FrameLayout
        android:id="@+id/fragment_container"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true" />

    <android.support.design.widget.BottomNavigationView
        android:background="@color/clear_white"
        android:id="@+id/navigation"
        android:layout_width="match_parent"
        android:layout_height="56dp"
        android:layout_alignParentBottom="true"
        app:itemIconTint="@color/blue_navbar_icon"
        app:itemTextColor="@color/blue_navbar_icon"
        app:menu="@menu/navigation" />
</RelativeLayout>

Fragment screen has some input fields plus buttons which wrapped in constrained layout and then constrained layout is wrapped in scrollView, so that it can be scrolled up when the keyboard is active. Here is code of fragment xml file:

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <android.support.constraint.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"

        >
        <include
            android:id="@+id/app_bar_new"
            layout="@layout/app_bar_new"
            app:layout_constraintBottom_toTopOf="@+id/btn_get_location"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

        <Button
            android:id="@+id/btn_get_location"
            style="@style/btn_style"
            android:layout_width="match_parent"
            android:layout_height="43dp"
            android:layout_marginBottom="8dp"
            android:layout_marginEnd="11dp"
            android:layout_marginLeft="11dp"
            android:layout_marginRight="11dp"
            android:layout_marginStart="11dp"
            android:layout_marginTop="12dp"
            android:text="@string/get_location_btn_str"
            app:layout_constraintBottom_toTopOf="@+id/tv_long"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="0.0"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/app_bar_new" />

        <EditText
            android:id="@+id/et_name_of_attr"
            style="@style/input_field_style"
            android:layout_width="0dp"
            android:layout_height="47dp"
            android:layout_marginBottom="7dp"
            android:layout_marginEnd="11dp"
            android:layout_marginLeft="11dp"
            android:layout_marginRight="11dp"
            android:layout_marginStart="11dp"
            android:layout_marginTop="7dp"
            android:background="@drawable/input_field_design"
            android:ems="10"
            android:hint="@string/loc_name"
            android:inputType="textPersonName"
            app:layout_constraintBottom_toTopOf="@+id/et_description"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="0.0"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/tv_long" />

        <Button
            android:id="@+id/btn_save"
            style="@style/btn_style"
            android:layout_width="90dp"
            android:layout_height="42dp"
            android:layout_marginBottom="25dp"
            android:layout_marginEnd="8dp"
            android:layout_marginLeft="8dp"
            android:layout_marginRight="8dp"
            android:layout_marginStart="8dp"
            android:layout_marginTop="7dp"
            android:padding="10dp"
            android:text="@string/btn_save"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/rg_access" />

        <EditText
            android:id="@+id/et_cam_img_title"
            style="@style/input_field_style"
            android:layout_width="0dp"
            android:layout_height="47dp"
            android:layout_marginBottom="7dp"
            android:layout_marginEnd="11dp"
            android:layout_marginLeft="11dp"
            android:layout_marginRight="11dp"
            android:layout_marginStart="11dp"
            android:layout_marginTop="7dp"
            android:ems="10"
            android:hint="@string/loc_img_title"
            android:inputType="textMultiLine"
            app:layout_constraintBottom_toTopOf="@+id/additional_imgs"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="0.0"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/et_description" />

        <EditText
            android:id="@+id/et_description"
            style="@style/input_field_style"
            android:layout_width="0dp"
            android:layout_height="47dp"
            android:layout_marginBottom="7dp"
            android:layout_marginEnd="11dp"
            android:layout_marginLeft="11dp"
            android:layout_marginRight="11dp"
            android:layout_marginStart="11dp"
            android:layout_marginTop="7dp"
            android:ems="10"
            android:hint="@string/loc_desc"
            android:inputType="textMultiLine"
            app:layout_constraintBottom_toTopOf="@+id/et_cam_img_title"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="1.0"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/et_name_of_attr" />

        <TextView
            android:id="@+id/tv_long"
            android:layout_width="170dp"
            android:layout_height="35dp"
            android:layout_marginBottom="8dp"
            android:layout_marginTop="8dp"
            android:background="@drawable/long_lat_bg"
            android:ems="10"
            android:inputType="numberDecimal"
            android:padding="5dp"
            android:text="@string/loc_long"
            app:layout_constraintBottom_toTopOf="@+id/location_name_text"
            app:layout_constraintEnd_toStartOf="@+id/tv_lat"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/btn_get_location" />

        <TextView
            android:id="@+id/tv_lat"
            android:layout_width="170dp"
            android:layout_height="35dp"
            android:layout_marginBottom="8dp"
            android:layout_marginTop="8dp"
            android:background="@drawable/long_lat_bg"
            android:ems="10"
            android:inputType="textPersonName"
            android:padding="5dp"
            android:text="@string/loc_lat"
            app:layout_constraintBottom_toTopOf="@+id/location_name_text"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toEndOf="@+id/tv_long"
            app:layout_constraintTop_toBottomOf="@+id/btn_get_location" />

        <RelativeLayout
            android:id="@+id/additional_imgs"
            style="@style/input_field_style"
            android:layout_width="0dp"
            android:layout_height="47dp"
            android:layout_marginBottom="7dp"
            android:layout_marginEnd="11dp"
            android:layout_marginLeft="11dp"
            android:layout_marginRight="11dp"
            android:layout_marginStart="11dp"
            android:layout_marginTop="7dp"
            android:orientation="horizontal"
            app:layout_constraintBottom_toTopOf="@+id/relativeLayout2"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/et_cam_img_title">

            <TextView
                android:id="@+id/textView3"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentStart="true"
                android:layout_centerVertical="true"
                android:layout_marginStart="13dp"
                android:layout_weight="1"
                android:text="@string/loc_additional_imgs"
                android:layout_alignParentLeft="true"
                android:layout_marginLeft="13dp" />

            <ImageView
                android:id="@+id/btn_add_imgs"
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:layout_alignParentEnd="true"
                android:layout_alignParentRight="true"
                android:src="@drawable/ic_action_add_blue" />

        </RelativeLayout>

        <RelativeLayout
            android:id="@+id/relativeLayout2"
            style="@style/input_field_style"
            android:layout_width="0dp"
            android:layout_height="47dp"
            android:layout_marginBottom="7dp"
            android:layout_marginEnd="11dp"
            android:layout_marginLeft="11dp"
            android:layout_marginRight="11dp"
            android:layout_marginStart="11dp"
            android:layout_marginTop="7dp"
            android:orientation="horizontal"
            app:layout_constraintBottom_toTopOf="@+id/rg_access"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/additional_imgs">


            <ImageView
                android:id="@+id/icon_drop_down_img"
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:layout_alignParentEnd="true"
                android:layout_alignParentRight="true"
                android:src="@drawable/ic_drop_down" />

            <Spinner
                android:id="@+id/spin_classification"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:background="@android:color/transparent" />
        </RelativeLayout>


        <TextView
            android:textSize="16sp"
            android:textColor="@color/blue"
            android:id="@+id/tv_desc_access"
            android:layout_width="wrap_content"
            android:layout_height="32dp"
            android:layout_alignParentLeft="true"
            android:layout_alignParentStart="true"
            android:layout_centerVertical="true"
            android:layout_marginBottom="7dp"
            android:layout_marginEnd="8dp"
            android:layout_marginLeft="11dp"
            android:layout_marginRight="8dp"
            android:layout_marginStart="11dp"
            android:layout_marginTop="7dp"
            android:text="@string/loc_acess"
            app:layout_constraintBottom_toTopOf="@+id/btn_save"
            app:layout_constraintEnd_toStartOf="@+id/rg_access"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/relativeLayout2" />

        <RadioGroup
            android:id="@+id/rg_access"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginBottom="7dp"
            android:layout_marginEnd="21dp"
            android:layout_marginRight="21dp"
            android:layout_marginTop="7dp"
            android:gravity="center"
            android:orientation="horizontal"
            app:layout_constraintBottom_toTopOf="@+id/btn_save"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/relativeLayout2">

            <RadioButton
                android:id="@+id/rb_car"
                android:background="@drawable/rb_car"
                android:button="@android:color/transparent"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="10dp"
                android:layout_marginRight="10dp" />

            <RadioButton
                android:id="@+id/rb_jeep"
                android:background="@drawable/rb_jeep"
                android:button="@android:color/transparent"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="10dp"
                android:layout_marginRight="10dp" />

            <RadioButton
                android:id="@+id/rb_track"
                android:background="@drawable/rb_hike"
                android:button="@android:color/transparent"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="20dp"
                android:layout_marginRight="10dp"/>
        </RadioGroup>
    </android.support.constraint.ConstraintLayout>
</ScrollView>

Also here is my manifest file:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.eapple.tripdatacollection">

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".Main2Activity"
            android:windowSoftInputMode="adjustResize"
            >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".ViewSavedLocations" />
        <activity android:name=".fireBaseUpdates" />
        <activity android:name=".SignInActivity" />
        <activity android:name=".ForgotPasswordActivity" />
        <activity android:name=".UploadDataActivity" />
        <activity
            android:name=".MainActivity"
            android:label="@string/title_activity_main2" />
    </application>
</manifest>

But it does not work as it is intended to be. 1) The bottom navigation bar goes up with the keyboard as shown here:Screenshot

I want the bottom navBar to stay at bottom or get disappeared when keyboard is active.

Haroon khan
  • 1,018
  • 2
  • 15
  • 27
  • 1
    Try removing this: `android:windowSoftInputMode="adjustResize"` from `AndroidManifest.xml` This should help. – ʍѳђઽ૯ท Sep 18 '18 at 17:25
  • 1
    You have 3 options for what to do when the keyboard shows- scroll the app such that the cursor is onscreen, resize the app in the remaining space, or nothing. Number 2 is probably the closest to what you want. – Gabe Sechan Sep 18 '18 at 17:29
  • 1
    ʍѳђઽ૯ท when I remove android:windowSoftInputMode="adjustResize" from AndroidManifest.xml then the input fields behind the keyBoard does not scroll Up. So that solutions does not work and issue remains the same. – Haroon khan Sep 18 '18 at 17:40

3 Answers3

25

In my case it was enough only to add android:windowSoftInputMode="adjustPan" to my AndroidManifest file as follows:

 <activity android:name=".view.MainActivity"
            android:windowSoftInputMode="adjustPan"
            android:configChanges="keyboardHidden|orientation|screenSize"
            android:theme="@style/AppTheme">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
 </activity>
Ivan
  • 6,388
  • 3
  • 24
  • 30
5

Here is the solution, how I resolved the issue using this api: https://github.com/yshrsmz/KeyboardVisibilityEvent.

Steps:

1) In your androidManifest file:

Add the following tag: android:windowSoftInputMode="adjustResize"

As I did here:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.eapple.tripdatacollection">

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".Main2Activity"
            android:windowSoftInputMode="adjustResize"
            >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".ViewSavedLocations" />
        <activity android:name=".fireBaseUpdates" />
        <activity android:name=".SignInActivity" />
        <activity android:name=".ForgotPasswordActivity" />
        <activity android:name=".UploadDataActivity" />
        <activity
            android:name=".MainActivity"
            android:label="@string/title_activity_main2" />

    </application>

</manifest>

2) Add the following dependency in your build.grade file (App)

dependencies { implementation 'net.yslibrary.keyboardvisibilityevent:keyboardvisibilityevent:2.1.0' }

3) Add the following code to your activity onCreate method:

KeyboardVisibilityEvent.setEventListener(
        getActivity(),
        new KeyboardVisibilityEventListener() {
            @Override
            public void onVisibilityChanged(boolean isOpen) {
                // some code depending on keyboard visiblity status
            }
        });

Here is my Java file:

package com.example.eapple.tripdatacollection;

import android.annotation.SuppressLint;
import android.app.Fragment;
import android.app.FragmentTransaction;
import android.content.Context;
import android.content.res.Resources;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.design.widget.BottomNavigationView;
import android.support.v7.app.AppCompatActivity;
import android.util.DisplayMetrics;
import android.util.Log;
import android.util.TypedValue;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;

import net.yslibrary.android.keyboardvisibilityevent.KeyboardVisibilityEvent;
import net.yslibrary.android.keyboardvisibilityevent.KeyboardVisibilityEventListener;

public class Main2Activity extends AppCompatActivity {

    private static AddLocationFragment addLocationFragment;
    private static ProfileFragment profileFragment;
    private static SavedLocationsFragment savedLocationsFragment;
    private View rootView;
    private final String TAG = "Main2Activity";

    private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener
            = new BottomNavigationView.OnNavigationItemSelectedListener() {

        @Override
        public boolean onNavigationItemSelected(@NonNull MenuItem item) {
            switch (item.getItemId()) {
                case R.id.navigation_profile:
                    loadFragment(profileFragment);
                    return true;
                case R.id.navigation_saved_locations:
                    loadFragment(savedLocationsFragment);
                    return true;
                case R.id.navigation_add_location:
                    loadFragment(addLocationFragment);
                    return true;
            }
            return false;
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);

        addLocationFragment = new AddLocationFragment();
        savedLocationsFragment = new SavedLocationsFragment();
        profileFragment = new ProfileFragment();

        rootView = findViewById(R.id.root_view);

        final BottomNavigationView navigation = findViewById(R.id.navBar);
        navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener);
        navigation.setSelectedItemId(R.id.navigation_add_location);
        loadFragment(addLocationFragment);

        KeyboardVisibilityEvent.setEventListener(
                this,
                new KeyboardVisibilityEventListener() {
                    @Override
                    public void onVisibilityChanged(boolean isOpen) {
                        Log.d(TAG,"onVisibilityChanged: Keyboard visibility changed");
                        if(isOpen){
                            Log.d(TAG, "onVisibilityChanged: Keyboard is open");
                            navigation.setVisibility(View.INVISIBLE);
                            Log.d(TAG, "onVisibilityChanged: NavBar got Invisible");
                        }else{
                            Log.d(TAG, "onVisibilityChanged: Keyboard is closed");
                            navigation.setVisibility(View.VISIBLE);
                            Log.d(TAG, "onVisibilityChanged: NavBar got Visible");
                        }
                    }
                });
    }

    private void loadFragment(android.support.v4.app.Fragment fragment) {
        android.support.v4.app.FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
        fragmentTransaction.replace(R.id.fragment_container, fragment);
        fragmentTransaction.addToBackStack(null);
        fragmentTransaction.commit();
    }

}
Haroon khan
  • 1,018
  • 2
  • 15
  • 27
0

Kindly use android:isScrollContainer="false"; in your starting ScrollView tags in xml file.

Tyler2P
  • 2,324
  • 26
  • 22
  • 31
Momina Javed
  • 81
  • 2
  • 5