I would like to set my variables at the top of my class instead of in the method
Я хотел бы установить свои переменные в верхней части моего класса, а не в методе
Кажется, я не могу решить эту запутанную проблему, у меня есть много-много вещей, которые я хотел бы добавить в верхнюю часть моего класса, чтобы помочь сократить беспорядок.
Поскольку несколько методов используют эти переменные checkbox.
Я хотел бы, чтобы все было вверху, прямо под открывающей скобкой.
потому что это означало бы, что эти строки выполняются перед onCreate() что приводит к тому, что эти переменные становятся null и выдают a NPE при попытке вызвать методы для этих переменных. Это потому, что вы вызываете setContentView(R.layout.your_layout) inside of onCreate() и вы Views "живете" внутри этого layout. Это означает, что они не могут быть инициализированы, пока ваш layout не был inflated вызван setContentView(). Вы должны вызвать setContentView(), прежде чем пытаться инициализировать свой Views. Обойти эту часть невозможно.
Что некоторые люди делают, что может помочь, так это создают отдельную функцию, которая инициализирует эти переменные сразу после вызова setContentView(). Что-то вроде этого
publicclassMyActivity // declare your Views so they are global to the class TextView tv; // more views @Override publicvoidonCreat(stuff) { // super call setContentView(R.layout.my_layout); init();
затем в вашей init() функции инициализируйте все Views объявленные вами
privatevoidinit() { tv = (TextView) findViewById(R.id.myTextView); // more initializations }
но вы можете просто инициализировать их в onCreate(), onResume() или где угодно, главное, чтобы это было послеsetContentView() Объявляя и инициализируя их таким образом, вы убедитесь, что все они доступны для других функций, прослушивателей, внутренних классов и т.д. Activity. И если у вас их много, Views это может немного уменьшить "беспорядок".
Ответ 2
findViewById - это метод, который может быть запущен из activity (или любой группы представлений) после расширения представления. Чтобы увеличить представление до уровня activity, вы обычно вызываете setContentView .
Поскольку setContentView еще не был вызван, никакие представления не привязаны к действию.
Вы не можете вызвать метод (findViewById) отсюда и ожидать ненулевого значения. Представления создаются в Android только после вызова setContentView(R.layout.my_layout). Что вам нужно сделать, это что-то вроде этого:
//leaving out most code like onCreate. Just pretend it's there. publicvoidonCreate(Bundle savedInstanceState) { super.onCreate(); setContentView(R.layout.my_layout); cb1 = (CheckBox) findViewById(R.id.cb1); cb2 = (CheckBox) findViewById(R.id.cb2); }
publicvoidcheckboth(View view) {
cb1.setchecked(true); cb2.setchecked(true);
}
@Override publicvoidonClick(View v) { } }
Ответ 4
Когда вы перемещаете объявления в верхнюю часть класса, вы меняете локальные переменные на поля. Эти поля инициализируются при создании экземпляра, что означает, что они инициализируются "непосредственно перед" выполнением конструктора.
Теперь вы не можете вызывать методы экземпляра (например, findViewById) до завершения неявного вызова super().
Переместите их в конструктор, и все должно получиться.