为成员变量分配值时,应用崩溃

时间:2019-06-05 09:27:19

标签: java android function class

我想知道为什么当我声明一个成员变量并为它分配一个与按钮链接的值时,应用程序不断崩溃。但是,当我声明不带任何值并将其赋予onCreate方法中的值时,该应用程序运行良好。

在以下情况下崩溃:-

public class MainActivity extends AppCompatActivity {
    Button buttonTrue = findViewById(R.id.buttonTrue);
    protected void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        buttonTrue.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(getApplicationContext(), "False", Toast.LENGTH_SHORT).show();

            }
        });
}

在以下情况下不会崩溃:-

public class MainActivity extends AppCompatActivity {
    Button buttonTrue;
    protected void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        buttonTrue  = findViewById(R.id.buttonTrue);
        buttonTrue.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(getApplicationContext(), "False", Toast.LENGTH_SHORT).show();

            }
        });
}

2 个答案:

答案 0 :(得分:3)

除非实际将布局设置为findViewById(),否则不能使用Activity。您的应用将崩溃,因为首先创建该类时,因为您尚未设置布局,所以没有ID为Button的{​​{1}}。

您将始终获得R.id.buttonTrue的帮助。

按ID查找视图的正确方法是在执行NullPointerException之后在“活动”视图层次结构中找到它们。

如果在执行setContentView(R.layout.activity_main)之前尝试查找相同的视图,即尝试这样做,则会遇到相同的NullPointerException

setContentView()

答案 1 :(得分:0)

在第一个代码段中,您尝试过

Button buttonTrue = findViewById(R.id.buttonTrue);

如您所见,您正在尝试在设置setContentView之前查找findView,只有在onCreate中的setContentView之后,activity和inflater才知道要使用哪个布局文件。如果您在第一个代码段中执行此操作

  public class MainActivity extends AppCompatActivity {
    Button buttonTrue;
    protected void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        buttonTrue= = findViewById(R.id.buttonTrue);
        buttonTrue.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(getApplicationContext(), "False", Toast.LENGTH_SHORT).show();

            }
        });
}

如您所见,我刚刚将findViewById移动到了正确的位置。通过setContentView方法指定布局资源ID后,一切正常:-)