#java #android #view #declaration #findviewbyid
Вопрос:
У меня есть путаница в отношении деклараций. В первом коде я объявил представления внутри функции onCreate, тогда как во втором коде я объявил вне функции onCreate. Первый код работает хорошо, в то время как второй не работает. Я не знаю, какой из них правильный. В некоторых других моих проектах я объявлял вне функции onCreate, но никаких проблем нет. Но почему возникает проблема?
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
int count=0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//This declaration
TextView imgNum=findViewById(R.id.textView);
ImageView frame = findViewById(R.id.imageView);
ImageView left= findViewById(R.id.imageView2);
ImageView right=findViewById(R.id.imageView3);
left.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
count--;
if (count<0){
count =9;
}
}
Но это не работает. Единственное изменение, которое я сделал, — я поместил все объявления вне функции onCreate.
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
int count=0;
//this declaration
TextView imgNum=findViewById(R.id.textView);
ImageView frame = findViewById(R.id.imageView);
ImageView left= findViewById(R.id.imageView2);
ImageView right=findViewById(R.id.imageView3);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
left.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
count--;
if (count<0){
count =9;
}
Пожалуйста, помогите мне
Комментарии:
1. Я предполагаю, что представления еще не загружены и, следовательно, они не инициализированы. Хотя я не уверен на 100%. Вы пробовали что-то вроде
System.out.println(imgNum " | " frame " | " left " | " right);
того, чтобы посмотреть, какие у них значения (если они равны нулю или нет)?
Ответ №1:
Первый метод является правильным. Ваш второй метод объявляет Views
перед Activity
is created
( onCreate
), что, скорее всего, приведет к app crash
тому Activity
, что этого еще не было created
. Если Activity
этого нет created
, то view elements
внутри этого не может быть declared
или доступ к нему возможен до тех пор, пока activity
он не будет created
.