单击导航抽屉上的项目时如何解决问题 TabLayouts?

Posted

技术标签:

【中文标题】单击导航抽屉上的项目时如何解决问题 TabLayouts?【英文标题】:How to solved issue TabLayouts when items on navigation drawer is clicked? 【发布时间】:2020-10-18 06:15:09 【问题描述】:

我对 android 开发非常陌生,因此,我无法通过其他互联网资源的帮助来解决我的问题。使用 Youtube 视频,我正在设计一个同时使用 NavigationDrawerTabLayout 的应用程序,并且所有 TabLayout 项目和导航抽屉项目都使用片段。我的问题是,当我单击导航抽屉中的项目时,应用程序仍然显示TabLayout 的片段,而不是显示与来自NavigationDrawer 的单击项目相对应的片段。 请帮我解决这个问题。 我在下面包含了代码,甚至还有一张图片.

MAIN_ACTIVITY

在主要活动中,我使用带有一些片段到个人片段的底部导航栏在片段中执行某些操作,例如我在主页片段选项卡中使用的可扩展列表视图。

            public class MainActivity extends AppCompatActivity 
            
                private DrawerLayout dl;
                private ActionBarDrawerToggle t;
                private NavigationView nv;
            
                BottomNavigationView bottomNavigationView;
            
                @Override
                protected void onCreate(Bundle savedInstanceState) 
                    super.onCreate(savedInstanceState);
                    setContentView(R.layout.activity_main);
            
                    ////////////////////////////////////////////////////
            
                    bottomNavigationView = findViewById(R.id.bottom_navigation);
                    BottomNavigationViewHelper.disableShiftMode(bottomNavigationView);
            
                    bottomNavigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() 
                        @Override
                        public boolean onNavigationItemSelected(@NonNull MenuItem item) 
            
                            Fragment selectedFragment = null;
            
                            switch (item.getItemId()) 
                                case R.id.action_home:
                                    selectedFragment = HomeFragment.getInstance();
                                    break;
            
                                case R.id.action_hospital:
                                    selectedFragment = HospitalFragment.getInstance();
                                    break;
            
                                case R.id.action_shipping:
                                    selectedFragment = ShippingFragment.getInstance();
                                    break;
            
                                case R.id.action_notify:
                                    selectedFragment = NotifyFragment.getInstance();
                                    break;
                            
            
                            FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
                            transaction.replace(R.id.main_frame, selectedFragment);
                            transaction.commit();
                            return false;
                        
                    );
                    setDefaultFragment();
            
            
                    dl = (DrawerLayout) findViewById(R.id.activity_main);
                    t = new ActionBarDrawerToggle(this, dl, R.string.Open, R.string.Close);
                    t = new ActionBarDrawerToggle(this, dl, R.string.Open, R.string.Close);
                    dl.addDrawerListener(t);
                    t.setDrawerIndicatorEnabled(true);
                    t.syncState();
            
                    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
            
                    nv = (NavigationView) findViewById(R.id.nv);
                    nv.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() 
                        @Override
                        public boolean onNavigationItemSelected(@NonNull MenuItem item) 
                            int id = item.getItemId();
                            switch (id) 
                                case R.id.account:
            //                        Intent intent = new Intent(MainActivity.this,SecondActivity.class);
            //                        startActivity(intent);
                                    Toast.makeText(MainActivity.this, "My Account", Toast.LENGTH_SHORT).show();
                                    break;
                                case R.id.settings:
                                    Toast.makeText(MainActivity.this, "Settings", Toast.LENGTH_SHORT).show();
                                    break;
                                case R.id.mycart:
                                    Toast.makeText(MainActivity.this, "My Cart", Toast.LENGTH_SHORT).show();
                                    break;
                                default:
                                    return true;
                            
                            return true;
                        
                    );
                
            
                @Override
                public boolean onOptionsItemSelected(MenuItem item) 
            
                    if (t.onOptionsItemSelected(item))
                        return true;
            
                    return super.onOptionsItemSelected(item);
                
            
            
                private void setDefaultFragment() 
                    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
                    transaction.replace(R.id.main_frame, HomeFragment.getInstance());
                    transaction.commit();
                
            
        
        
          [1]: https://i.stack.imgur.com/p8DKL.png
        
        

我在这个主要活动中使用的主要 xml 文件我使用底部导航栏和一些片段到个人片段在片段中做一些事情,比如我在主页片段选项卡中使用的可扩展列表视图。

