'Bottom Navigation bar moves up with keyboard
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.
Solution 1:[1]
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();
}
}
Solution 2:[2]
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>
Solution 3:[3]
Kindly use android:isScrollContainer="false";
in your starting ScrollView
tags in xml file.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | Haroon khan |
Solution 2 | Ivan |
Solution 3 | Tyler2P |