无法为导航抽屉 + 底部应用栏中的选定项设置颜色/背景选择



我正在使用以下示例中的BottomNavigationDrawer/BottomSheetDialog,但我无法在底部导航菜单中设置所选项目的文本和背景颜色。

我已经尝试了以下SO问题的解决方案,但似乎根本没有效果,我的菜单都以颜色显示菜单背景颜色(白色(,没有分隔符或指示已选择项目。

我试过这个问题,这个问题,这个,这个和这个问题,都无济于事。

谁能向我指出我做错了什么?此时,我的代码如下:

底部工作表对话框片段

public class BottomNavigationDrawerFragment extends BottomSheetDialogFragment {
BottomNavigationDrawerFragment fragment;
NavigationView navigationView;
ImageView close, menu;
Statuser statuser;
RevivDatabase database;
String email, fname, lname;
TextView txtUsername, txtEmail;
public BottomNavigationDrawerFragment() {
// Required empty public constructor
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view =  inflater.inflate(R.layout.fragment_bottomsheet, container, false);
txtUsername = view.findViewById(R.id.txtUsername);
txtEmail = view.findViewById(R.id.txtEmail);
navigationView = view.findViewById(R.id.navigation_view);
database = RevivDatabase.getDatabase(getActivity());
statuser = database.revivDao().getUserDetails();
fname = statuser.getFname();
lname = statuser.getLname();
email = statuser.getEmail();
txtEmail.setText(email);
txtUsername.setText(fname+" "+lname);
close = view.findViewById(R.id.imgClose);
fragment = this;
close.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
fragment.dismiss();
}
});
navigationView.setItemIconTintList(null);
navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
menuItem.setChecked(true);
int id = menuItem.getItemId();
switch (id){
case R.id.app_bar_incident:
navigationView.getMenu().findItem(id).setChecked(true);
getActivity().getSupportFragmentManager().beginTransaction().replace(R.id.containerFrameLayout, new FragmentRevivIncidentDashboard()).commit();
fragment.dismiss();
break;
case R.id.app_bar_housecall:
navigationView.getMenu().findItem(id).setChecked(true);
getActivity().getSupportFragmentManager().beginTransaction().replace(R.id.containerFrameLayout, new FragmentRevivHousecallDashboard()).commit();
fragment.dismiss();
Toast.makeText(getContext(), "Request Housecall", Toast.LENGTH_SHORT).show();
break;
case R.id.settings:
navigationView.getMenu().findItem(id).setChecked(true);
getActivity().getSupportFragmentManager().beginTransaction().replace(R.id.containerFrameLayout, new FragmentRevivSettingsMain()).commit();
Toast.makeText(getActivity().getApplicationContext(), "Settings", Toast.LENGTH_SHORT).show();
fragment.dismiss();
break;
}
return true;
}
});

return view;
}
}

底表布局

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.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:id="@+id/bottomsheet_menu"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:alpha="1">
<android.support.constraint.ConstraintLayout
android:id="@+id/constraintLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/colorPrimary"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent">
<TextView
android:id="@+id/txtUsername"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:layout_marginStart="8dp"
android:layout_marginTop="4dp"
android:text="User Name"
android:textAppearance="@style/TextAppearance.AppCompat.Medium"
android:textColor="@color/label_text_light"
android:textSize="14sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@+id/imageView4"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.3" />
<ImageView
android:id="@+id/imageView4"
android:layout_width="63dp"
android:layout_height="65dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/baseline_face_white_48" />
<TextView
android:id="@+id/txtEmail"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:text="Email Address"
android:textColor="@color/colorText"
android:textSize="10sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="@+id/txtUsername"
app:layout_constraintTop_toBottomOf="@+id/txtUsername"
app:layout_constraintVertical_bias="0.0" />
<ImageView
android:id="@+id/imgClose"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_marginBottom="8dp"
android:layout_marginEnd="16dp"
android:layout_marginTop="8dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/baseline_close_white_48dp" />
</android.support.constraint.ConstraintLayout>
<android.support.design.widget.NavigationView
android:id="@+id/navigation_view"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
app:itemTextAppearance="@style/TextAppearance.AppCompat.Body2"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@+id/constraintLayout"
app:itemIconTint="@color/drawer_item"
app:itemTextColor="@color/drawer_item"
app:itemBackground="@drawable/menu_background_color"
app:menu="@menu/bottom_nav_drawer_menu">
<!-- REMNANTS
app:itemIconTint="@color/drawer_item"
app:theme="@style/ThemeOverlay.AppCompat.navTheme"
app:itemBackground="@drawable/nav_item_drawable"
app:itemTextColor="@color/drawer_item"
app:itemBackground="@android:color/transparent"-->
</android.support.design.widget.NavigationView>
</android.support.constraint.ConstraintLayout>

