【发布时间】:2017-04-27 21:47:42
【问题描述】:
我正在尝试制作一个生成密码的应用程序,然后将其保存到应用程序中的单独页面供用户查看。为此,我有一个按钮来生成密码,另一个按钮应该将该密码保存到另一个页面。我在一个类中使用 setText 来更新另一个类/活动的 TextView 时遇到问题。
带按钮的类。
public class Generate extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_gen);
final TextView passText = (TextView) findViewById(R.id.passText);
//final TextView savedText = (TextView) findViewById(R.id.savedText);
Button generatePassword = (Button) findViewById(R.id.generatePassword);
Button savePassword = (Button) findViewById(R.id.savePassword);
generatePassword.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int passwordLength = 16;
String allowedChars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%&";
char[] allowedCharsArray = allowedChars.toCharArray();
char[] chars = new char[passwordLength];
Random random = new Random();
for (int i = 0; i < passwordLength; i++) {
chars[i] = allowedCharsArray[random.nextInt(allowedChars.length())];
}
passText.setText(chars, 0, passwordLength);
}
});
savePassword.setOnClickListener(new View.OnClickListener(){
public void onClick(View v) {
Save obj= new Save();
obj.newText.setText("Hello"); //testing to see if this works
/*Save obj = new Save();
TextView savedText = obj.getTextView();
savedText.setText("hello");*/
}
});
}
}
应该更改的带有 TextView 的活动。
public class Save extends AppCompatActivity {
public static TextView newText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_save);
newText = (TextView) findViewById(R.id.savedText);
}
}
目录。
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference
at cs.rice.password_csp.Generate$2.onClick(Generate.java:52)
at android.view.View.performClick(View.java:5637)
at android.view.View$PerformClick.run(View.java:22429)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6121)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:889)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:779)
我在这里得到的是它说这条线引用了一个空对象。
obj.newText.setText("Hello");
我不明白为什么会这样,因为我很确定这里的一切看起来都是正确的,但我猜不是。
【问题讨论】:
-
将任何视图设为静态是个坏主意。查看如何在活动之间传递数据。
-
请记住,
static表示变量与类相关联,而不是与每个单独的成员相关联。static仅应在类的每个实例具有相同值时使用。在这种情况下,通过将View设为静态变量,您就是说每个活动都共享相同的视图。这会导致一些不良结果。
标签: java android nullpointerexception textview settext