Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/226.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么Android应用程序在类的开头使用findViewById(R.id.*******)初始化变量时崩溃?_Android_Findviewbyid - Fatal编程技术网

为什么Android应用程序在类的开头使用findViewById(R.id.*******)初始化变量时崩溃?

为什么Android应用程序在类的开头使用findViewById(R.id.*******)初始化变量时崩溃?,android,findviewbyid,Android,Findviewbyid,我只是测试输入/输出,没有特殊用途,这是最后一个成功运行的代码: public class MainActivity extends AppCompatActivity { /* EditText username = (EditText)findViewById(R.id.editText_Username); EditText password = (EditText)findViewById(R.id.editText_Password); TextView inputdata = (T

我只是测试输入/输出,没有特殊用途,这是最后一个成功运行的代码:

public class MainActivity extends AppCompatActivity
{

/*
EditText username = (EditText)findViewById(R.id.editText_Username);
EditText password = (EditText)findViewById(R.id.editText_Password);
TextView inputdata = (TextView)findViewById(R.id.textView_InputData);
TextView welcome = (TextView)findViewById(R.id.textView_Welcome);
Button login=(Button)findViewById(R.id.button_Login);
Button anotherLogin=(Button)findViewById(R.id.button_Login_Another);

public void doLoginOnClick(View v)
{
    String s1=username.getText().toString();
    inputdata.setText(s1);
}

*/
@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    FloatingActionButton fab = (FloatingActionButton)findViewById(R.id.fab); 
    fab.setOnClickListener(new View.OnClickListener()
    {
        @Override
        public void onClick(View view)
        {
            Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                    .setAction("Action", null).show();
        }
    });
} 

}

我正在尝试使用

findViewById(R.id.**)

正如您所看到的,我在代码的开头将此代码放在注释中

EditText username = (EditText)findViewById(R.id.editText_Username);
EditText password = (EditText)findViewById(R.id.editText_Password);
TextView inputdata = (TextView)findViewById(R.id.textView_InputData);
TextView welcome = (TextView)findViewById(R.id.textView_Welcome);
Button login=(Button)findViewById(R.id.button_Login);
Button anotherLogin=(Button)findViewById(R.id.button_Login_Another);
如果我删除上面的注释并运行它(在emulator和real device中),程序会立即崩溃,我很惊讶这里出了什么问题

甚至我也尝试过用构造函数初始化同样的东西

但是如果我把它放在
onCreate()
中就不会崩溃了?为什么?

我试图获取用户名和密码的信息,并使用

EditText username = (EditText)findViewById(R.id.editText_Username);
EditText password = (EditText)findViewById(R.id.editText_Password);
TextView inputdata = (TextView)findViewById(R.id.textView_InputData);
inputdata.setText(username.getText.toString()+" "+password.getText.toString());

有更好或更简单的方法吗?

实例成员变量在实例本身初始化时初始化。现在进行
findViewById()还为时过早。

onCreate()
之前,您的活动还没有
内部需要的
窗口。在
setContentView()
(您应该在
onCreate()
中调用)之前,也找不到任何视图

因此,在
onCreate()
setContentView()
之后初始化视图引用添加此代码

 EditText username =  findViewById(R.id.editText_Username);
 EditText password = findViewById(R.id.editText_Password);
 TextView inputdata = findViewById(R.id.textView_InputData);
 TextView welcome = findViewById(R.id.textView_Welcome);
 Button login = findViewById(R.id.button_Login);
 Button anotherLogin = findViewById(R.id.button_Login_Another);

方法后

setContentView(R.layout.activity_main);

嘿,我看到您正在定义和初始化实例变量。 我要做的是定义实例变量-
EditText username
,然后在
onCreate
方法中初始化它们-
username=(EditText)findViewById(R.id.EditText\u username)


您不初始化实例变量的原因是,元素在
onCreate
方法中的
setContentView
之后才准备就绪-我可能会有错误,但我的最佳做法是定义实例变量,然后在设置setContentView()之前在onCreate方法中初始化它们您无法初始化视图项。因为此时不存在活动的视图


将初始化保留在一个单独的方法中,并在将视图设置为“活动”后调用该方法。

如果没有任何stacktrace,我打赌这是一个nullPointerException,由findViewById引起,返回null是由未加载布局引起的。在setContentView()之后调用它。是的,我建议这样做,并且发现它非常有效
setContentView(R.layout.activity_main);