You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:为基于Kabeja库的.dxf文件展示应用实现带筛选的文件浏览器

实现Android DXF文件选择与导入功能指南(基于Kabeja)

没问题,我来一步步帮你搞定这个功能,从基础的按钮搭建到文件过滤,再到最终用Kabeja加载展示,全程给你讲明白:

1. 先给界面添加文件选择按钮

首先在你的布局XML文件(比如activity_main.xml)里添加一个按钮,用来触发文件选择:

<Button
    android:id="@+id/btn_select_dxf"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="选择DXF文件" />

然后在你的Activity/Fragment里绑定这个按钮,并设置点击事件:

Button selectBtn = findViewById(R.id.btn_select_dxf);
selectBtn.setOnClickListener(v -> {
    // 触发文件选择器
    openDXFFilePicker();
});

2. 实现只显示DXF文件的文件选择器

Android系统没有原生直接按扩展名过滤的文件选择器,但我们可以通过两种可靠方式实现只允许选择DXF文件:

方式一:原生Intent+代码校验扩展名(兼容性最好)

这种方法适配所有Android版本,先打开系统文件浏览器,再在代码里校验文件扩展名:

private void openDXFFilePicker() {
    Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
    intent.setType("*/*"); // 先允许所有类型,后续过滤
    intent.addCategory(Intent.CATEGORY_OPENABLE);
    
    // 给用户添加选择提示
    Intent chooser = Intent.createChooser(intent, "请选择DXF格式文件");
    
    startActivityForResult(chooser, 1001); // 1001是自定义请求码,可自行修改
}

然后重写onActivityResult方法(如果用AndroidX,推荐用registerForActivityResult替代),处理返回的文件并校验:

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == 1001 && resultCode == RESULT_OK && data != null) {
        Uri fileUri = data.getData();
        if (fileUri != null) {
            // 获取文件名并检查扩展名
            String fileName = getFileName(fileUri);
            if (fileName != null && fileName.toLowerCase().endsWith(".dxf")) {
                // 扩展名合法,交给Kabeja处理
                loadDXFFile(fileUri);
            } else {
                Toast.makeText(this, "请选择DXF格式的文件", Toast.LENGTH_SHORT).show();
            }
        }
    }
}

// 辅助方法:通过Uri获取文件名
private String getFileName(Uri uri) {
    String result = null;
    if (uri.getScheme().equals("content")) {
        try (Cursor cursor = getContentResolver().query(uri, null, null, null, null)) {
            if (cursor != null && cursor.moveToFirst()) {
                result = cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME));
            }
        }
    }
    if (result == null) {
        result = uri.getPath();
        int cut = result.lastIndexOf('/');
        if (cut != -1) {
            result = result.substring(cut + 1);
        }
    }
    return result;
}

方式二:第三方文件选择库(更简洁美观)

如果觉得原生浏览器不够美观,可以用MaterialFilePicker这类库,支持直接按扩展名过滤:

// 先在build.gradle添加依赖:implementation 'com.nbsp:library:1.8'
private void openDXFFilePicker() {
    new MaterialFilePicker()
            .withActivity(this)
            .withRequestCode(1001)
            .withFilter(".dxf") // 直接过滤DXF文件
            .withFilterDirectories(true) // 只显示文件,不显示文件夹
            .start();
}

后续同样在onActivityResult里处理返回的文件路径即可。

3. 用Kabeja加载选中的DXF文件

拿到合法的DXF文件Uri后,直接用Kabeja读取并复用你已有的展示逻辑:

private void loadDXFFile(Uri fileUri) {
    try {
        InputStream inputStream = getContentResolver().openInputStream(fileUri);
        
        // 初始化Kabeja的DXFReader
        DXFReader reader = new DXFReader();
        Drawing drawing = reader.read(inputStream);
        
        // 调用你已实现的展示方法渲染DXF
        renderDrawing(drawing);
        
        inputStream.close();
    } catch (IOException | DXFParseException e) {
        e.printStackTrace();
        Toast.makeText(this, "加载DXF文件失败", Toast.LENGTH_SHORT).show();
    }
}

这里的renderDrawing就是你之前已经完成的DXF展示方法,直接传入Drawing对象即可。

4. 必要的权限配置

别忘了在AndroidManifest.xml里添加文件读取权限:

<!-- Android 9及以下需要此权限 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

如果你的目标SDK版本是23及以上,还需要在代码中动态申请READ_EXTERNAL_STORAGE权限,否则会出现权限崩溃。


内容的提问来源于stack exchange,提问作者Gogolplex

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:18:13