【问题标题】:Cannot change activity android无法更改活动android
【发布时间】:2014-12-23 20:07:03
【问题描述】:

我正在尝试从菜单活动更改为任何其他活动,但整个应用程序停止响应,不知道为什么。

这是我使用的代码(我从活动的 SurfaceView 类实例中调用它):

Intent intent = new Intent(menuActivity, ExitActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.putExtra("EXIT", true);
menuActivity.startActivity(intent);

日志:

  10-28 13:03:38.278: E/AndroidRuntime(6185): FATAL EXCEPTION: main
  10-28 13:03:38.278: E/AndroidRuntime(6185): java.lang.RuntimeException: Unable to instantiate application android.app.Application: java.lang.NullPointerException
  10-28 13:03:38.278: E/AndroidRuntime(6185):   at android.app.LoadedApk.makeApplication(LoadedApk.java:501)
  10-28 13:03:38.278: E/AndroidRuntime(6185):   at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4224)
  10-28 13:03:38.278: E/AndroidRuntime(6185):   at android.app.ActivityThread.access$1400(ActivityThread.java:140)
  10-28 13:03:38.278: E/AndroidRuntime(6185):   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1297)
  10-28 13:03:38.278: E/AndroidRuntime(6185):   at android.os.Handler.dispatchMessage(Handler.java:99)
  10-28 13:03:38.278: E/AndroidRuntime(6185):   at android.os.Looper.loop(Looper.java:137)
  10-28 13:03:38.278: E/AndroidRuntime(6185):   at android.app.ActivityThread.main(ActivityThread.java:4921)
  10-28 13:03:38.278: E/AndroidRuntime(6185):   at java.lang.reflect.Method.invokeNative(Native Method)
  10-28 13:03:38.278: E/AndroidRuntime(6185):   at java.lang.reflect.Method.invoke(Method.java:511)
  10-28 13:03:38.278: E/AndroidRuntime(6185):   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1027)
  10-28 13:03:38.278: E/AndroidRuntime(6185):   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:794)
  10-28 13:03:38.278: E/AndroidRuntime(6185):   at dalvik.system.NativeStart.main(Native Method)
  10-28 13:03:38.278: E/AndroidRuntime(6185): Caused by: java.lang.NullPointerException
  10-28 13:03:38.278: E/AndroidRuntime(6185):   at android.app.LoadedApk.initializeJavaContextClassLoader(LoadedApk.java:377)
  10-28 13:03:38.278: E/AndroidRuntime(6185):   at android.app.LoadedApk.getClassLoader(LoadedApk.java:320)
  10-28 13:03:38.278: E/AndroidRuntime(6185):   at android.app.LoadedApk.makeApplication(LoadedApk.java:493)

编辑:

更多代码 - SurfaceView 方法的构造函数:

private MenuActivity menuActivity;
public MenuPanel(Context context,MenuActivity activity) {
    super(context);
    menuActivity = activity;;
}

整个活动代码:

public class MenuActivity extends Activity {

private MenuPanel panel;
@Override
protected void onCreate(Bundle savedInstanceState) {
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
    WindowManager.LayoutParams.FLAG_FULLSCREEN);
    super.onCreate(savedInstanceState);
    panel = new MenuPanel(this,this);
    panel.getHolder().setFormat(PixelFormat.RGBA_8888);
    setContentView(panel);
}

@Override
public void onBackPressed() {
    // TODO Auto-generated method stub
    panel.onBackPressed(this);
}

@Override
protected void onDestroy() {
    // TODO Auto-generated method stub
    super.onDestroy();
}

@Override
protected void onPause() {
    panel.pauseGame();
    super.onPause();
}

@Override
protected void onStop() {
    //panel.recycleBitmaps();
    // TODO Auto-generated method stub
    super.onStop();
}

@Override
protected void onRestart() {
    // TODO Auto-generated method stub
    super.onRestart();
}

@Override
protected void onResume() {
    if (panel.getbPaused()) panel.resumeGame();
    super.onResume();
}
}

EDIT2:

也尝试在activity类中添加一个方法并从surfaceview类中调用,但结果是一样的。

EDIT3:

public class ExitActivity extends Activity{

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getIntent().getBooleanExtra("EXIT", false)) {
            finish();
        }else {
            Intent myIntent = new Intent(ExitActivity.this, SplashActivity.class);
            ExitActivity.this.startActivity(myIntent);
        }
    }
}

