Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当我尝试重新创建活动时,应用程序崩溃_Java_Android - Fatal编程技术网

Java 当我尝试重新创建活动时,应用程序崩溃

Java 当我尝试重新创建活动时,应用程序崩溃,java,android,Java,Android,我正在编写一个有两个活动的应用程序。第一种方法将内容视图设置为.xml。在.xml中,当单击一个按钮时,它调用另一个活动并再次设置视图 直到这一部分,它工作得非常完美。但当应用程序到达某个点时,它会在第一个活动中调用一个应该重新创建的方法。但是“重新创建”会使我的应用程序崩溃 在下面找到我的两项活动: public class MainActivity extends Activity { private GameActivity gameAc; @Override protected v

我正在编写一个有两个活动的应用程序。第一种方法将内容视图设置为.xml。在.xml中,当单击一个按钮时,它调用另一个活动并再次设置视图

直到这一部分,它工作得非常完美。但当应用程序到达某个点时,它会在第一个活动中调用一个应该重新创建的方法。但是“重新创建”会使我的应用程序崩溃

在下面找到我的两项活动:

public class MainActivity extends Activity {


private GameActivity gameAc;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);


    setContentView(R.layout.activity_main);
}

public void startGame(View v) {



    gameAc = new GameActivity();//this line calls the second activity


}



public void setViewActivity(){

    recreate(); // this is the line that crashes the app

}

}
这是我的第二项活动

public class GameActivity extends Activity {

//declare class Gamedraw
private GameDraw gameDraw;

//too hold screen dimensions
Point size = new Point();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    //get phone dimensions
    Display display = getWindowManager()
            .getDefaultDisplay();

    display.getSize(size);



    //initialse class
    gameDraw = new GameDraw(this, size);



    //set view to gamedraw
    setContentView(gameDraw);

}

@Override
protected void onResume() {
    super.onResume();
    gameDraw.resume();
}

@Override
protected void onPause() {
    super.onPause();
    gameDraw.pause();
}
}
在第一次活动中。重新创建会使应用程序崩溃

不完全确定这是否是stacktrace的意思。如果不是,请告诉我

~

~~

这是调用setViewActivity的代码; 代码在我的GameDraw类中,在第二个活动中被调用。此类处理屏幕用户输入并绘制游戏

 public class GameDraw extends SurfaceView implements Runnable {

 private MainActivity MAobject;

  public GameDraw(Context context, Point size) {
 //this handles all drawing to screen
 }


  @Override
   public boolean onTouchEvent(MotionEvent event) {
      switch (event.getAction() & MotionEvent.ACTION_MASK) {
        case MotionEvent.ACTION_DOWN :

            if (death == false) {

                if (firstRun) {
                    firstRun = false;
                    gravity = true;
                    Log.e("viewtrace", "test");

                } else {
                    jumping = true;

                }
            }
            else{
                Log.e("viewtrace", "1");
                MAobject.setViewActivity();

            }

            break;
    }

    return true;
}
}
添加了调用第一个ActivityMain的清单

 <?xml version="1.0" encoding="utf-8"?>
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.android.runningman">

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity android:name=".MainActivity"

        android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
        android:screenOrientation="landscape"
        >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

 </manifest>

活动类不应直接实例化,即没有新的活动。它们由系统创建和销毁。要启动一个新活动,您需要创建一个Intent,然后调用Context类的startActivity方法

在您的情况下,要开始游戏活动,您可以称之为

startActivity(new Intent(this, GameActivity.class));
用你的StartName方法

对于更新后的问题,还需要将对setViewActivity的调用替换为

您可以在Android开发者指南中找到更多信息,例如:

由于您更新了问题,另一个问题变得明显: 在Android中,您需要声明清单中的所有活动。您的清单仅包含MainActivity,因此无法启动GameActivity。要解决此问题,需要在应用程序标记之间的清单文件中添加以下声明:

你打电话到哪里了?setViewActivity

尝试此呼叫其他活动


post StackTrace您在哪里调用setViewActivity?我按照您的建议更改了代码,但代码仍在崩溃。好的,既然您已经更新了这个问题,光靠我的解决方案是没有用的。您从何处获取MainActivity对象MAobject?通常,您不应该引用其他活动。另外,你为什么一开始就称之为“重建”?当你打电话时,你希望发生什么?如果您想返回到MainActivity,您还应该使用startActivity而不是调用recreate。我创建MAobject的原因是因为它不允许我从静态上下文中重新创建。因此,如果我只调用class.method,它会给我错误。我遗漏了一行:MAobject=newmainActivity;我在这里声明对象。我之所以使用recreate是因为我想从一开始就启动应用程序。我假设使用更新后的答案,我必须将startActivitynew-Intentthis,MainActivity.class;最初调用setViewActivity的GameDraw类中的行。当我这样做时,它会给我一个无法解析的错误方法。所以我的猜测是,它必须从扩展活动的类中调用。哦,很抱歉,我错过了视图类中的这一点。在这里,您必须将其替换为getContext。那么它应该有望成功。我的答案变了。
startActivity(new Intent(this, GameActivity.class));
getContext().startActivity(new Intent(getContext(), MainActivity.class));

     public void startGame(View v) 
     {
         startActivity(new Intent(this, GameActivity.class));
     }