在片段之间切换时,底部导航栏会向下推

时间:2020-01-10 17:48:19

标签: java android android-studio bottomnavigationview

在我的活动中,我有一个底部导航栏,并且框架布局可以显示片段,但一切正常,但问题是当我按顺序从1-4开始移动时,底部导航栏保持在原位,但是当我突然跳下时从4到2,则底部导航栏不显示在屏幕上,再次单击同一项目后,它将回到正常位置。

该视频显然可以帮助您了解我的问题Click to watch.

我认为这是考虑UI时的主要问题,因此请帮助我如何实现此目标。为了简化工作,我发布了包含这些元素的代码。

activity_appMain.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".AppFragments.AppMain">

    <FrameLayout
        android:id="@+id/fragments_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_above="@id/navigation_bar"/>

    <com.google.android.material.bottomnavigation.BottomNavigationView
        android:id="@+id/navigation_bar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:background="?android:attr/windowBackground"
        app:labelVisibilityMode="labeled"
        app:menu="@menu/bottom_navigation" />

</RelativeLayout>

AppMain.java

package com.coderedinnovations.allioservices.AppFragments;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;

import android.content.pm.ActivityInfo;
import android.content.res.Configuration;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.view.MenuItem;
import android.view.WindowManager;

import com.coderedinnovations.allioservices.AppFragments.FeedbackFragment;
import com.coderedinnovations.allioservices.AppFragments.HomeFragment;
import com.coderedinnovations.allioservices.AppFragments.MyOrdersFragment;
import com.coderedinnovations.allioservices.AppFragments.MyProfileFragment;
import com.coderedinnovations.allioservices.R;
import com.google.android.material.bottomnavigation.BottomNavigationView;
import com.google.firebase.iid.FirebaseInstanceId;

public class AppMain extends AppCompatActivity {

    public void adjustFontScale(Configuration configuration){

        configuration.fontScale = (float) 0.9;
        DisplayMetrics metrics = getResources().getDisplayMetrics();
        WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
        wm.getDefaultDisplay().getMetrics(metrics);
        metrics.scaledDensity = configuration.fontScale * metrics.density;
        getBaseContext().getResources().updateConfiguration(configuration, metrics);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_app_main);
        adjustFontScale(getResources().getConfiguration());
        this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

        BottomNavigationView bottomNavigationView = findViewById(R.id.navigation_bar);
        bottomNavigationView.setOnNavigationItemSelectedListener(navigationItemSelectedListener);

        getSupportFragmentManager().beginTransaction().replace(R.id.fragments_container, new HomeFragment()).commit();
    }

    private BottomNavigationView.OnNavigationItemSelectedListener navigationItemSelectedListener =
            new BottomNavigationView.OnNavigationItemSelectedListener() {
                @Override
                public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
                    Fragment selectedFragment = null;

                    switch (menuItem.getItemId()){
                        case R.id.nav_home:
                            selectedFragment = new HomeFragment();
                            break;
                        case R.id.nav_orders:
                            selectedFragment = new MyOrdersFragment();
                            break;
                        case R.id.nav_feedback:
                            selectedFragment = new FeedbackFragment();
                            break;
                        case R.id.nav_profile:
                            selectedFragment = new MyProfileFragment();
                            break;
                    }

                    getSupportFragmentManager().beginTransaction().replace(R.id.fragments_container,selectedFragment).commit();
                    return true;
                }
            };
}

我正在寻找类似的问题,但没有一个得到回答

编辑:仅当我从后向前按下时,问题才会出现,但是当我从1-4前进时,不会出现问题,但是当我从4突然单击到任何其他选项卡时,栏会被向下推。 >

6 个答案:

答案 0 :(得分:1)

我真的感谢每个人为帮助我解决问题所做的努力。但是我以某种方式自己解决了这个问题。在这四个片段中,一个片段是指最后一个片段具有 Co-ordinator布局作为父布局,从而使底部的栏杆向下推。

所以我通过采用约束布局作为父布局解决了该问题,并将子项添加到其中。再次感谢大家。

答案 1 :(得分:0)

尝试一下:

1。将下边距55 dp添加到帧布局。 2.从framelayout中删除layout_above。 3.添加父项顶部为true,居中为父项。

答案 2 :(得分:0)

实际上,在足够类似的情况下,我所做的布局与您的布局完全不同。让我对其进行修改,看看是否可行。在我的情况下,我使用一个相对的布局而不是一个FrameLayout,里面有一个滚动视图,以允许任何高度的内容。这会将底部栏设置为始终漂浮在底部。

update_submodules.sh

在不太可能的情况下,框架布局无法正常工作,然后用相对布局包裹起来,尽管我认为您不需要这样做。

答案 3 :(得分:0)

我已经看过你的视频了。我复制了代码并在我的工作区中运行了它,但是工作正常。所以我实际上不知道问题出在哪里。您是否考虑过使用ConstraintLayout?我试图将您的xml布局更改为ConstraintLayout,而且效果也很好。

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

    <FrameLayout
        android:id="@+id/fragments_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintBottom_toTopOf="@id/navigation_bar"/>

    <com.google.android.material.bottomnavigation.BottomNavigationView
        android:id="@+id/navigation_bar"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:background="?android:attr/windowBackground"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:labelVisibilityMode="labeled"
        app:menu="@menu/bottom_navigation" />

</androidx.constraintlayout.widget.ConstraintLayout>

BottomNavigationView对父级底部的约束将使其停留在底部。并且不要忘记用BottomNavigationView约束FrameLayout,以使它们不会彼此重叠。

答案 4 :(得分:0)

我面临着同样的问题。这主要是因为在内屏中使用了coordinatorlayout。任何具有coordinatorlayout布局的屏幕都会使底部导航(放置在顶部)从其位​​置移动。

答案 5 :(得分:0)

https://stackoverflow.com/a/59844009/13124119-这个答案也对我有用!

在四个片段中,一个片段是我的意思是最后一个片段具有“协调器”布局作为父布局,从而使底部的栏杆向下推。

所以我通过将约束布局作为父布局并在其中添加了子项来解决了这个问题。

,您必须在协调器布局中添加以下属性。

app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"