0

I want to enter details from EnterDetails class and view saved details in MainActivity.

public class MainActivity extends AppCompatActivity {
EditText nameBox ;
EditText sclBox;
Spinner genderMenu;
EditText ageBox;
SharedPreferences sharedPref;
TextView label ;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    nameBox = findViewById(R.id.editText);
    sclBox = findViewById(R.id.editText3);
    ageBox = findViewById(R.id.editText2);
    genderMenu = findViewById(R.id.spinner);
    sharedPref = getSharedPreferences("mypref",Context.MODE_PRIVATE);
    label = findViewById(R.id.textView);

    if(isDetailsEmpty(0)){
        label.setText("Enter new Details");

    }else{
        setDetails();
    }

}

public  boolean isDetailsEmpty(int i){


    if(i ==0) {
        if (sharedPref.getString("txtName", "").isEmpty() || sharedPref.getString("txtAge", "").isEmpty() || sharedPref.getString("txtScl", "").isEmpty()) {
            return true;

        } else {
            return false;
        }
    }{
        if(nameBox.getText().toString().isEmpty() || ageBox.getText().toString().isEmpty() || sclBox.getText().toString().isEmpty()){
            return true;
        }else{
            return false;
        }
    }
}

public void setDetails(){
    label.setText("Name : " +sharedPref.getString("txtName","Default")+"\n"+
            "Age : " +sharedPref.getString("txtAge","Default")+"\n"+
            "Gender : " +sharedPref.getString("optGender","Default")+"\n"+
            "School : " +sharedPref.getString("txtScl","Default")+"\n");

}

public void onClickLoadIntent(View v){
    Intent enterDet = new Intent(this, EnterDetails.class);
    startActivity(enterDet);
}

}

`public class EnterDetails extends MainActivity {

@Override
protected void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.enter_details);
}

public void onClickSave(View v){
    if(isDetailsEmpty(1)) {
        Toast.makeText(EnterDetails.this,"Empty Details!", Toast.LENGTH_SHORT).show();
    }else{
        SharedPreferences.Editor editor = sharedPref.edit();
        editor.putString("txtName", nameBox.getText().toString());
        editor.putString("txtAge", ageBox.getText().toString());
        editor.putString("optGender", genderMenu.getSelectedItem().toString());
        editor.putString("txtScl", sclBox.getText().toString());
        editor.commit();
        Toast.makeText(EnterDetails.this,"Saved", Toast.LENGTH_SHORT).show();
        startActivity(new Intent(this,MainActivity.class));

    }
}

} `

I want to enter details from EnterDetails class and view saved details in MainActivity. But I get the folloing error.

E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.userdetails, PID: 31945
java.lang.IllegalStateException: Could not execute method for android:onClick
    at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:390)
    at android.view.View.performClick(View.java:5646)
    at android.view.View$PerformClick.run(View.java:22473)
    at android.os.Handler.handleCallback(Handler.java:761)
    at android.os.Handler.dispatchMessage(Handler.java:98)
    at android.os.Looper.loop(Looper.java:156)
    at android.app.ActivityThread.main(ActivityThread.java:6517)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:942)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:832)
 Caused by: java.lang.reflect.InvocationTargetException
    at java.lang.reflect.Method.invoke(Native Method)
    at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:385)
    at android.view.View.performClick(View.java:5646) 
    at android.view.View$PerformClick.run(View.java:22473) 
    at android.os.Handler.handleCallback(Handler.java:761) 
    at android.os.Handler.dispatchMessage(Handler.java:98) 
    at android.os.Looper.loop(Looper.java:156) 
    at android.app.ActivityThread.main(ActivityThread.java:6517) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:942) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:832) 
 Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.text.Editable android.widget.EditText.getText()' on a null object reference
    at com.example.userdetails.MainActivity.isDetailsEmpty(MainActivity.java:64)
    at com.example.userdetails.EnterDetails.onClickSave(EnterDetails.java:20)
    at java.lang.reflect.Method.invoke(Native Method) 
    at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:385) 
    at android.view.View.performClick(View.java:5646) 
    at android.view.View$PerformClick.run(View.java:22473) 
    at android.os.Handler.handleCallback(Handler.java:761) 
    at android.os.Handler.dispatchMessage(Handler.java:98) 
    at android.os.Looper.loop(Looper.java:156) 
    at android.app.ActivityThread.main(ActivityThread.java:6517) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:942) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:832) 

How to fix this? I have already extended EnterDetails to MainActivity.

Similar Question : What is a NullPointerException, and how do I fix it?

  • **Could not execute method for android:onClick** You have mentioned in your `R.layout.enter_details` a method (for that class) you have not implemented in your java code. A simple mistake. – Jon Goodwin Mar 15 '19 at 03:01

1 Answers1

1

What you are doing is wrong. EnterDetails has its own layout called R.layout. enter_details, so when you set setContentView(R.layout.enter_details);, it will override the whole content so all views and layouts in MainActivity is no longer accessible. What you need to do is implement EnterDetails normally and use Intent to send data between activities.

public class EnterDetails extends AppCompatActivity {

    private boolean isDetailsEmpty = false;

    @Override
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.enter_details);
        isDetailsEmpty = getIntent().getBooleanExtra("test1", false)
    }

    public void onClickSave(View v){
        if(isDetailsEmpty) {
        ...
    }
}

And pass data from your MainActivity

public void onClickLoadIntent(View v){
    Intent enterDet = new Intent(this, EnterDetails.class);
    enterDet.putExtra("test1", isDetailsEmpty(1))
    startActivity(enterDet);
}

Finally, please do more research on how Activity works https://medium.com/@peterekeneeze/passing-data-between-activities-2d0ef122f19d

Bach Vu
  • 2,298
  • 1
  • 15
  • 19