在动态生成的 TextView 中使用 StartActivityForResult

Using StartActivityForResult in a dynamically generated TextView

我有 activity(在其中调用函数)、包含所有函数的 java 文件和使用相机扫描代码的 activity。

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

我需要标记每一个动态生成的 TextView,并将条码数据发送回主 activity。

布局文件

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.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)

您的 class LayoutElements 扩展了 AppCompatActivity,但您似乎没有像 Activity 那样使用它。您不能使用 new 创建 Activity 的实例。只有 Android 可以实例化 Android 个组件(Service, Activity, BroadcastReceiver, Provider)。您的 class 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 class,因为它将在 Activity 上调用调用 startActivityForResult().