Main_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_
            android:layout_
            tools:context=".MainActivity">
        
        
            <androidx.drawerlayout.widget.DrawerLayout
                android:id="@+id/activity_main"
                android:layout_
                android:layout_
                android:background="@android:color/holo_green_dark">
        
                <com.google.android.material.navigation.NavigationView
                    android:layout_
                    android:layout_
                    app:menu="@menu/navigation_menu"
                    android:layout_gravity="start"
                    app:headerLayout="@layout/nav_header"
                    android:id="@+id/nv">
        
                </com.google.android.material.navigation.NavigationView>
        
        
        
            </androidx.drawerlayout.widget.DrawerLayout>
        
            <FrameLayout
                android:id="@+id/main_frame"
                android:layout_above="@id/bottom_navigation"
                android:layout_
                android:layout_/>
        
            <com.google.android.material.bottomnavigation.BottomNavigationView
                android:layout_
                android:layout_
                android:id="@+id/bottom_navigation"
                android:layout_alignParentBottom="true"
                android:layout_alignParentStart="true"
                android:background="@android:color/white"
                app:menu="@menu/bottom_menu"/>
        
        </RelativeLayout>`
        
        

HomeFragment

在这个项目中,我创建了 4 个片段,我描述了 3 个选项卡>导航抽屉是滑动的,tablayout 不可见在主要活动中,我使用底部导航栏和一些片段到个人片段来做某事在我在主片段选项卡中使用的可扩展列表视图之类的片段中。

        import android.os.Bundle;
        import android.view.LayoutInflater;
        import android.view.View;
        import android.view.ViewGroup;
        
        import androidx.annotation.Nullable;
        import androidx.fragment.app.Fragment;
        import androidx.viewpager.widget.ViewPager;
        
        import com.google.android.material.tabs.TabLayout;
        
        import kk.techbytecare.bottomnavigationview.Adapter.SectionPagerAdapter;
        import kk.techbytecare.bottomnavigationview.R;
        
        public class HomeFragment extends Fragment 
        
            View myFragment;
        
            ViewPager viewPager;
            TabLayout tabLayout;
        
        
            public HomeFragment() 
                // Required empty public constructor
            
        
            public static HomeFragment getInstance()    
                return new HomeFragment();
            
        
        
            @Override
            public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                     Bundle savedInstanceState) 
                // Inflate the layout for this fragment
                myFragment = inflater.inflate(R.layout.fragment_home, container, false);
        
                viewPager = myFragment.findViewById(R.id.viewPager);
                tabLayout = myFragment.findViewById(R.id.tabLayout);
        
                return myFragment;
            
        
            >Call onActivity Create method
        
        
            @Override
            public void onActivityCreated(@Nullable Bundle savedInstanceState) 
                super.onActivityCreated(savedInstanceState);
        
                setUpViewPager(viewPager);
                tabLayout.setupWithViewPager(viewPager);
        
                tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() 
                    @Override
                    public void onTabSelected(TabLayout.Tab tab) 
        
                    
        
                    @Override
                    public void onTabUnselected(TabLayout.Tab tab) 
        
                    
        
                    @Override
                    public void onTabReselected(TabLayout.Tab tab) 
        
                    
                );
            
        
            private void setUpViewPager(ViewPager viewPager) 
                SectionPagerAdapter adapter = new SectionPagerAdapter(getChildFragmentManager());
        
                adapter.addFragment(new FixtureFragment(), "Fixtures");
                adapter.addFragment(new LiveFragment(), "Live");
                adapter.addFragment(new ResultFragment(),"Result");
        
                viewPager.setAdapter(adapter);
            
        
    
    
    **HomeFragment_XML**
    
>this is home fragment XML file so the problem is this the navigation drawer is swipe the tablayout is not visible In main activity I'm use bottom navigation bar with some fragment to individuals fragment to do something in the fragment like expandable listview I'm using in the home fragment tab .
        <?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_
        android:layout_
        android:id="@+id/rela"
        tools:context=".Fragment.HomeFragment">
    
        <LinearLayout
            android:orientation="vertical"
            android:layout_
            android:layout_>
    
            <TextView
                android:layout_margin="20dp"
                android:layout_
                android:layout_
                android:text="Home Fragment"
                android:textAlignment="center"
                android:textSize="30sp" />
    
            <com.google.android.material.appbar.AppBarLayout
                android:id="@+id/appBarLayout"
                android:layout_
                android:layout_
                android:background="@android:color/white">
    
                <com.google.android.material.tabs.TabLayout
                    android:id="@+id/tabLayout"
                    android:layout_
                    android:layout_>
    
                </com.google.android.material.tabs.TabLayout>
    
            </com.google.android.material.appbar.AppBarLayout>
    
            <androidx.viewpager.widget.ViewPager
                android:id="@+id/viewPager"
                android:layout_
                android:layout_/>
    
        </LinearLayout>
    
    </RelativeLayout>

在这个项目中,我使用的是 androidx 依赖项 在主要活动中,我使用带有一些片段到个人片段的底部导航栏在片段中执行某些操作,例如我在主页片段选项卡中使用的可扩展列表视图。

【问题讨论】:

您好,您只是在显示 Toast 消息,当您从抽屉中点击物品时..您没有进行任何片段交易..检查nv.setNavigationItemSelectedListener的代码 检查我的图像。我的应用程序运行良好,但没有显示错误。 @Zain 发布您的布局 现在检查@GabrieleMariotti 【参考方案1】:

您的问题在这里:

        <androidx.drawerlayout.widget.DrawerLayout
          .....>

            <com.google.android.material.navigation.NavigationView
                android:layout_gravity="start"
                ../>
    
        </androidx.drawerlayout.widget.DrawerLayout>

        <FrameLayout
         .../>

改为:

        <androidx.drawerlayout.widget.DrawerLayout
          .....>

            <!-- Main Content -->
            <FrameLayout
              .../>

            <com.google.android.material.navigation.NavigationView
                android:layout_gravity="start"
                ../>
    
        </androidx.drawerlayout.widget.DrawerLayout>

【讨论】:

以上是关于单击导航抽屉上的项目时如何解决问题 TabLayouts?的主要内容,如果未能解决你的问题,请参考以下文章

在导航抽屉项目单击时,导航抽屉中的新列表视图

侧面导航抽屉项目单击不起作用

在导航抽屉项目单击上启动新活动

导航抽屉:如何在启动时设置所选项目?

单击抽屉的任何项目而不在android中关闭时更改导航抽屉内的视图和内容

反应本机抽屉导航在按钮单击时不起作用