【问题标题】:How to solve navigation bar with navigation bottom problem如何解决导航栏有导航底部的问题
【发布时间】:2019-08-20 11:41:00
【问题描述】:

我的问题是我正在尝试制作一个简单的应用程序,并且我在同一个活动中使用了导航栏和底部导航,但是我遇到了一个简单的问题,例如当我运行应用程序时,我在主页片段,但是当我拖动导航栏并单击电影时,它会进入电影片段,并且我的电影项目已被选中,但问题是当我再次单击底部导航菜单中的主页而不是导航菜单中的电影项目时仍然被检查。请告诉我如果我在底部导航中单击主页然后在我的导航栏中我的电影项目变为未选中状态,我该怎么做。

希望你能理解我的问题

这是我的代码:-

主要活动:-

public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener {

    private FirebaseAuth mAuth;
    private DrawerLayout drawerLayout;
    private BottomNavigationView.OnNavigationItemSelectedListener navListener =
            new BottomNavigationView.OnNavigationItemSelectedListener() {
                @Override
                public boolean onNavigationItemSelected(@NonNull MenuItem item) {
                    Fragment selectedFragment = null;

                    switch (item.getItemId()) {
                        case R.id.nav_home:
                            selectedFragment = new HomeFragment();

                            break;
                        case R.id.nav_search:
                            selectedFragment = new SearchFragment();
                            break;
                        case R.id.nav_features:
                            selectedFragment = new FeaturesFragment();
                            break;
                        case R.id.nav_myMusic:
                            selectedFragment = new MyMusicFragment();
                            break;

                    }
                    assert selectedFragment != null;
                    getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
                            selectedFragment).commit();
                    return true;
                }
            };

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        NavigationView navigationView = findViewById(R.id.nav_view);
        navigationView.setNavigationItemSelectedListener(this);
        drawerLayout = findViewById(R.id.Drawyer_layout);


        ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this, drawerLayout, R.string.navigation_drawer_open,
                R.string.navigation_drawer_close);
        drawerLayout.addDrawerListener(toggle);
        toggle.syncState();


        mAuth = FirebaseAuth.getInstance();

        BottomNavigationView bottomNavigationView = findViewById(R.id.bottom_navigation);
        bottomNavigationView.setOnNavigationItemSelectedListener(navListener);

        Fragment selections = null;

        if (savedInstanceState == null) {


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

    }

    @Override
    protected void onStart() {
        super.onStart();
        FirebaseUser currentuser;
        currentuser = mAuth.getCurrentUser();

        if (currentuser == null) {
            SendUserToSelectTypeActivity();
        }
    }

    private void SendUserToSelectTypeActivity() {

        Intent testintent = new Intent(MainActivity.this, Selecttype.class);
        testintent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
        startActivity(testintent);
        overridePendingTransition(R.anim.slide_in_right, R.anim.slide_out_right);
        finish();

    }

    @Override
    public boolean onNavigationItemSelected(@NonNull MenuItem item) {
        switch (item.getItemId()) {

            case R.id.nav_Movies:
                getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
                        new MoviesFragment()).commit();

                break;
            case R.id.nav_log_out:
                SendUserToSelectTypeActivity();
                mAuth.signOut();
                break;
            case R.id.nav_live:
                getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container
                        , new LiveVideosFragment()).commit();
        }
        drawerLayout.closeDrawer(GravityCompat.START);
        return true;
    }

    @Override
    public void onBackPressed() {
        if (drawerLayout.isDrawerOpen(GravityCompat.START)) {
            drawerLayout.closeDrawer(GravityCompat.START);
        } else {
            super.onBackPressed();
        }
    }
}

HomeFragment : -

public class HomeFragment extends Fragment {

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_home , container , false);

    }
}

导航菜单:-

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    tools:showIn="navigation_view">

    <group android:checkableBehavior="single">
        <item
            android:id="@+id/nav_Movies"
            android:icon="@drawable/ic_movie"
            android:title="Movies" />
        <item
            android:id="@+id/nav_live"
            android:icon="@drawable/ic_movie"
            android:title="Live Videos" />
    </group>

    <item android:title="Communicate">
        <menu>
            <item
                android:id="@+id/nav_share"
                android:icon="@drawable/ic_share_black_24dp"
                android:title="Share" />
            <item
                android:id="@+id/nav_contact"
                android:icon="@drawable/ic_report_black_24dp"
                android:title="Report us" />
            <item
                android:id="@+id/nav_log_out"
                android:icon="@drawable/ic_arrow_back_black_24dp"
                android:title="Log Out" />

        </menu>
    </item>

</menu>

活动 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/Drawyer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#ffffff"
    android:fitsSystemWindows="true"
    tools:context=".MainClasses.MainActivity"
    tools:openDrawer="start">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">


    </LinearLayout>


    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <FrameLayout
            android:id="@+id/fragment_container"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_above="@+id/bottom_navigation">

        </FrameLayout>

        <com.google.android.material.bottomnavigation.BottomNavigationView
            android:id="@+id/bottom_navigation"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:background="@color/design_default_color_primary_dark"
            app:itemIconTint="@color/White"
            app:itemTextColor="@color/White"
            app:menu="@menu/bottom_navigation_menu" />


    </RelativeLayout>




    <com.google.android.material.navigation.NavigationView
        android:id="@+id/nav_view"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        app:headerLayout="@layout/nav_header"
        app:menu="@menu/naviation_menu_main"
        >

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


</androidx.drawerlayout.widget.DrawerLayout>

如果你找到解决办法请回答我

【问题讨论】:

  • 如果我理解正确 - 那么您需要(部分)将您的 bottom_navigationbar 所选项目同步到 navigationDrawer 的项目?
  • 将您的价值观保存在 sharedpreferences 中
  • 为什么需要 SharedPrefernces。他在同一个活动中,只有他必须取消选中并选中菜单项。
  • 如果有人不明白我会为我的问题制作视频,如果你愿意,请评论我是的

标签: java android


【解决方案1】:

制作一个可绘制的文件,如“bottom_icon_color.xml”

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_checked="true" android:color="@color/red" />
    <item android:state_checked="false" android:color="@color/lightgray"  />
</selector>

然后将其应用到您的底部导航

 app:itemIconTint="@drawable/bottom_icon_color"
 app:itemTextColor="@drawable/bottom_icon_color"

【讨论】:

  • 首先,正确阅读他的问题。他必须更改导航视图项目的选中状态,并且他必须同步底部导航和导航视图项目的选中和取消选中状态。
【解决方案2】:

根据你在问题中提到的问题 您必须先存储之前单击的 MenuItem,然后使用 MenuItem 的 setCheckable(false) 将其设为未选中。

我假设其余所有功能都在工作,例如,当底部导航项被选中时,检查 NavigationView 的项。

在您的 onNavigationItemSelected 商店中,在一个变量中单击的 MenuItem 表示 MenuItem 类型的 prevMenuItem。 现在在您的 BottomNavigationView.OnNavigationItemSelectedListener() 中,使用 this 将此 prevMenuItem 设为未选中。

NavigationView navigationView = findViewById(R.id.nav_view);
navigationView.getMenu().findItem(previousMenuItem.getId()).setCheckable(false);

【讨论】:

  • 兄弟我没有导航视图变量你能解释一下吗
  • 获取您在activity_main.xml布局文件com.google.android.material.navigation.NavigationView中使用的导航视图
猜你喜欢
  • 2022-07-11
  • 2020-06-18
  • 1970-01-01
  • 1970-01-01
  • 2023-02-25
  • 1970-01-01
  • 2021-12-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多