android enter popenter区别,Android导航组件弹出过渡问题

由于NavOptions由将抽屉绑定到导航图所使用的便利方法在内部处理,因此这有点难以解决.我最初使用设置菜单和onOptionsItemSelected测试了这个解决方案,但基本的想法也应该在这里工作.

首先,确保您的菜单项ID与导航片段的ID相对应:

...

...

现在,不要在NavHost活动中使用现成的方法来实现connecting the drawer to your NavController实现NavigationView.OnNavigationItemSelectedListener,并覆盖onNavigationItemSelected方法,如下所示:

@Override

public boolean onNavigationItemSelected(@NonNull MenuItem item) {

NavHost navHost = Navigation.findNavController(this, R.id.your_nav_host_fragment);

return NavigationUI.onNavDestinationSelected(item, navHost);

}

这会将选择转发为图表中的导航.将your_nav_host_fragment替换为您在其上设置app的片段ID:defaultNavHost =“true”.

NavOptions.Builder builder = new NavOptions.Builder()

.setLaunchSingleTop(true)

.setEnterAnim(R.anim.nav_default_enter_anim)

.setExitAnim(R.anim.nav_default_exit_anim)

.setPopEnterAnim(R.anim.nav_default_pop_enter_anim)

.setPopExitAnim(R.anim.nav_default_pop_exit_anim);

不幸的是,该方法尚未将NavOptions.Builder作为参数,但您可以基于Android源代码创建一个实用程序类来模拟该功能:

public class NavigationUIHelper {

public static boolean onNavDestinationSelected(@NonNull MenuItem item,

@NonNull NavController navController,

@NonNull NavOptions.Builder builder) {

if ((item.getOrder() & Menu.CATEGORY_SECONDARY) == 0) {

NavDestination destination = findStartDestination(navController.getGraph());

builder.setPopUpTo(destination.getId(), false);

}

NavOptions options = builder.build();

try {

navController.navigate(item.getItemId(), null, options);

return true;

} catch (IllegalArgumentException e) {

return false;

}

}

// Need to copy this private method as well

private static NavDestination findStartDestination(@NonNull NavGraph graph) {

NavDestination startDestination = graph;

while (startDestination instanceof NavGraph) {

NavGraph parent = (NavGraph) startDestination;

startDestination = parent.findNode(parent.getStartDestination());

}

return startDestination;

}

}

最后,在您的活动中,您现在可以将NavigationUI的调用替换为NavigationUIHelper中实现的调用:

@Override

public boolean onNavigationItemSelected(@NonNull MenuItem item) {

NavHost navHost = Navigation.findNavController(this, R.id.your_nav_host_fragment);

NavOptions.Builder builder = new NavOptions.Builder()

.setLaunchSingleTop(true)

.setEnterAnim(R.anim.custom_enter)

.setExitAnim(R.anim.custom_exit)

.setPopEnterAnim(R.anim.custom_pop_enter)

.setPopExitAnim(R.anim.custom_pop_exit);

return NavigationUIHelper.onNavDestinationSelected(item, navHost, builder);

}

这应该允许您根据自己的喜好更改抽屉过渡动画,而无需替换导航组件.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值