Question

I try to change 3 textviews in a class called UserProfile() calling the method update() from the class UpdateProfile(), the class UserProfile do something like this:

package com.safm;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;

public class UserProfile extends Activity {
TextView username, usersurname, useremail;

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_profile);

    username = (TextView) findViewById(R.id.username);
    usersurname = (TextView) findViewById(R.id.usersurname);
    useremail = (TextView) findViewById(R.id.useremail);
}

public void updateButton(View view){
    Intent i = new Intent(this, UpdateProfile.class);
    startActivity(i);
}

public void update(String nname, String nusername, String nemail){
    System.out.println("2");
    System.out.println(nname);
    username.setText(nname);
    usersurname.setText(nusername);
    useremail.setText(nemail);
    System.out.println("3");
}

}

The updateButton method invoke the UpdateProfile class:

package com.safm;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

public class UpdateProfile extends Activity {
EditText newusernametxt, newsurnametxt, newemailtxt;

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_actualizarperfil);

    newusernametxt = (EditText) findViewById(R.id.newusernametxt);
    newsurnametxt = (EditText) findViewById(R.id.newsurnametxt );
    newemailtxt = (EditText) findViewById(R.id.newemailtxt );
}

public void updateInfo(View view){      
    String nname = newusernametxt .getText().toString();
    String nsurname = newsurnametxt .getText().toString();
    String nemail = newemailtxt .getText().toString();

    if(nname.compareTo("") != 0 && nsurname.compareTo("") != 0 && nemail.compareTo("") != 0){           
        UserProfile profile = new UserProfile();
        System.out.println("1");

        profile.update(nname, nsurname, nemail);
        System.out.println("4");

        Toast.makeText(this, "Success, the profile has been updated", Toast.LENGTH_SHORT).show();
    }else{
        Toast.makeText(this, "You can't empty fields", Toast.LENGTH_SHORT).show();
    }

}

This is my logcat file, as you can see, the first 2 flags are printed correctly, the error is when I try to set another text on the TextView, but the value of the strings (nname, nsurname and nemail) are not empty cause also is printed in the console HELP!

    05-14 21:43:31.140: I/System.out(878): 1
    05-14 21:43:31.140: I/System.out(878): 2
    05-14 21:43:31.150: I/System.out(878): TextEditValue

    05-14 21:43:31.150: D/AndroidRuntime(878): Shutting down VM
    05-14 21:43:31.150: W/dalvikvm(878): threadid=1: thread exiting with uncaught exception (group=0x40a71930)
    05-14 21:43:31.310: E/AndroidRuntime(878): FATAL EXCEPTION: main
    05-14 21:43:31.310: E/AndroidRuntime(878): java.lang.IllegalStateException: Could not execute method of the activity
    05-14 21:43:31.310: E/AndroidRuntime(878):  at android.view.View$1.onClick(View.java:3599)
    05-14 21:43:31.310: E/AndroidRuntime(878):  at android.view.View.performClick(View.java:4204)
    05-14 21:43:31.310: E/AndroidRuntime(878):  at android.view.View$PerformClick.run(View.java:17355)
    05-14 21:43:31.310: E/AndroidRuntime(878):  at android.os.Handler.handleCallback(Handler.java:725)
    05-14 21:43:31.310: E/AndroidRuntime(878):  at android.os.Handler.dispatchMessage(Handler.java:92)
    05-14 21:43:31.310: E/AndroidRuntime(878):  at android.os.Looper.loop(Looper.java:137)
    05-14 21:43:31.310: E/AndroidRuntime(878):  at android.app.ActivityThread.main(ActivityThread.java:5041)
    05-14 21:43:31.310: E/AndroidRuntime(878):  at java.lang.reflect.Method.invokeNative(Native Method)
    05-14 21:43:31.310: E/AndroidRuntime(878):  at java.lang.reflect.Method.invoke(Method.java:511)
    05-14 21:43:31.310: E/AndroidRuntime(878):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
    05-14 21:43:31.310: E/AndroidRuntime(878):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
    05-14 21:43:31.310: E/AndroidRuntime(878):  at dalvik.system.NativeStart.main(Native Method)
    05-14 21:43:31.310: E/AndroidRuntime(878): Caused by: java.lang.reflect.InvocationTargetException
    05-14 21:43:31.310: E/AndroidRuntime(878):  at java.lang.reflect.Method.invokeNative(Native Method)
    05-14 21:43:31.310: E/AndroidRuntime(878):  at java.lang.reflect.Method.invoke(Method.java:511)
    05-14 21:43:31.310: E/AndroidRuntime(878):  at android.view.View$1.onClick(View.java:3594)
    05-14 21:43:31.310: E/AndroidRuntime(878):  ... 11 more
    05-14 21:43:31.310: E/AndroidRuntime(878): Caused by: java.lang.NullPointerException
    05-14 21:43:31.310: E/AndroidRuntime(878):  at com.safm.UserProfile.update(UserProfile.java:31)
    05-14 21:43:31.310: E/AndroidRuntime(878):  at com.safm.UserProfile.updateInfo(UpdateProfile.java:33)
    05-14 21:43:31.310: E/AndroidRuntime(878):  ... 14 more

NOTE: I've clean the project and defined the TextView in ProfileUser class and the TextEdit in UpdateProfile outside the onCreate method but doesn't work.

Thanks.

Était-ce utile?

La solution

Activities in Android are separate containers, that are in no way allowed to directly touch eachother. This is because the application stack behind Android 'freezes' the activities when they are no longer on the foreground, and could even be swapped to hard storage to save on RAM at the operating system's discretion.

Your UserProfile encapsulation should just reload its data after the UpdateProfile activity is closed, or request communication back the proper way via startActivityForResult.

Your current implementation is technically incorrect from each perspective, since you're hardcoding the UpdateProfile activity to always be called from a UserProfile activity. What if some day you introduce a new menu option to call it directly from the home screen? Activities are always separate, and should not make such assumptions.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top