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