抽屉打开并正常运行。当我选择一个选项时,它会更改为正确的碎片,但抽屉保持打开状态。怎么解决?
我的主要活动
package com.example.duolingo;
import static com.example.duolingo.R.id.nav_host_fragment_content_main;
import android.os.Bundle;
import android.util.Log;
import android.view.MenuItem;
import android.widget.FrameLayout;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.view.GravityCompat;
import androidx.drawerlayout.widget.DrawerLayout;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentTransaction;
import androidx.navigation.NavController;
import androidx.navigation.Navigation;
import androidx.navigation.ui.AppBarConfiguration;
import androidx.navigation.ui.NavigationUI;
import com.example.duolingo.databinding.ActivityMainBinding;
import com.google.android.material.bottomnavigation.BottomNavigationView;
import com.google.android.material.navigation.NavigationView;
import java.util.Locale;
public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener {
private AppBarConfiguration mAppBarConfiguration;
private ActivityMainBinding binding;
private FrameLayout main_frame;
private TextView drawerProfileName, drawerProfileText;
private BottomNavigationView bottomNavigationView;
private BottomNavigationView.OnNavigationItemSelectedListener onNavigationItemSelectedListener=
new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
switch (menuItem.getItemId())
{
case R.id.nav_home:
setFragement(new CategoryFragment());
return true;
case R.id.nav_leaderboard:
setFragement(new LeaderBoardFragment());
return true;
case R.id.nav_account:
setFragement(new AccountFragment());
return true;
}
return false;
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = ActivityMainBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
setSupportActionBar(binding.appBarMain.toolbar);
bottomNavigationView=findViewById(R.id.bottom_nav_bar);
main_frame= findViewById(R.id.main_frame);
bottomNavigationView.setOnNavigationItemSelectedListener(onNavigationItemSelectedListener);
DrawerLayout drawer = binding.drawerLayout;
NavigationView navigationView = binding.navView;
Passing each menu ID as a set of Ids because each
menu should be considered as top level destinations.
mAppBarConfiguration = new AppBarConfiguration.Builder(
R.id.nav_home, R.id.nav_gallery, R.id.nav_slideshow)
stack overflow
.setDrawerLayout(drawer)
.build();
drawerProfileName = navigationView.getHeaderView(0).findViewById(R.id.nav_drawer_name);
drawerProfileText = navigationView.getHeaderView(0).findViewById(R.id.nav_drawer_text_img);
String name = DbQuery.myProfile.getName();
drawerProfileName.setText(name);
drawerProfileText.setText(name.toUpperCase(Locale.ROOT).substring(0,1));
setFragement(new CategoryFragment());
NavController navController = Navigation.findNavController(this, nav_host_fragment_content_main);
NavigationUI.setupActionBarWithNavController(this, navController, mAppBarConfiguration);
NavigationUI.setupWithNavController(navigationView, navController);
navigationView.setNavigationItemSelectedListener(this);
}
private void setFragement(Fragment fragement)
{
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(main_frame.getId(),fragement);
transaction.commit();
}
@Override
public boolean onSupportNavigateUp() {
NavController navController = Navigation.findNavController(this, nav_host_fragment_content_main);
return NavigationUI.navigateUp(navController, mAppBarConfiguration)
super.onSupportNavigateUp();
}
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
Log.d("edo","mphka1");
int id = menuItem.getItemId();
if (id == R.id.nav_home) {
setFragement(new CategoryFragment());
return true;
}
else if (id == R.id.nav_leaderboard) {
Handle the gallery action
setFragement(new LeaderBoardFragment());
return true;
}
else if (id == R.id.nav_account) {
Handle the slideshow action
setFragement(new AccountFragment());
return true;
}
DrawerLayout drawer = binding.drawerLayout;
drawer.closeDrawer(GravityCompat.START);
return true;
}
@Override
public void onPointerCaptureChanged(boolean hasCapture) {
super.onPointerCaptureChanged(hasCapture);
}
}
content_main
<?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"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/main_background"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:showIn="@layout/app_bar_main">
<fragment
android:id="@+id/nav_host_fragment_content_main"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:defaultNavHost="true"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:navGraph="@navigation/mobile_navigation" />
<com.google.android.material.bottomnavigation.BottomNavigationView
android:id="@+id/bottom_nav_bar"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:background="?android:attr/windowBackground"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:menu="@menu/bottom_menu">
</com.google.android.material.bottomnavigation.BottomNavigationView>
<FrameLayout
android:id="@+id/main_frame"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintBottom_toTopOf="@+id/bottom_nav_bar"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
</FrameLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
如果我单击主页,抽屉将关闭。在我看来是因为 content_main 中的片段。
这两行正确吗?
DrawerLayout drawer = binding.drawerLayout;
drawer.closeDrawer(GravityCompat.START);
if (id == R.id.nav_home) {
setFragement(新
分类片段());
drawer.closeDrawer(GravityCompat.START);
return true;
}