猿问

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

我试图在单击按钮时调用的函数中使用 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文件确实包含TextView带有tipViewid 的元素,因此 XML 文件中不存在元素的理论不成立。


元芳怎么了
浏览 184回答 2
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;        }    }}

蛊毒传说

您正在尝试从单击视图(例如按钮)中查找视图,而“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;        }    }
随时随地看视频慕课网APP

相关分类

Java
我要回答