如何在创建 TableRow 期间让 FileChooser 填充 TextView?

How can I get a FileChooser to populate a TextView during a TableRow creation?

问题:TableRow 创建过程中,我无法让 FileChooser class 填充 TextView .我在 Android 中收到一个 Invocation Exception 创建的“looper.java”,这似乎是由变量 tagTrace=0 被读取为“!=0”引起的。所以,我不确定如何解决它。

我正在尝试做的事情: 我正在尝试构建现有流程。当用户单击 TableLayout 的 header 行上的“+”按钮时,它会创建一个包含两个视图的行:[​​=53 中的“删除”(-) Button =](0) 和 row.child(1) 中的 TextView。它成功地做到了这一点。有一个 Singleton class 管理所有应用 Actiities.

的各种类型 TableRow 创作

在一个特定的 Activity 上存在一个文件 TableLayout。我希望用户在单击上面描述的“+”按钮时启动 FileChooser 以捕获文件路径并将该路径填充到它所在行的 TextView child正在创造。但是,我 运行 遇到了上述问题。

导致调用异常的Looper.java Bug(我认为)

文件选择器

    public class FileChooser extends AppCompatActivity {
        private String fileName;
        private String filePath;
        private final ActivityResultLauncher<Intent> resultLauncher;
    
        public FileChooser(){
            //if(intent==null) Toast.makeText(null, "Intent is Null", Toast.LENGTH_SHORT).show();
            this.resultLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> {
                if (result.getResultCode() == Activity.RESULT_OK && result.getData() != null){
                    Uri uri = result.getData().getData();
                    filePath = uri.getPath();
                }
            });
        }
    
        public String getFileName() {
            return fileName;
        }
    
        public String getFilePath() {
            return filePath;
        }
    
        public ActivityResultLauncher<Intent> getResultLauncher() {
            return resultLauncher;
        }

}

创建 TableRow 的单例中的方法“!bold”

public static TableRow setupFilesTableRow(Context context, TableLayout table, String fileID, String fileName, boolean bold) {
    TableRow row = new TableRow(context);
    if(bold) {
        row.addView(setupFilesAddRowButton(context, table));
        row.addView(addRowTextViewToTable(context, fileName, true));
    }
    if (!bold) {
        row.addView(setupDeleteRowButton(context, table));
        
            // Intent and FileChooser to capture a filePath
            Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
            intent.setType("*/*");
            FileChooser fileChooser = new FileChooser();
            fileChooser.getResultLauncher().launch(intent);

            // Adding a TextView child to the new TableRow with the captured filePath from the FileChooser
            row.addView(addRowTextViewToTable(context, fileChooser.getFilePath(), false));
            //row.setClickable(true);
        
    }
    return row;
}

FileChooser fileChooser = new FileChooser();

您不能使用 new 运算符创建新的 activity。

必须使用 intent 启动活动。

我没有在导致问题的 TableLayout 中使用嵌入式 Button(见上文),而是在表格布局外创建了一个“添加”按钮来启动 FileChooser并在捕获的信息中添加一个 TableRow。由于不熟悉 Android 并且仍在学习该平台,这是我的解决方案,从用户的角度来看可能更符合逻辑。

    private void setupOnClickActions() {
        btnAddFile.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
                intent.setType("*/*");
                resultLauncher.launch(intent);

            }
        });
}

    intentLauncher = registerForActivityResult(
            new ActivityResultContracts.StartActivityForResult(),
            result ->{
                if(result.getResultCode() == Activity.RESULT_OK) {
                    assert result.getData() != null;
                    Sources src = result.getData().getParcelableExtra("source");
                    if(src == null){
                        PopupDialog.AlertMessage(AddNote.this, "Error: Author Choice",
                                "An issue occurred and an author choice was not returned.");
                        return;
                    }
                    setSourceDetails(src);
                    selectedSourceID = src.getSourceID();
                }

            }
    );