【问题标题】:Calling method of class one to another class in android java?在android java中调用一个类的方法到另一个类?
【发布时间】:2020-12-02 11:35:05
【问题描述】:

嘿,开发人员,我有一个简单的问题,我的 MainActivity 中有一个方法,现在我想在我的 LoginActivity 中调用该方法。我通过 getInstance 完成了这件事,但它给了我一个错误,我在下面分享:

我的调用方法: 在我的 MainActivity 中我使用:

private static MainActivity instance;
  instance = this;
 public static MainActivity getInstance() {
        return instance;
    }

在我使用的登录活动中:

  MainActivity.getInstance().checktag(cnic);

Logcat:

2020-12-02 16:22:03.897 12153-12153/info.androidhive.loginandregistration E/AndroidRuntime: FATAL EXCEPTION: main
    Process: info.androidhive.loginandregistration, PID: 12153
    android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.BinderProxy@c69530c is not valid; is your activity running?
        at android.view.ViewRootImpl.setView(ViewRootImpl.java:679)
        at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:342)
        at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:93)
        at android.app.Dialog.show(Dialog.java:322)
        at info.androidhive.loginandregistration.activity.MainActivity.showDialog(MainActivity.java:532)
        at info.androidhive.loginandregistration.activity.MainActivity.checkmtag(MainActivity.java:308)
        at info.androidhive.loginandregistration.activity.LoginActivity$2.onResponse(LoginActivity.java:163)
        at info.androidhive.loginandregistration.activity.LoginActivity$2.onResponse(LoginActivity.java:134)
        at com.android.volley.toolbox.StringRequest.deliverResponse(StringRequest.java:82)
        at com.android.volley.toolbox.StringRequest.deliverResponse(StringRequest.java:29)
        at com.android.volley.ExecutorDelivery$ResponseDeliveryRunnable.run(ExecutorDelivery.java:102)
        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:6119)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)

这个问题有解决办法吗?

【问题讨论】:

    标签: java android fatal-error


    【解决方案1】:

    您需要将该函数声明为 public 和 static,并且您可以从应用程序的任何位置调用它们。例子

    MainActivity.java

    public static void some(){
       //TODO something
    }
    

    LoginActivity.java

    MainActivity.some();
    

    【讨论】:

    • 不,这不是真的
    • 这是如何在不创建实例或对象的情况下访问不同类的方法的基本概念。在您的情况下,您违反了 android 的基本生命周期。您需要将 Context 或 Activity 引用传递给该方法以进行显示。例如public static void some(Context mContext){//TODO some code}.
    【解决方案2】:

    从错误日志看来,当 LoginActivity 位于顶部时,您正试图在 MainActivity.checktag() 函数中显示一个对话框。这是不允许的。 Dialog 需要由顶部的 Activity 管理。

    更新: 为了澄清,错误不是由于从 LoginActivity 调用 MainActivity 的方法。这里的问题是,当不是当前活动活动时,您的代码正在使用 MainActivity 上下文创建一个对话框。 如果您的意图是重用一些代码来显示 MainActivity 和 LoginActivity 之间的 Dialog,您可以将该函数移动到一个新的 Utility 类,然后将当前的 Activity 实例传递给该函数。将代码保留在 MainActivity 本身中也可以这样做,但在我看来,前一种方法看起来更干净。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-02
      • 1970-01-01
      相关资源
      最近更新 更多