Нижняя панель навигации перемещается вниз при переключении между фрагментами - PullRequest
0 голосов
/ 10 января 2020

В моей деятельности у меня есть нижняя панель навигации и компоновка кадра, чтобы показать фрагменты, все работает нормально, но проблема в том, что когда я начинаю переходить с 1 - 4 последовательно, нижняя панель навигации остается на своем месте, но когда я прыгаю внезапно от 4 до 2, то нижняя панель навигации выходит за пределы экрана, и при повторном нажатии на тот же элемент она возвращается в нормальное положение.

Это видео поможет вам понять, в чем заключается моя проблема Нажмите, чтобы посмотреть.

, так как я думаю, что это серьезная проблема при рассмотрении пользовательского интерфейса, поэтому любезно помогите мне как Могу ли я достичь этого. Для облегчения работы я публикую свои коды, содержащие эти элементы.

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

I искал похожий вопрос, подобный этому, но ни на один из них не было ответа

Редактировать: проблема появляется, только когда я нажимаю сзади вперед, но когда я иду с 1-4, проблема не возникает, но когда я внезапно щелкаю от 4 до любой другой вкладки, панель опускается вниз.

Ответы [ 4 ]

0 голосов
/ 21 января 2020

Я действительно благодарю всех за помощь в решении этой проблемы. но каким-то образом я решил эту проблему самостоятельно. В четырех фрагментах, один из фрагментов, я имею в виду последний фрагмент, имеет макет Координатор в качестве родительского макета, так что нижняя полоса переместилась на pu sh вниз.

, поэтому я решил проблему, взяв Макет ограничения в качестве родительского макета и добавив в него дочерний элемент. спасибо всем снова.

0 голосов
/ 10 января 2020

Я на самом деле сделал макет, совершенно отличающийся от вашего в достаточно похожем сценарии. Позвольте мне изменить это и посмотреть, если это работает. В моем случае вместо FrameLayout я использую относительный макет с прокруткой внутри, чтобы разрешить содержимое любой высоты. Это заставляет нижнюю планку всегда плавать внизу.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
    android:orientation="vertical">

<FrameLayout
    android:id="@+id/fragments_container"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_weight="1"/>

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

</LinearLayout>

В противном случае структура фрейма не будет работать правильно, затем оберните ее относительной компоновкой, хотя я не думаю, что вам это понадобится.

0 голосов
/ 12 января 2020

Я уже смотрел ваше видео. Я скопировал ваш код и запустил его в своем рабочем пространстве, но он работает нормально. Так что я на самом деле не знаю, в чем проблема. Вы рассматривали возможность использования 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 на низ родительского элемента заставит его остаться на дне , И не забудьте указать свой FrameLayout с BottomNavigationView, чтобы они не накладывались друг на друга.

0 голосов
/ 10 января 2020

Попробуйте это:

1.Добавьте нижнее поле 55 dp в framelayout. 2. удалите layout_above из framelayout. 3. добавьте родительский top true, центр в родительский true.

...