在动态生成的 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()
.
我有 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()
.