Я хотел бы установить мои переменные в верхней части моего classа, а не в методе

Кажется, я не могу справиться с этой запутанной проблемой, у меня есть много и много вещей, которые я хотел бы добавить в верхней части моего 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 s вне метода, подобного этому

 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 не будет setContentView() вызвав setContentView() . setContentView() чем пытаться инициализировать свои Views вы должны вызвать setContentView() . В этой части нет пути.

Что некоторые люди могут сделать, это создать отдельную функцию, которая инициализирует эти переменные сразу после 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() Объявление и инициализация их таким образом, убедитесь, что все они доступны для других функций, слушателей, внутренних classов и т. д. Activity . И если у вас много Views это может немного уменьшить «беспорядок».

findViewById – это метод, который можно запустить из активности (или любой группы представлений) после того, как представление было завышено. Чтобы раздуть вид уровня активности, вы обычно вызываете setContentView.

Поскольку setContentView еще не вызывается, к действию не привязаны никакие представления.

Вот как это сделать

 public class MyClass extends Activity implements View.OnClickListener { CheckBox cb1; CheckBox cb2; public void onCreate(Bundle sis) { super.onCreate(sis); setContentView(R.layout.whatever); cb1 = (CheckBox) findViewById(R.id.cb1); cb2 = (CheckBox) findViewById(R.id.cb2); } public void checkboth(View view) { cb1.setchecked(true); cb2.setchecked(true); } @Override public void onClick(View v) { } } 

Вы не можете вызывать метод (findViewById) отсюда и ожидать ненулевого значения. Представления создаются только в андроиде после вызова setContentView (R.layout.my_layout). Что вам нужно сделать, так это:

 public class MyClass extends Activity implements View.OnClickListener { CheckBox cb1 = null; CheckBox cb2 = null; //leaving out most code like onCreate. Just pretend it's there. public void onCreate(Bundle savedInstanceState) { super.onCreate(); setContentView(R.layout.my_layout); cb1 = (CheckBox) findViewById(R.id.cb1); cb2 = (CheckBox) findViewById(R.id.cb2); } public void checkboth(View view) { cb1.setchecked(true); cb2.setchecked(true); } @Override public void onClick(View v) { } } 

Когда вы перемещаете объявления в начало classа, вы меняете локальные переменные на поля. Эти поля инициализируются при создании экземпляра, что означает, что они инициализируются «прямо перед», когда выполняется конструктор.

Теперь вы не можете вызвать методы экземпляра (например, findViewById ) до того, как неявный вызов super() завершится.

Переместите их в конструктор, и все должно получиться.

Interesting Posts
Давайте будем гением компьютера.