【问题讨论】:

  • 使用activity.this 而不是activity.getApplicationContext()
  • 我不能这样做,因为。它用红色下划线。请记住,代码在另一个类中,并且我的活动有该类的一个实例。所以“活动”只是通过构造函数传递的活动
  • 你能发布更多代码吗?你如何创建实例活动类?
  • ExitActivity 是否正在启动?
  • 不是的,我在它的onCreate方法中添加了Log.d(),没有出现。

标签: java android android-activity crash surfaceview


【解决方案1】:

不确定这是否有帮助,但请尝试使用以下方法之一:

  1. 我宁愿只将上下文传递给视图,而不是整个活动

  2. 或者创建一个监听器并在视图中启动它。在活动中捕获它并从那里开始另一个活动

编辑: 根据编辑的问题,尽量不要在 MenuPanel 类中使用 MenuActivity。只需存储 Context 并使用它来代替 menuActivity。

private Context context = null;
public MenuPanel(Context context) {
    super(context);
    this.context = context;
}

然后:

Intent intent = new Intent(context, ExitActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.putExtra("EXIT", true);
context.startActivity(intent);

但我还是更喜欢创建一个监听器 (2.),在我看来它更干净。

【讨论】:

  • 双击代码编辑器窗口的提升线(在eclipse中)
  • 我想我发现这里发生了什么。我没有启动新的活动,而是试图停止我的线程,它就在那里崩溃了。所以现在我们继续讨论它为什么会崩溃另外添加这个调试点对我有帮助吗?因为它似乎什么也没做
  • 如果您在调试模式下启动应用程序(小错误按钮),它将暂停代码执行。然后您可以检查所有变量是否为空或它们持有什么值,还可以尝试执行任何函数等。
  • 好吧,当我想启动调试模式时,应用程序崩溃了。
【解决方案2】:

首先,在意图中使用活动。并在 Intent 中添加标志 FLAG_ACTIVITY_NEW_TASK,当您从另一个类开始新活动时。

Intent intent = new Intent(menuActivity , ExitActivity.class);  //use menuactivity as that's your global variable in SurfaceView
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.putExtra("EXIT", true);
menuActivity.startActivity(intent);

希望这会有所帮助。

【讨论】:

  • 它只是停止响应,黑屏并且它没有崩溃
  • ExitActivity 工作得很好,因为首先应用程序启动到其中,然后加载下一个活动。但可以肯定的是,我会发布它。其实应该是GameActivity,我只是改成ExitActivity看看是不是GameActivity的问题
  • if (getIntent().getBooleanExtra("EXIT", false)) { finish(); }放一个调试点
  • 不要专注于 ExitActivity,因为它甚至还没有开始......我还告诉过你,我想从这个开始的任何活动都会发生这种情况
  • ok @Greyshack 尝试编辑答案。并在Intent intent = new Intent 放置一个调试点,看看它在哪里停止工作。
【解决方案3】:

编辑: 根据您编辑的代码,在您的 MenuPanel 中:

Intent intent = new Intent(getContext(), ExitActivity.class);
 intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
 intent.putExtra("EXIT", true);
 getContext().startActivity(intent);

同时删除自定义构造函数和您在ExitActivityonCreate 中的“递归”调用。

【讨论】:

  • 您确定此时您的对象活动不为空吗?请记住,如果它是一个片段,您可以执行 getContext()
  • 为什么它在任何时候都是空的?无论如何,我尝试不使用该对象并在活动类中创建一个方法来更改活动,并从表面视图中调用它,但结果是相同的
  • 你的 MenuPanel 扩展了 SurfaceView 这已经是一个视图,为什么你不直接使用 getContext() 而不是创建一个自定义构造函数并存储你的活动引用? (它已经存储在视图中)。检查有关自定义视图构造函数的答案:stackoverflow.com/a/2888594/1668144
  • Intent intent = new Intent(getContext(), ExitActivity.class); getContext().startActivity(intent);这也不好用
  • 它只是停止响应并在一段时间后显示。但正如我在另一条评论中所说,我删除了活动更改的代码,而是尝试停止我的线程并且它也停止响应。我不知道为什么,它以前工作过。
猜你喜欢
  • 2020-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多