如何在新的导航抽屉架构组件中实现共享应用或评分应用或注销功能
Posted
技术标签:
【中文标题】如何在新的导航抽屉架构组件中实现共享应用或评分应用或注销功能【英文标题】:How to implement share app or rate app or logout functionality in new navigation drawer architecture component 【发布时间】:2020-03-08 20:42:27 【问题描述】:我正在关注official docs 的导航架构组件指南
我想在导航抽屉中添加分享应用、评价应用和退出项目,例如这样
我可以将服务、我的帐户菜单链接到它们的目标片段,但问题在于我们不需要任何特殊片段/目标的费率/分享/退出事项,对吧? .作为 NavigationUI.setupWithNavController(navigationView, navController);这条线完成了所有抽屉项点击事件本身我做不了太多。
这个方法我试过了,还是不行
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.drawerlayout.widget.DrawerLayout;
import androidx.navigation.NavController;
import androidx.navigation.Navigation;
import androidx.navigation.ui.AppBarConfiguration;
import androidx.navigation.ui.NavigationUI;
import com.google.android.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;
所以我的问题是如何实现这些类型的功能,而导航抽屉中不需要明确的目的地?
【问题讨论】:
你能解决这个问题吗? 【参考方案1】:你的问题不是很清楚。但是,如果您不需要打开片段,只需在 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
【讨论】:
【参考方案2】:使用这个
navigationView = findViewById(R.id.nav_view);
navigationView.bringToFront();
navigationView.setNavigationItemSelectedListener(this);
【讨论】:
嗨@mehul 请检查我更新的代码。它正在工作,但现在只有一个问题是假设我在服务片段本身上并尝试从抽屉中再次单击服务它没有加载 recyclerview 数据。我调试了应用程序,但即使有可用数据,它也不会进入适配器的 getItemCount() 方法。请帮忙!非常感谢。 服务片段显示服务列表并参考上面的截图。此外,当我导航到假设我的帐户然后提供服务时,它会在 recyclerview 中显示列表。我有点困惑为什么会这样。【参考方案3】:据我所知,不可能以一种可爱的方式处理它。与往常一样,它并非在所有情况下都有效。正如您可能尝试的那样,拥有这两种方法毫无意义。
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
【讨论】:
以上是关于如何在新的导航抽屉架构组件中实现共享应用或评分应用或注销功能的主要内容,如果未能解决你的问题,请参考以下文章
如何在 com.android.support:leanback-v17 中实现 2 级以上导航