【问题标题】:Android app crash when try to overwrite text in a TextView from other class尝试从其他类覆盖 TextView 中的文本时,Android 应用程序崩溃
【发布时间】:2013-05-14 22:29:39
【问题描述】:

我尝试在一个名为 UserProfile() 的类中更改 3 个文本视图,从 UpdateProfile() 类调用方法 update(),UserProfile 类执行以下操作:

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");
}

}

updateButton 方法调用 UpdateProfile 类:

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();
    }

}

这是我的 logcat 文件,如您所见,前 2 个标志打印正确,错误是当我尝试在 TextView 上设置另一个文本时,但字符串的值(nname、nsurname 和 nemail)是非空原因也打印在控制台帮助中!

    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

注意:我已经清理了项目,并在 onCreate 方法之外定义了 ProfileUser 类中的 TextView 和 UpdateProfile 中的 TextEdit,但不起作用。

谢谢。

【问题讨论】:

    标签: java android nullpointerexception android-activity invocationtargetexception


    【解决方案1】:

    Android 中的 Activity 是独立的容器,绝不允许彼此直接接触。这是因为 Android 背后的应用程序堆栈在 Activity 不再处于前台时“冻结”它们,甚至可以根据操作系统的判断将其交换到硬盘存储以节省 RAM。

    您的UserProfile 封装应该在UpdateProfile 活动关闭后重新加载其数据,或者通过startActivityForResult 请求以正确方式返回通信。

    从各个角度来看,您当前的实现在技术上都不正确,因为您将UpdateProfile 活动硬编码为始终从UserProfile 活动中调用。如果有一天你引入了一个新的菜单选项来直接从主屏幕调用它怎么办?活动总是分开的,不应做出这样的假设。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多