【问题标题】:App crashes when member variables are assigned with value [duplicate]为成员变量赋值时应用程序崩溃[重复]
【发布时间】:2019-06-05 09:27:19
【问题描述】:

我想知道为什么当我声明一个成员变量并为其分配一个与按钮链接的值时,应用程序总是崩溃。但是,当我在没有值的情况下声明它并在 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();

            }
        });
}

【问题讨论】:

  • 好像你不能初始化一个Button 之前 onCreate() 被调用,不是吗?

标签: java android function class


【解决方案1】:

您不能使用findViewById(),除非您将布局实际设置为Activity。您的应用程序会崩溃,因为在第一次创建类时,没有 ID 为 R.id.buttonTrueButton,因为您尚未设置布局。

您所做的事情总会得到NullPointerException

按 ID 查找视图的正确方法是在执行 setContentView(R.layout.activity_main) 之后它们在 Activity 视图层次结构中可用。

如果您在执行setContentView() 之前尝试找到相同的视图,即如果您尝试这样做,您将遇到相同的NullPointerException

protected void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Button button = findViewById(R.id.your_button);
        //This will give NullPointerException as you're trying to find
        //button before activity gets any layout to work with
        setContentView(R.layout.activity_main);
}

【讨论】:

    【解决方案2】:

    在第一个代码sn-p中,你已经尝试过做

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

    如您所见,您尝试在设置 setContentView 之前查找视图,只有在 onCreate 中的 setContentView 之后,活动和充气器才知道要处理哪个布局文件。在您的情况下,如果您对第一个代码段执行此操作

      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 后,一切正常:-)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-04
      • 1970-01-01
      • 2023-03-21
      • 2015-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-07
      相关资源
      最近更新 更多