我试图在单击按钮时调用的函数中使用view.findViewById()获取TextView对象。在onClickButton()中,返回null,而在其他函数setDefaultValues()中,它可以正常工作。
Activity1.java
public class Activity1 extends AppCompatActivity {
private final Double TIP = 10.0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_1);
setDefaultValues();
}
private void setDefaultValues() {
TextView tipView = findViewById(R.id.tipView);
tipView.setText(getString(R.string.main_msg_tip,Double.toString(TIP)));
}
public void onClickToggleButton(View view){
TextView tipView = view.findViewById(R.id.tipView);
switch (view.getId()) {
case (R.id.toggleButtonBad):
tipView.setText(getString(R.string.main_msg_tip, Double.toString(BAD)));
break;
}
}
在测试应用程序时,显示以下错误消息:
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object referenceat com.example.chandan.learning.Activity1.onClickToggleButton
编辑:activity_1.xml
文件确实包含ID为TextView
的{{1}},因此无法使用XML文件中不存在元素的理论。
答案 0 :(得分:2)
复制代码是一种不好的做法。现在,您有了方法findViewById
的重复项。为避免这种情况,您应该在类Activity1
中创建一个全局变量。那也将解决您的问题:
public class Activity1 extends AppCompatActivity {
private final Double TIP = 10.0;
private TextView tipView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_1);
setDefaultValues();
}
private void setDefaultValues() {
tipView = findViewById(R.id.tipView);
tipView.setText(getString(R.string.main_msg_tip, Double.toString(TIP)));
}
public void onClickToggleButton(View view) {
switch (view.getId()) {
case (R.id.toggleButtonBad):
tipView.setText(getString(R.string.main_msg_tip, Double.toString(BAD)));
break;
}
}
}
答案 1 :(得分:0)
当“ tipView”在主视图容器中时,您试图从单击的视图(例如按钮)内部查找视图。因此,如下更新您的方法“ onClickToggleButton”:
public void onClickToggleButton(View view) {
TextView tipView = findViewById(R.id.tipView);
switch (view.getId()) {
case (R.id.toggleButtonBad):
tipView.setText(getString(R.string.main_msg_tip, Double.toString(BAD)));
break;
}
}