无法在导航抽屉+ BottomAppBar中为所选项目设置颜色/背景选择

问题描述 投票:1回答:1

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

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

我试过this questionthis onethis onethis onethis one,都无济于事。

任何人都可以向我指出我做错了什么吗?这时,我的代码如下:

BottomSheetDialogFragment

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;
    }
}

BottomSheetLayout

<?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>

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

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的要求添加可绘制文件的内容

Drawable - 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>
android navigation-drawer bottomnavigationview
1个回答
0
投票

感谢@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> 

this website,我在默认菜单选项中添加了默认的“已检查”状态。然而,除了突出(永久)第一个选项之外,没有真正的改进。

我终于想通了在BottomAppBar上的每个菜单按钮上单击(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());
            }
        });
© www.soinside.com 2019 - 2024. All rights reserved.