主要活动的相关部分,其中设置了底部应用栏和底部导航

public class Reviv extends AppCompatActivity implements LocationListener{
public static String TAG = "Reviv Main";
private BottomAppBar bottom_app_bar;
BottomNavigationDrawerFragment fragment;
private FragmentManager manager = this.getSupportFragmentManager();

// Functions
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Fabric.with(this, new Crashlytics());
setContentView(R.layout.activity_reviv);
uberLayout = findViewById(R.id.uberLayout);
floatingActionButton = findViewById(R.id.floatingActionButton);
floatingActionButton.setImageResource(R.drawable.baseline_add_white_24dp);
final Activity activity = this;
database = RevivDatabase.getDatabase(this);
viewModel = ViewModelProviders.of(this).get(RevivViewModel.class);
// ask for permissions
displayLocationSettingsRequest(getApplicationContext());
bringLocationUpdation(this);
params = defaultParams();

bottom_app_bar = findViewById(R.id.bottom_app_bar);
setSupportActionBar(bottom_app_bar);
fragment = new BottomNavigationDrawerFragment();
bottom_app_bar.replaceMenu(R.menu.bottomappbar_menu_home);
bottom_app_bar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem menuItem) {
switch (menuItem.getItemId()){
case R.id.mnu_app_signout:
Toast.makeText(getApplicationContext(), "Sign Out", Toast.LENGTH_SHORT).show();
break;
case android.R.id.home:
fragment.show(manager, fragment.getTag());
//navigationView.getMenu().getItem(0).setChecked(true);
break;
}
return true;
}
});
bottom_app_bar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
fragment = new BottomNavigationDrawerFragment();
fragment.show(getSupportFragmentManager(), fragment.getTag());
}
});
// ask for permissions
if (ContextCompat.checkSelfPermission(this,
android.Manifest.permission.INTERNET)
!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this,
new String[]{android.Manifest.permission.INTERNET},
MY_PERMISSIONS_ACCESS_INTERNET);
}

if (manager.findFragmentById(R.id.containerFrameLayout) == null) {
Log.d(TAG, "onCreate: transaction manager state is Empty:  "+ manager.beginTransaction().isEmpty());
// instantiate fragment and add to view
Fragment mFragment = new FragmentRevivIncidentDashboard();
manager.beginTransaction().replace(R.id.containerFrameLayout, mFragment ).commit();
} else {
Log.d(TAG, "onCreate: transaction manager state is Empty:  "+ manager.beginTransaction().isEmpty());
}
}
}

[更新] - 根据@TheWanderer的要求添加可绘制文件的内容

可绘制 - menu_background_color.xml

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

多亏了@TheWanderer的深刻提问,我终于想通了。

首先,我将menu_background.xml改为:

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

在这个网站上,我在默认菜单选项中添加了一个默认的"已选中"状态。然而,除了强调(永久(第一个选项之外,没有真正的改进。

我终于发现,在底部应用栏上的每个菜单按钮单击(R.id.home(时,正在创建一个导航表的新实例,这可以通过更改轻松修复

bottom_app_bar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
fragment = new BottomNavigationDrawerFragment();
fragment.show(getSupportFragmentManager(), fragment.getTag());
}
});

对此

bottom_app_bar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(fragment == null) fragment = new BottomNavigationDrawerFragment();
fragment.show(getSupportFragmentManager(), fragment.getTag());
}
});

最新更新