Где объявить представления в java-коде Android studio? Следует ли объявлять вне или внутри функции onCreate

#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 .