底部导航栏通过键盘向上移动

时间:2018-09-18 17:23:51

标签: android xml scrollview bottomnavigationview

我在一个片段中使用滚动视图,但是按原样显示键盘时屏幕没有向上滚动。 这是场景: 我有mainActivity,它具有底部导航栏以及一个框架布局,可作为活动的容器。 这是代码:

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

片段屏幕具有一些输入字段以及一些按钮,这些按钮包装在受约束的布局中,然后受约束的布局被包裹在scrollView中,以便在键盘处于活动状态时可以向上滚动。 这是片段xml文件的代码:

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

这也是我的清单文件:

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

但是它不能按预期工作。 1)底部导航栏与键盘一起显示,如下所示:Screenshot

我希望底部的导航栏保持在底部或在键盘处于活动状态时消失。

2 个答案:

答案 0 :(得分:0)

这是解决方案,我如何使用以下https://github.com/yshrsmz/KeyboardVisibilityEvent这个api解决问题。

步骤:

1)在您的androidManifest文件中:

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

就像我在这里所做的:

<?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)在您的build.grade文件(应用程序)中添加以下依赖项

依赖项{     实施'net.yslibrary.keyboardvisibilityevent:keyboardvisibilityevent:2.1.0' }

3)将以下代码添加到您的活动onCreate方法中:

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

这是我的Java文件:

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();
    }

}

答案 1 :(得分:0)

就我而言,仅将android:windowSoftInputMode =“ adjustPan”添加到我的AndroidManifest文件中就足够了,如下所示:

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