фрагменты, наложенные на нижнюю навигацию и макет ящика с использованием viewpager 2 в приложении для Android

avatar
Mauricio
9 августа 2021 в 03:55
105
0
0

Я почти новичок в программировании для Android, и до сих пор есть вещи, с которыми я не очень хорошо справляюсь. Теперь я делаю проект на Android с использованием java, который меня наполовину расстроил, так как я пытался найти и решить проблему в течение НЕДЕЛЬ, но я до сих пор не могу определить, в чем она заключается. Приложение состоит из представления, которое содержит макет ящика с рядом «параметров», оно также содержит viewpager2 и нижнюю навигацию с двумя другими «параметрами». Ошибка появляется, когда я нажимаю нижние навигационные вкладки, так как два фрагмента они перекрывают друг друга, то же самое происходит, когда я выбираю вариант из навигационного ящика, фрагменты накладываются друг на друга, затем я оставляю вам часть своего кода, так что я надеюсь, что вы можете мне помочь, большое спасибо, что нашли время, чтобы помочь мне.

основной:

public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener {
    DrawerLayout drawerLayout;
    ActionBarDrawerToggle actionBarDrawerToggle;
    Toolbar toolbar;
    NavigationView navigationView;
    //variables para cargar el fragment
    FragmentManager fragmentManager;
    FragmentTransaction fragmentTransaction;
    String personName;
    ViewPager2 viewPager2;
    BottomNavigationView  bottomNavigationView;
    ViewPagerAdapter adapter;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        toolbar=findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);//se pasa el toolbar
        drawerLayout=findViewById(R.id.drawer);
        navigationView=findViewById(R.id.navigationView);
        navigationView.setNavigationItemSelectedListener(this);
        actionBarDrawerToggle=new ActionBarDrawerToggle(this,drawerLayout,toolbar,R.string.open,R.string.close);
        drawerLayout.addDrawerListener(actionBarDrawerToggle);
        actionBarDrawerToggle.setDrawerIndicatorEnabled(true);
        actionBarDrawerToggle.syncState();
        initView();


    }


    @Override
    public boolean onNavigationItemSelected(@NonNull MenuItem item) {
        if (item.getItemId() == R.id.user){
            FragmentManager fragmentManager;
            FragmentTransaction fragmentTransaction;
            fragmentManager=getSupportFragmentManager();
            fragmentTransaction=fragmentManager.beginTransaction();
            fragmentTransaction.replace(R.id.container, new perfil_user());
            fragmentTransaction.commit();

        }
        else if (item.getItemId() == R.id.exit){
            finish();

        }
        //aquí van las otros fragment
        drawerLayout.closeDrawer(GravityCompat.START);
        return false;
    }
    private void initView() {
        viewPager2 = findViewById(R.id.vp_horizontal_ntb);
        viewPager2.setOffscreenPageLimit(100);
        bottomNavigationView = findViewById(R.id.navigation);
        adapter = new ViewPagerAdapter(this);
        viewPager2.setAdapter(adapter);

       bottomNavigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
           @Override
           public boolean onNavigationItemSelected(@NonNull MenuItem item) {
               Fragment fragment=null;
               switch (item.getItemId()){
                   case R.id.perfil:
                       fragment=new perfil_user();
                       break;
                   case R.id.generar_debate:
                       fragment=new genera_debate();
                       break;

               }

               if (fragment != null) {
                   FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
                   transaction.replace(R.id.container, fragment);
                   transaction.addToBackStack(null);
                   transaction.commit();
               }
               return true;
           }

       });
    }
}

файлы xml:

содержимое main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent"

    >
    <FrameLayout
        android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </FrameLayout>
</LinearLayout>

панель инструментов ящика:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
<androidx.appcompat.widget.Toolbar
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    android:background="#067B30"
    android:theme="@style/ThemeOverlay.AppCompat.Dark"
>

</androidx.appcompat.widget.Toolbar>
    <com.google.android.material.appbar.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:elevation="0dp"/>
    <com.google.android.material.bottomnavigation.BottomNavigationView
        android:id="@+id/navigation"
        app:menu="@menu/bottom_navigation"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom"
        android:background="?android:attr/windowBackground"
        android:foreground="?attr/selectableItemBackground" />

    <androidx.viewpager2.widget.ViewPager2
        android:id="@+id/vp_horizontal_ntb"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior" />

активность main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.drawerlayout.widget.DrawerLayout 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:id="@+id/drawer"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
    <include
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        layout="@layout/drawer_toolbar"
        >

    </include>
    <include
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        layout="@layout/content_main"
        >

    </include>
    <com.google.android.material.navigation.NavigationView
        android:id="@+id/navigationView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:menu="@menu/drawer_menu"
        app:headerLayout="@layout/drawer_header"
        android:layout_gravity="start"
        android:fitsSystemWindows="true"
        >

    </com.google.android.material.navigation.NavigationView>



</androidx.drawerlayout.widget.DrawerLayout>

Источник
Android Geek
9 августа 2021 в 04:23
0

Можете ли вы поделиться скриншотами ожидаемого дизайна и вашего текущего дизайна?

Vatsal Dholakiya
9 августа 2021 в 05:13
0

Попробуйте добавить фрагментTransaction.addToBackStack(null); к выбранному слушателю элемента навигационного ящика и посмотрите здесь coderhelper.com/a/67389269/12660050 Примечание. Возможно, вам потребуется вернуть true в onNavigationItemSelected().

Mauricio
9 августа 2021 в 07:41
0

@Vatsal Dholakiya, если бы я сделал addToBackStack (null); но даже при этом фрагменты навигационного ящика накладываются друг на друга, что касается возврата true, если он делает это в коде, который я добавил

Mauricio
9 августа 2021 в 07:45
0

@Android Geek не друг, к сожалению, я не знаю, почему coderhelper не позволяет мне загружать фотографии

Mauricio
9 августа 2021 в 07:56
0

Кто-нибудь знает, есть ли способ оставить фрагмент контейнера пустым после выполнения перехода между фрагментами?

Vatsal Dholakiya
9 августа 2021 в 08:18
0

Да, я думаю, что "transaction.replace(R.id.nav_host_fragment, null);" может помочь оставить фрагмент контейнера пустым.

Mauricio
9 августа 2021 в 13:26
0

Я попытался удалить метод initview, который связан с нижней навигацией, и благодаря этому панель навигации работает плавно, ничего не перекрывается, надеюсь, кто-то поможет мне интегрировать оба компонента, не доставляя мне никаких проблем.

chrisu.chrisu
10 апреля 2022 в 18:15
0

не могли бы вы помочь здесь? coderhelper.com/questions/71800232/…

Ответы (0)