【问题标题】:Execute a method from a class in mainActivity (Android)从 mainActivity 中的类执行方法(Android)
【发布时间】:2015-08-16 14:48:35
【问题描述】:

当用户单击按钮时,我试图从 MainActivity 类中名为 QrScann 的类执行一个方法,但每次单击按钮时应用程序崩溃,它给我这个日志崩溃输出

 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)

这是具有我要执行的方法(扫描仪)的类:

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();
    }
}

该类也有其他方法。 这就是我在 MainActivity 课程中所做的:

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

    }
}

如果我能解释一下我可能遗漏的内容,我将不胜感激。

【问题讨论】:

  • 您的 QrScann 是否已在您的清单中声明为活动?

标签: java android methods call


【解决方案1】:
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();
    }
}

来自活动

@Override
    public void onClick(View v) {

        QrScann QRScanner =new QrScann(this);
        QRScanner.Scanner(v);

    }

【讨论】:

  • 非常感谢!我试图实现它,但我也遇到了关于 startActivityforResult 和 showDialog 的错误(无法解析方法)
  • 非常感谢你拯救了我的一天 :) 现在我只需要弄清楚 showDialog 是否无法正常工作,否则它可以正常工作
  • 我希望我能!!!我需要 16 名声望:/ 但我承诺,一旦我得到他们,我会做到的 :)
【解决方案2】:

您无需创建“new”活动,而是通过提供类以 Intents 启动它们,然后通过在您的起始 Intent 中提供额外内容和操作从生命周期方法中处理您的操作。

所以,基本上,QrScann QRScanner = new QRScann(); 是尝试创建系统组件的错误方法。您应该使用 Intent intent = new Intent(MainActivity.this, QrScann.class); 并在意图中提供操作/附加内容。

【讨论】:

  • 我应该在 Onclick 上这样做吗? Intent intent = new Intent(MainActivity.this, QrScann.class); Intent..Scanner(v);
  • 看起来你可以一起摆脱你的其他活动,并从你的 onClick 中启动你的 activityForResult,然后在你的 MainActivity 中查找 onActivityResult(...) 调用。
【解决方案3】:

问题是您的QrScann 类不是有效的Activity。您不能简单地使用 new 关键字实例化一个新的 Activity 类 - 您需要允许框架创建 Activity 并通过在有效 Context 上通过 startActivity() 启动它来完成 Activity 生命周期。

看起来您创建 QrScann 扩展 Activity 的唯一目的是能够调用 startActivityForResult()。相反,QrScann 应该获得对其MainActivity 的引用并在其上调用startActivityForResult(),或者回调MainActivity

【讨论】:

  • 能否提供更多实用信息?
  • 您想了解哪一部分的更多信息? Activity 对象由系统管理——你永远不应该自己创建 Activity 类的实例。
  • 那么我到底应该怎么做呢?我的意思是我必须更改 QrScann 类吗?
  • 是的,将其更改为不扩展 Activity。您可以将您的MainActivity 的引用传递给Scanner() 方法,然后调用startActivityForResult()
  • 看起来像 r7v just rewrote the QrScann class 我想象中的样子
【解决方案4】:

你不能像new QrScann()这样只实例化Activity,你必须这样做:

Intent intent = new Intent(this, QrScann.class);
startActivity(intent);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-23
    • 2016-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-28
    • 2017-02-03
    • 2011-11-25
    相关资源
    最近更新 更多