我似乎无法解决这个令人困惑的问题,我有很多很多东西需要在课堂上添加,以帮助减少混乱.
由于多种方法使用这些复选框变量.
我想把所有东西放在开口支架下面的顶部.
这是有效的,但不是我想要的:
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) {
}
}
Run Code Online (Sandbox Code Playgroud)
但是对于我的生活,我无法弄清楚为什么我不能这样做:
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) {
}
}
Run Code Online (Sandbox Code Playgroud)
你不能View在这样的方法之外初始化s
CheckBox cb1 = (CheckBox) findViewById(R.id.cb1);
CheckBox cb2 = (CheckBox) findViewById(R.id.cb2);
Run Code Online (Sandbox Code Playgroud)
因为那意味着这些行在之前运行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();
Run Code Online (Sandbox Code Playgroud)
然后在你的init()函数中初始化Views你声明的所有内容
private void init()
{
tv = (TextView) findViewById(R.id.myTextView);
// more initializations
}
Run Code Online (Sandbox Code Playgroud)
但是你可以只在初始化它们onCreate(),onResume()或者只要它在 setContentView()
以这种方式声明和初始化它们之后将确保它们都可用于其他函数,监听器,内部类等等Activity.如果你有很多Views它可能会减少"混乱".
| 归档时间: |
|
| 查看次数: |
398 次 |
| 最近记录: |