view.findViewById()在一个函数中返回null,但在另一个函数中工作正常

时间:2019-05-29 04:20:12

标签: java android

我试图在单击按钮时调用的函数中使用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文件中不存在元素的理论。

2 个答案:

答案 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;
        }
    }