在使用 ActivityResultLauncher 自定义扫码的样式时,实际上我们并不是直接使用 ActivityResultLauncher 来定义扫码界面的样式,因为 ActivityResultLauncher 是用于处理通过 Intent 启动的 Activity 的结果的。但是,你可以结合 ActivityResultLauncher 和自定义的扫码 Activity 或 Fragment 来实现你的需求。
以下是一个简单的例子,展示如何结合 ActivityResultLauncher 和自定义扫码 Fragment 来实现自定义扫码样式的功能:
1. 定义 ScanOptions 类
首先,你需要一个类来封装扫码的选项(尽管在这个例子中可能不需要太多选项,但为了演示,我们创建一个简单的类):
public class ScanOptions {
// 这里可以添加扫码的选项,比如是否开启闪光灯、扫描类型等
// 但在这个例子中,我们保持简单,不添加任何选项
}
2. 自定义扫码 Fragment
然后,你需要创建一个自定义的扫码 Fragment,它负责处理相机预览、扫码逻辑和结果传递。
public class ScanFragment extends Fragment {
// ... 扫码逻辑的实现,包括相机预览、扫码解析等
public interface ScanResultListener {
void onScanResult(String result);
}
private ScanResultListener listener;
@Override
public void onAttach(@NonNull Context context) {
super.onAttach(context);
if (context instanceof ScanResultListener) {
listener = (ScanResultListener) context;
} else {
throw new RuntimeException(context.toString() + " must implement ScanResultListener");
}
}
// ... 在扫码成功后调用 listener.onScanResult(result)
}
3. 在 Activity 中使用 ActivityResultLauncher 和自定义扫码 Fragment
在 Activity 中,你可以使用 ActivityResultLauncher 来处理从扫码 Fragment 返回的结果,但实际上是通过 Fragment 的回调来传递结果的。
public class ScanActivity extends AppCompatActivity implements ScanFragment.ScanResultListener {
private ActivityResultLauncher<ScanOptions> scanLauncher;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_scan);
// 初始化 ActivityResultLauncher(尽管在这个例子中我们不会用它来启动 Activity)
scanLauncher = registerForActivityResult(
new ActivityResultContracts.StartActivityForResult(),
result -> {
// 在这个例子中,我们不会用到这个结果回调,因为我们是通过 Fragment 回调传递结果的
}
);
// 显示自定义扫码 Fragment
ScanFragment scanFragment = new ScanFragment();
getSupportFragmentManager().beginTransaction()
.replace(R.id.fragment_container, scanFragment)
.commit();
}
@Override
public void onScanResult(String result) {
// 处理扫码结果
Toast.makeText(this, "Scan result: " + result, Toast.LENGTH_SHORT).show();
}
}
在这个例子中,我们并没有真正使用 ActivityResultLauncher 来启动扫码 Activity,因为我们是通过 Fragment 来实现自定义扫码界面的。但是,如果你需要在扫码过程中启动其他 Activity(例如,打开相机设置),那么 ActivityResultLauncher 仍然是一个有用的工具。
注意:在真实的应用中,你可能需要处理更多的情况,比如相机权限的申请、扫码 Fragment 的生命周期管理等。上面的例子只是为了演示如何结合 ActivityResultLauncher 和自定义扫码 Fragment 的基本概念。
3万+

被折叠的 条评论
为什么被折叠?



