有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何在新的导航抽屉体系结构组件中实现共享应用或评级应用或注销功能

我遵循official docs的导航架构组件指南

我想在导航抽屉中添加共享应用、评分应用和注销项目,如下enter image description here

我可以将服务、我的帐户菜单链接到它们的目的地片段,但问题在于费率/共享/注销,我们不需要任何特殊片段/目的地,对吗?。作为导航用户界面。设置导航控制器(导航视图、导航控制器);这一行做了所有抽屉项目点击事件本身,我不能做太多

尽管如此,我还是尝试了这种方法,但它不起作用

import 安卓.os.Bundle;
import 安卓.view.Menu;
import 安卓.view.MenuItem;
import 安卓.view.View;
import 安卓.widget.TextView;

import 安卓x.annotation.NonNull;
import 安卓x.appcompat.app.AppCompatActivity;
import 安卓x.appcompat.widget.Toolbar;
import 安卓x.drawerlayout.widget.DrawerLayout;
import 安卓x.navigation.NavController;
import 安卓x.navigation.Navigation;
import 安卓x.navigation.ui.AppBarConfiguration;
import 安卓x.navigation.ui.NavigationUI;

import com.google.安卓.material.navigation.NavigationView;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.startup.housebuddy.R;
import com.startup.housebuddy.Utility.Utility;

public class ServiceListActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener {

    private AppBarConfiguration mAppBarConfiguration;
    private TextView headerSubTitleTv;
    private TextView headerTitleTv;
    private NavController navController;
    private NavigationView navigationView;
    private DrawerLayout drawer;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_service_list);
        Toolbar toolbar = findViewById(R.id.toolbar);
        navigationView = findViewById(R.id.nav_view);
        View headerView = navigationView.inflateHeaderView(R.layout.nav_header_service_list);

       // headerTitleTv = headerView.findViewById(R.id.header_title_tv);
        headerSubTitleTv = headerView.findViewById(R.id.header_subtitle);

        populateUpNavHeader();

        setSupportActionBar(toolbar);
        drawer = findViewById(R.id.drawer_layout);
        // 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,
                R.id.nav_tools, R.id.nav_share, R.id.nav_send)
                .setDrawerLayout(drawer)
                .build();*/
        /*TODO : Add other ids of fragments required to show in navigation drawer*/
        mAppBarConfiguration = new AppBarConfiguration.Builder(
                R.id.nav_home,R.id.nav_myAccount,R.id.nav_about)
                .setDrawerLayout(drawer)
                .build();
         navController = Navigation.findNavController(this, R.id.nav_host_fragment);
        NavigationUI.setupActionBarWithNavController(this, navController, mAppBarConfiguration);
        //NavigationUI.setupWithNavController(navigationView, navController);
        navigationView.bringToFront();
        navigationView.setNavigationItemSelectedListener(this);

    }



     @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.service_list, menu);
        return true;
    }

    @Override
    public boolean onSupportNavigateUp() {
        NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
        return NavigationUI.navigateUp(navController, mAppBarConfiguration)
                || super.onSupportNavigateUp();
    }

    @Override
    public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
     {

    switch (menuItem.getItemId()) {
        case R.id.nav_home:
            Utility.showToast("nav home", this);
            navController.navigate(R.id.nav_home);
            break;

        case R.id.nav_myAccount:
            Utility.showToast("nav accout", this);
            navController.navigate(R.id.nav_myAccount);

            break;

        case R.id.nav_share:
            // do share intent
            Utility.showToast("Share", this);
            drawer.closeDrawers(); // close nav bar
            break;


    }
    drawer.closeDrawers(); // close nav bar
    return true;
}
    }

所以我的问题是,我如何实现这些类型的功能,对于这些功能,导航抽屉中不需要明确的目的地


共 (2) 个答案

  1. # 1 楼答案

    据我所知,不可能以一种可爱的方式处理它。和往常一样,它并非在所有情况下都有效。正如你可能尝试的那样,使用这两种方法是毫无意义的

    NavigationUI.setupWithNavController(navigationView, navController);
    navigationView.setNavigationItemSelectedListener(this);
    

    我提议:

    private fun setupNavigation() {
        NavigationUI.setupActionBarWithNavController(this, navFragment.navController, drawerLayout)
        navigation_view.setNavigationItemSelectedListener(this)
    }
    
    
    override fun onNavigationItemSelected(item: MenuItem): Boolean {
        when (item.itemId) {
            R.id.share_app -> navigator.shareApp(this) // some ShareCompat.IntentBuilder
            else -> navFragment.navController.navigate(item.itemId)
        }
        drawerLayout.closeDrawer(GravityCompat.START)
        return true
    }
    
  2. # 2 楼答案

    你的问题不太清楚。但是,如果不需要片段来打开,只需在if-else条件中写入所需的逻辑即可。然后关闭导航栏

    if(menuItem.getItemId() == R.id.nav_share){
    
    // do share intent
    
    mDrawerLayout.closeDrawers(); // close nav bar
    
    }
    else if(menuItem.getItemId() == R.id.log_out){ 
    
        // write logic for log out
     mDrawerLayout.closeDrawers(); // close nav bar
     }