从 mainActivity (Android) 中的 class 执行一个方法
Execute a method from a class in mainActivity (Android)
我正在尝试在用户单击按钮时从 MainActivity class 中名为 QrScann 的 class 执行一个方法,但每次单击按钮时应用程序都会崩溃给我这个日志崩溃输出
06-02 17:00:24.890 7067-7084/t.n.app W/EGL_emulation﹕ eglSurfaceAttrib not implemented
06-02 17:00:24.890 7067-7084/t.n.app W/OpenGLRenderer﹕ Failed to set EGL_SWAP_BEHAVIOR on surface 0xb3ee6da0, error=EGL_SUCCESS
06-02 17:00:27.473 7067-7067/t.n.app D/AndroidRuntime﹕ Shutting down VM
06-02 17:00:27.474 7067-7067/t.n.app E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: snet.tuberlin.app, PID: 7067
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:3745)
at android.app.Activity.startActivityForResult(Activity.java:3706)
at snet.tuberlin.app.QRCode.scanQR(QRCode.java:23)
at snet.tuberlin.app.MainActivity.onClick(MainActivity.java:48)
at android.view.View.performClick(View.java:4780)
at android.view.View$PerformClick.run(View.java:19866)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5257)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
这是具有我要执行的方法(扫描仪)的 class:
public class QrScann extends Activity {
static final String ACTION_SCAN = "com.google.zxing.client.android.SCAN";
public void Scanner(View v) {
try {
Intent intent = new Intent(ACTION_SCAN);
intent.putExtra("SCAN_MODE", "QR_CODE_MODE");
startActivityForResult(intent, 0);
} catch (ActivityNotFoundException anfe) {
showDialog(QrScann.this, "No Scanner Found", "Download a scanner code activity?", "Yes", "No").show();
}
}
class还有其他方法。
很好,这就是我在 MainActivity class 中所做的:
public class MainActivity extends Activity implements View.OnClickListener {
public Button Scanner;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Scanner =(Button)findViewById(R.id.buttonScanQR);
Scanner.setOnClickListener(this);
}
@Override
public void onClick(View v) {
//Intent QrScann = new Intent(this, QrScann.class);
//startActivity(QrScann );
QrScann QRScanner =new QrScann();
QRScanner.Scanner(v);
}
}
如果您能解释我可能遗漏的内容,我将不胜感激。
您不创建“new
”活动,您通过提供 class 以 Intents
启动它们,然后通过提供额外的和在您的初始 Intent 中执行的操作。
所以,基本上,QrScann QRScanner = new QRScann();
是尝试创建系统组件的错误方法。您应该使用 Intent intent = new Intent(MainActivity.this, QrScann.class);
并在意图中提供 actions/extras。
问题是您的 QrScann
class 不是有效的 Activity
。您不能简单地使用 new
关键字实例化一个新的 Activity
class - 您需要允许框架创建 Activity 并通过 Activity通过 startActivity()
在有效上下文中启动生命周期。
看起来您 QrScann
扩展 Activity 的唯一目的是能够调用 startActivityForResult()
。相反,QrScann
应该获取对其 MainActivity
的引用并调用 startActivityForResult()
,或者回调 MainActivity
.
public class QrScann {
static final String ACTION_SCAN = "com.google.zxing.client.android.SCAN";
private MainActivity mContext;
public QrScann(MainActivity context) {
mContext = context;
}
public void Scanner(View v) {
try {
Intent intent = new Intent(ACTION_SCAN);
intent.putExtra("SCAN_MODE", "QR_CODE_MODE");
mContext.startActivityForResult(intent, 0);
} catch (ActivityNotFoundException anfe) {
//show dialog is deprecated , try DialogFragments
mContext.showDialog(QrScann.this, "No Scanner Found", "Download a scanner code activity?", "Yes", "No").show();
}
}
来自Activity
@Override
public void onClick(View v) {
QrScann QRScanner =new QrScann(this);
QRScanner.Scanner(v);
}
你不能像 new QrScann()
那样只实例化一个 Activity
,你必须这样做:
Intent intent = new Intent(this, QrScann.class);
startActivity(intent);
我正在尝试在用户单击按钮时从 MainActivity class 中名为 QrScann 的 class 执行一个方法,但每次单击按钮时应用程序都会崩溃给我这个日志崩溃输出
06-02 17:00:24.890 7067-7084/t.n.app W/EGL_emulation﹕ eglSurfaceAttrib not implemented
06-02 17:00:24.890 7067-7084/t.n.app W/OpenGLRenderer﹕ Failed to set EGL_SWAP_BEHAVIOR on surface 0xb3ee6da0, error=EGL_SUCCESS
06-02 17:00:27.473 7067-7067/t.n.app D/AndroidRuntime﹕ Shutting down VM
06-02 17:00:27.474 7067-7067/t.n.app E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: snet.tuberlin.app, PID: 7067
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:3745)
at android.app.Activity.startActivityForResult(Activity.java:3706)
at snet.tuberlin.app.QRCode.scanQR(QRCode.java:23)
at snet.tuberlin.app.MainActivity.onClick(MainActivity.java:48)
at android.view.View.performClick(View.java:4780)
at android.view.View$PerformClick.run(View.java:19866)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5257)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
这是具有我要执行的方法(扫描仪)的 class:
public class QrScann extends Activity {
static final String ACTION_SCAN = "com.google.zxing.client.android.SCAN";
public void Scanner(View v) {
try {
Intent intent = new Intent(ACTION_SCAN);
intent.putExtra("SCAN_MODE", "QR_CODE_MODE");
startActivityForResult(intent, 0);
} catch (ActivityNotFoundException anfe) {
showDialog(QrScann.this, "No Scanner Found", "Download a scanner code activity?", "Yes", "No").show();
}
}
class还有其他方法。 很好,这就是我在 MainActivity class 中所做的:
public class MainActivity extends Activity implements View.OnClickListener {
public Button Scanner;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Scanner =(Button)findViewById(R.id.buttonScanQR);
Scanner.setOnClickListener(this);
}
@Override
public void onClick(View v) {
//Intent QrScann = new Intent(this, QrScann.class);
//startActivity(QrScann );
QrScann QRScanner =new QrScann();
QRScanner.Scanner(v);
}
}
如果您能解释我可能遗漏的内容,我将不胜感激。
您不创建“new
”活动,您通过提供 class 以 Intents
启动它们,然后通过提供额外的和在您的初始 Intent 中执行的操作。
所以,基本上,QrScann QRScanner = new QRScann();
是尝试创建系统组件的错误方法。您应该使用 Intent intent = new Intent(MainActivity.this, QrScann.class);
并在意图中提供 actions/extras。
问题是您的 QrScann
class 不是有效的 Activity
。您不能简单地使用 new
关键字实例化一个新的 Activity
class - 您需要允许框架创建 Activity 并通过 Activity通过 startActivity()
在有效上下文中启动生命周期。
看起来您 QrScann
扩展 Activity 的唯一目的是能够调用 startActivityForResult()
。相反,QrScann
应该获取对其 MainActivity
的引用并调用 startActivityForResult()
,或者回调 MainActivity
.
public class QrScann {
static final String ACTION_SCAN = "com.google.zxing.client.android.SCAN";
private MainActivity mContext;
public QrScann(MainActivity context) {
mContext = context;
}
public void Scanner(View v) {
try {
Intent intent = new Intent(ACTION_SCAN);
intent.putExtra("SCAN_MODE", "QR_CODE_MODE");
mContext.startActivityForResult(intent, 0);
} catch (ActivityNotFoundException anfe) {
//show dialog is deprecated , try DialogFragments
mContext.showDialog(QrScann.this, "No Scanner Found", "Download a scanner code activity?", "Yes", "No").show();
}
}
来自Activity
@Override
public void onClick(View v) {
QrScann QRScanner =new QrScann(this);
QRScanner.Scanner(v);
}
你不能像 new QrScann()
那样只实例化一个 Activity
,你必须这样做:
Intent intent = new Intent(this, QrScann.class);
startActivity(intent);