How to fix app crashing after intent activity called

问题: I'm trying to pass a variable from database(created on LoginActivity.java) when user pressing register button and pass the value to HomeActivity.java .Before I use intent e...

问题:

I'm trying to pass a variable from database(created on LoginActivity.java) when user pressing register button and pass the value to HomeActivity.java .Before I use intent extras and bundle, the code works fine(except passing the variable). But after I put the new code, the app crash immediately after I press register button

Ive tried searching for another possible duplication question but none of them having the same problem as mine. Most of them forgot to put the activity in android manifest but I've put the LoginActivity on android manifest. And of course I've noticed there are no error on the code while compiling

This is the home activity

DatabaseHelper myDb;

Intent i = getIntent();

Bundle extras = i.getExtras();

String pname = extras.getString("P_NAME");
int pcoins = extras.getInt("P_COINS");
int pgems = extras.getInt("P_GEMS");

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // Set fullscreen and no title//////////
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
    this.requestWindowFeature(Window.FEATURE_NO_TITLE);

    ////////////////////////////////////

    setContentView(R.layout.main_screen);

    goProfileBtn = (Button) findViewById(R.id.profilebutton);
    shopButton = (Button) findViewById(R.id.shopbutton);
    goBarrackBtn = (Button) findViewById(R.id.barrackbutton);
    goDungeonBtn = (Button) findViewById(R.id.dungeonbutton);
    goFarmBtn = (Button) findViewById(R.id.farmbutton);
    saveBtn = (Button) findViewById(R.id.savebutton);

    NameTxt = (TextView) findViewById(R.id.playerName);
    CoinTxt = (TextView) findViewById(R.id.cointxt);
    GemTxt = (TextView) findViewById(R.id.gemtxt);

    myDb = new DatabaseHelper(this);

    ///////////////////////////////

    NameTxt.setText(pname);
    CoinTxt.setText("Coin: " + pcoins);
    GemTxt.setText("Gem: " + pgems);

    ///////// Button ///////////////////

    goProfileBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent profileSwitch = new Intent(getApplicationContext(), ProfileActivity.class);
            startActivity(profileSwitch);
        }
    });

    goFarmBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent farmSwitch = new Intent(getApplicationContext(), FarmActivity.class);
            startActivity(farmSwitch);
        }
    });

    shopButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            Intent shopSwitch = new Intent(getApplicationContext(), startGame.class);
            startActivity(shopSwitch);
        }
    });

    goBarrackBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            Intent barrackSwitch = new Intent(getApplicationContext(), startBarrack.class);
            startActivity(barrackSwitch);
        }
    });

    goDungeonBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            Intent dungeonSwitch = new Intent(getApplicationContext(), dungeonActivity.class);
            startActivity(dungeonSwitch);
        }
    });
}

@Override
public void onBackPressed() {

    final AlertDialog.Builder builder = new AlertDialog.Builder(HomeActivity.this);
    builder.setMessage("EXIT GAME");
    builder.setCancelable(true);
    builder.setNegativeButton("NOT NOW",new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialogInterface, int i) {
            dialogInterface.cancel();
        }
    });
    builder.setPositiveButton("YES",new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialogInterface, int i) {
            finish();
        }
    });

    AlertDialog alertdialog = builder.create();
    alertdialog.show();
}
    }

And this is LoginActivity

EditText edit1;
EditText edit2;
EditText edit3;

Button registerBtn;
Button loginBtn;

DatabaseHelper myDb;

User player1;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //Set fullscreen and no title//////////
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
    this.requestWindowFeature(Window.FEATURE_NO_TITLE);

    ///////////////////////////////////////
    setContentView(R.layout.login_screen);

    edit1 = (EditText)findViewById(R.id.editpname);
    edit2 = (EditText)findViewById(R.id.editpemail);
    edit3 = (EditText)findViewById(R.id.editppw);

    registerBtn = (Button)findViewById(R.id.registerbtn);
    loginBtn = (Button)findViewById(R.id.loginbtn);

    myDb = new DatabaseHelper(this);

    loginBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (validate()) {
                String Email = edit2.getText().toString();
                String Password = edit3.getText().toString();
                User currentUser = myDb.Authenticate(new User(null, null, Email, Password));

                if (currentUser != null) {
                    System.out.println("Successfull");

                    Intent intent = new Intent(getApplicationContext(),HomeActivity.class);
                    startActivity(intent);
                    finish();
                } else {
                    System.out.println("Unsuccessfull");
                }
            }
        }
    });

    registerBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (validate()) {
                String UserName = edit1.getText().toString();
                String Email = edit2.getText().toString();
                String Password = edit3.getText().toString();

                if (!myDb.isEmailExists(Email)) {
                    player1 = new User(null, UserName, Email, Password);
                    myDb.addUser(player1);
                    Intent i = new Intent(getApplicationContext(), HomeActivity.class);
                    Bundle extras = new Bundle();
                    extras.putString("P_NAME", player1.getName());
                    extras.putInt("P_COINS", player1.getCoins());
                    extras.putInt("P_GEMS", player1.getGems());
                    i.putExtras(extras);
                    startActivity(i);
                }
            } 
        }
    });
}

public boolean validate() {
    boolean valid = false;
    String Email = edit2.getText().toString();
    String Password = edit3.getText().toString();

    if (!android.util.Patterns.EMAIL_ADDRESS.matcher(Email).matches()) {
        valid = false;
        edit2.setError("Please enter valid email!");
    } else {
        valid = true;
        edit2.setError(null);
    }

    if (Password.isEmpty()) {
        valid = false;
        edit3.setError("Please enter valid password!");
    } else {
        if (Password.length() > 5) {
            valid = true;
            edit3.setError(null);
        } else {
            valid = false;
            edit3.setError("Password is to short!");
        }
    } 
    return valid;
}

I have cut some of the codes for the sake of readability

It supposed to pass the name, coins, and gems, data from the database into the variable in HomeActivity.but it seems my code crash the app


回答1:

I guess you ask the Activity for getIntent before onCreate is called.

Try this:

Intent i;
Bundle extras;

String pname; 
int pcoins;
int pgems; 

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

    i = getIntent();
    extras = i.getExtras();

    pname = extras.getString("P_NAME");
    pcoins = extras.getInt("P_COINS");
    pgems = extras.getInt("P_GEMS");

    // follow with your onCreate code ....
}

回答2:

I've also snapshoted the logcatLogcat snapshot from android device

  • 发表于 2019-01-13 14:31
  • 阅读 ( 253 )
  • 分类:网络文章

条评论

请先 登录 后评论
不写代码的码农
小编

篇文章

作家榜 »

  1. 小编 文章
返回顶部
部分文章转自于网络,若有侵权请联系我们删除