我想知道如何使用导航控制器正确处理系统后退按钮操作.在我的应用程序中,我有两个片段(例如fragment1和fragment2),我在fragment1中有一个动作,目的地是fragment2.除了一件事之外,一切都很好——当用户在fragment2中按下系统后退按钮时,我想显示一个对话框(例如使用DialogFragment)以确认退出.实现这种行为的最佳方式是什么?如果我在宿主片段中使用app:defaultNavHost="true",那么它会自动返回,忽略我的规则.此外,这个组件的用途是什么?

enter image description here

我应该用"pop to"吗?

推荐答案

最新更新——2019年4月25日

新版androidx.activity ver. 1.0.0-alpha07带来了一些变化

android官方指南中的更多解释:Provide custom back navigation

示例:

public class MyFragment extends Fragment {

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // This callback will only be called when MyFragment is at least Started.
        OnBackPressedCallback callback = new OnBackPressedCallback(true /* enabled by default */) {
            @Override
            public void handleOnBackPressed() {
                // Handle the back button event
            }
        };
        requireActivity().getOnBackPressedDispatcher().addCallback(this, callback);

        // The callback can be enabled or disabled here or in handleOnBackPressed()
    }
    ...
}

旧更新

UPD: April 3rd, 2019

现在它简化了.更多信息here

示例:

requireActivity().getOnBackPressedDispatcher().addCallback(getViewLifecycleOwner(), this);

@Override
public boolean handleOnBackPressed() {
    //Do your job here
    //use next line if you just need navigate up
    //NavHostFragment.findNavController(this).navigateUp(); 
    //Log.e(getClass().getSimpleName(), "handleOnBackPressed");
    return true;
    }

Deprecated(自版本1.0.0-alpha06起)

this开始,只需使用片段中的JetPack实现OnBackPressedCallback即可实现 并将其添加到活动中: getActivity().addOnBackPressedCallback(getViewLifecycleOwner(),this);

你的片段应该是这样的:

public MyFragment extends Fragment implements OnBackPressedCallback {

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        
        getActivity().addOnBackPressedCallback(getViewLifecycleOwner(),this);
}
    
    @Override
    public boolean handleOnBackPressed() {
        //Do your job here
        //use next line if you just need navigate up
        //NavHostFragment.findNavController(this).navigateUp(); 
        //Log.e(getClass().getSimpleName(), "handleOnBackPressed");
        return true;
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        getActivity().removeOnBackPressedCallback(this);
    }
}

UPD:

 implementation 'androidx.appcompat:appcompat:{lastVersion}'

Android相关问答推荐

如何使用视图模型触发可变状态?

Android:MethodHandle. invoke和MethodHandle. invokeExact仅从Android O( - min—api 26)开始支持

为什么它显示我的空白屏幕?

数据绑定在Android中等待填充值时显示未填充的值

如何隐藏OutlinedTextField边框上的提示标签

如何显示具体的商品数量?

Camera2 将图像从 ImageReader 传递到 MediaRecorder

从包含的(复合)模块导入 Kotlin 类时,Android 应用程序模块的 build.gradle.kts 未解决的引用错误

从我的 Android 应用程序发送到 Gin 时失败,但从 Postman 发送到 Gin 时成功

尽管我在onCreate()期间已经初始化,但仍出现未初始化的late init变量错误

如何绘制内边框?

服务似乎在启动时忽略传递的变量

我该怎么做文本计时器

try 使用 ViewPager2 实现滑动视图时出现类型不匹配错误

如何对齐文本和图标可组合,以便即使在文本溢出后它们也能保持在一起?

如何使用 ConstraintLayout 链接两个文本

Jetpack Compose:mutableStateOf 不随流量更新

无法使用 Gradle 托管设备对基线配置文件运行测试

如何使用文件提供程序将视频从一个应用程序共享到另一个应用程序?

Android Studio (Kotlin):无法启动活动