我想将变量设置在我的类的顶部,而不是在方法中

tml*_*mlh 2 java android

我似乎无法解决这个令人困惑的问题,我有很多很多东西需要在课堂上添加,以帮助减少混乱.

由于多种方法使用这些复选框变量.

我想把所有东西放在开口支架下面的顶部.

这是有效的,但不是我想要的:

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)

cod*_*gic 7

你不能View在这样的方法之外初始化s

CheckBox cb1 = (CheckBox) findViewById(R.id.cb1);
CheckBox cb2 = (CheckBox) findViewById(R.id.cb2);
Run Code Online (Sandbox Code Playgroud)

因为那意味着这些行在之前运行onCreate()会导致这些变量出现nullNPE在您尝试调用这些变量上的方法时抛出.这是因为你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它可能会减少"混乱".