ActivityResultLauncher<ScanOptions> 自定义扫码的样式 举例

在使用 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 的基本概念。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值