如何在创建 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();
}
}
);
问题: 在 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();
}
}
);