java - 在 fragment 之间更改时底部导航栏会向下推

标签 java android android-studio bottomnavigationview

在我的 Activity 中,我有一个底部导航栏和框架布局来显示 fragment ,一切正常,但问题是当我开始按顺序从 1 - 4 移动时,底部导航栏保持在其位置,但当我突然跳跃时从 4 到 2,然后底部导航栏就会超出屏幕,当再次单击同一项目时,它就会回到正常位置。

该视频将清楚地帮助您了解我的问题是什么 Click to watch.

因为我认为这是考虑用户界面时的一个主要问题,所以请帮助我如何实现这一目标。为了使事情变得更容易,我发布了包含这些元素的代码。

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 单击到任何其他选项卡时,栏会被推下。

最佳答案

非常感谢大家为帮助我解决问题所做的努力。但不知何故,我自己解决了这个问题。在四个 fragment 中,其中一个 fragment 我的意思是最后一个 fragment 将 协调器布局 作为父布局,以便使底部栏向下推。

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

关于java - 在 fragment 之间更改时底部导航栏会向下推,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59686659/

相关文章:

java Nashorn ReferenceError

java - 如何查看 JVM 内部(?)。我可以在工作应用程序中分析方法、参数、返回值等吗?

android - Android 谷歌地图中未启用位置按钮

java - 无法选择要在 ImageView 中显示的图像

java - 我无法使用 aries jpa/v2.0.0 和 transactions/v2.0.0

java - 使用 Java 8 在嵌入式 Tomcat 8.5 上启用 TLS 握手的可观察性(日志记录/指标)

android - Android中如何设置字符串的值?

android - 解析最近 5 分钟内创建的对象的查询

java - 有没有办法让 "folded code"在 Android Studio 中保持折叠状态?

android - 无法将 Eclipse 项目导入 Android Studio