为什么即使无法访问实际上已初始化的OnCreate,也无法在OnClick中初始化Button?

时间:2019-07-30 19:03:08

标签: java android initialization declaration

我试图更好地理解声明和初始化,但我并不真正理解为什么您无法在OnClick中更改Button的文本,尽管它无法访问OnCreate,因为它具有另一个功能。

当还在onCreate中声明变量时,它不起作用,而只有初始化起作用。请解释原因。谢谢


package com.example.myapplication;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    Button btn;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btn = (Button)findViewById(R.id.Button);
        btn.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        btn.setText("Sample Text");
    }
}

因此,我试图理解为什么您可以更改Button的文本,即使尚未在OnClick中对其进行初始化。非常感谢<3

2 个答案:

答案 0 :(得分:0)

它已被初始化。看到变量btn吗?它在类级别,而不是在函数内部。这意味着该变量存储在该类的实例中,而不是存储在堆栈中,并且将在对该类的同一实例的函数调用之间保持不变。由于将在与onCreate相同的实例上调用onClick,因此在onCreate中对其进行初始化时,它将保持初始化状态。因此,在调用onClick时,该值已经设置。

答案 1 :(得分:0)

您有一个ValueError: could not convert string to float: '0.004f' Button,目前为空,因此您无能为力。

(Button btn;)内部,您的按钮已初始化(onCreate),现在您可以为其分配点击 与您一样的监听器-btn = (Button)findViewById(R.id.Button);

btn.setOnClickListener(this);的意思是-单击此按钮时称为setOnClickListener方法。

onClick内,您可以更改文本。


因此,我试图理解为什么即使尚未在OnClick中初始化Button的文本,也可以更改它的原因。

您的onClick在类级别是 作为全局变量 ,这意味着您可以从类内部的方法btn访问它会被调用的第一件事(这就是为什么您要初始化按钮哦) 然后初始化按钮,然后可以更改按钮文本。