在动态生成的文本视图中使用 StartActivityForResult



我有活动(其中调用函数(,包含所有函数的java文件以及使用相机扫描代码的活动。

当主活动加载时,它会调用 generateTextView 函数,该函数使用 TextView 填充页面。在所有这些设备上都启用了onClick。单击一个 TextView 时,它会启动相机活动以扫描条形码。如何将该条形码字符串发送回主活动,发送到启动相机活动的 TextView?我一直遇到空对象引用。

我需要为这些动态生成的 TextView 中的每一个提供选项卡,并将条形码数据发送回主活动。

布局文件

public class LayoutElements extends AppCompatActivity {
TextView tv;
public TextView textViewGenerate(final Context ct, String tag, Integer id) {
tv = new TextView(ct);
GradientDrawable gd = new GradientDrawable();
gd.setColor(0xFFFFFF);
gd.setCornerRadius(4);
gd.setStroke(1, 0xFF757575);
tv.setBackground(gd);
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.WRAP_CONTENT,
1.0f
);
//lp.height = 50;
tv.setPadding(7, 9, 0, 0);
tv.setGravity(Gravity.START);
tv.setTextSize(22);
tv.setTag(tag);
tv.setId(id);
tv.setHint("Enter Module Serial Number");
//Click to launch camera
tv.setClickable(true);
tv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//Intent intent = new Intent(ct, MctCameraActivity.class);
Intent intent = new Intent(ct, MctCameraActivity.class);
startActivityForResult(intent, 1);
//ct.startActivity(intent);
//ToDo: finish receiving the data from the activityForResult
}
});
lp.setMargins(10, 0, 10, 0);
lp.setMarginStart(10);
lp.setMarginEnd(10);
tv.setLayoutParams(lp);
return tv;
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode == 1 && resultCode == RESULT_OK && data != null) {
String returnResult = data.getStringExtra("result");
tv.setText(returnResult);
}
}
}

错误日志

E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.rsscanner, PID: 16095 java.lang.NullPointerException: Attempt to invoke virtual method 'android.app.ActivityThread$ApplicationThread android.app.ActivityThread.getApplicationThread()' on a null object reference at android.app.Activity.startActivityForResult(Activity.java:4225) at androidx.fragment.app.FragmentActivity.startActivityForResult(FragmentActivity.java:676) at android.app.Activity.startActivityForResult(Activity.java:4183) at androidx.fragment.app.FragmentActivity.startActivityForResult(FragmentActivity.java:663) at com.example.rsscanner.models.LayoutElements$1.onClick(LayoutElements.java:62) at android.view.View.performClick(View.java:5610) at android.view.View$PerformClick.run(View.java:22265) at android.os.Handler.handleCallback(Handler.java:751) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:6077) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)

您的类LayoutElements扩展AppCompatActivity,但看起来您没有像Activity那样使用它。不能使用new创建Activity的实例。只有 Android 可以实例化 Android 组件 (Service, Activity, BroadcastReceiver, Provider(。您的类LayoutElements不是Activity,不应扩展AppCompatActivity。如果这样做,您将看到未定义startActivityForResult()。这是正确的。

要调用该方法,您需要从Activity调用它。您可以更改此设置:

Intent intent = new Intent(ct, MctCameraActivity.class);
startActivityForResult(intent, 1);

对此:

Intent intent = new Intent(activity, MctCameraActivity.class);
activity.startActivityForResult(intent, 1);

并将方法签名从:

public TextView textViewGenerate(final Context ct, String tag, Integer id) {

自:

public TextView textViewGenerate(final Activity activity, String tag, Integer id) {

确保在调用textViewGenerate()时将当前Activity作为第一个参数传递。

注意:您需要onActivityResult()移动到调用textViewGenerate()的实际Activity类,因为它将在调用startActivityForResult()Activity上调用。

相关内容

  • 没有找到相关文章

最新更新