我似乎无法解决这个令人困惑的问题,我有很多东西想在我的类(class)顶部添加以帮助减少困惑。
由于多种方法使用这些复选框变量。
我想把所有东西都放在开口支架的正下方。
这是有效的,但不是我想要的:
public class MyClass extends Activity implements View.OnClickListener {
//leaving out most code like onCreate. Just pretend it's there.
public void checkboth(View view) {
CheckBox cb1 = (CheckBox) findViewById(R.id.cb1);
CheckBox cb2 = (CheckBox) findViewById(R.id.cb2);
cb1.setchecked(true);
cb2.setchecked(true);
}
@Override
public void onClick(View v) {
}
}
但是对于我的生活,我无法弄清楚为什么我不能这样做:
public class MyClass extends Activity implements View.OnClickListener {
CheckBox cb1 = (CheckBox) findViewById(R.id.cb1);
CheckBox cb2 = (CheckBox) findViewById(R.id.cb2);
//leaving out most code like onCreate. Just pretend it's there.
public void checkboth(View view) {
cb1.setchecked(true);
cb2.setchecked(true);
}
@Override
public void onClick(View v) {
}
}
最佳答案
无法初始化 View
在这样的方法之外
CheckBox cb1 = (CheckBox) findViewById(R.id.cb1);
CheckBox cb2 = (CheckBox) findViewById(R.id.cb2);
因为这意味着这些行在
onCreate()
之前运行这导致这些变量为 null
并抛出 NPE
当您尝试对这些变量调用方法时。这是因为您调用 setContentView(R.layout.your_layout)
onCreate()
内部和你的Views
“活”在里面layout
.这意味着直到您的 layout
才能初始化它们。已inflated
调用 setContentView()
.你 必须调用setContentView()
在尝试初始化您的 Views
之前 .没有办法绕过那部分。有些人做的可能有帮助的是创建一个单独的函数,在
setContentView()
之后初始化这些变量。叫做。像这样的东西public class MyActivity
// declare your Views so they are global to the class
TextView tv;
// more views
@Override
public void onCreat(stuff)
{
// super call
setContentView(R.layout.my_layout);
init();
然后在你的
init()
函数初始化所有Views
你已经声明private void init()
{
tv = (TextView) findViewById(R.id.myTextView);
// more initializations
}
但您可以在
onCreate()
中初始化它们, onResume()
或任何地方,只要是 之后 setContentView()
以这种方式声明和初始化它们将确保它们都可用于 Activity
的其他函数、监听器、内部类等。 .如果你有很多 Views
它可能会减少一点“困惑”。
关于java - 我想将变量设置在类的顶部而不是方法中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44596309/