Java 在android studio中的活动中,在onCreate方法之前向列表添加对象

Java 在android studio中的活动中,在onCreate方法之前向列表添加对象,java,android-studio,Java,Android Studio,我只是对一些东西感到好奇,所以我尝试用这种方式编写一些代码: package com.bignerdranch.android.geoquiz; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.view.Gravity; import android.view.View; import android.widget.Button; import android.

我只是对一些东西感到好奇,所以我尝试用这种方式编写一些代码:

package com.bignerdranch.android.geoquiz;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {

    private Button trueButton, falseButton, nextButton;
    private ArrayList<Question> questionList = new ArrayList<Question>();
    private int currentIndex = 0;
    private TextView questionTextView;
     questionList.add(new Question(R.string.question_australia,true));
        questionList.add(new Question(R.string.question_oceans, true));
        questionList.add(new Question(R.string.question_mideast, false));
        questionList.add(new Question(R.string.question_africa, false));
        questionList.add(new Question(R.string.question_americas, true));
        questionList.add(new Question(R.string.question_asia, true));

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        trueButton = findViewById(R.id.true_button);
        falseButton = findViewById(R.id.false_button);
        nextButton = findViewById(R.id.next_button);
        questionTextView = findViewById(R.id.question_text_view);
        Toast toast = Toast.makeText(this,R.string.correct_toast,Toast.LENGTH_SHORT);
        toast.setGravity(Gravity.TOP,0,0);

        trueButton.setOnClickListener((View v) ->{
            toast.show();
        });
        falseButton.setOnClickListener((View view) -> {
            toast.show();
        });
    }
}
package com.bignerdranch.android.geoquick;
导入androidx.appcompat.app.appcompat活动;
导入android.os.Bundle;
导入android.view.Gravity;
导入android.view.view;
导入android.widget.Button;
导入android.widget.TextView;
导入android.widget.Toast;
导入java.util.ArrayList;
公共类MainActivity扩展了AppCompatActivity{
私人按钮trueButton、falseButton、nextButton;
private ArrayList questionList=新建ArrayList();
私有int currentIndex=0;
私有文本视图问题文本视图;
添加(新问题(R.string.Question_australia,true));
添加(新问题(R.string.Question_,true));
添加(新问题(R.string.Question_mideast,false));
添加(新问题(R.string.Question_africa,false));
添加(新问题(R.string.Question_,true));
添加(新问题(R.string.Question_asia,true));
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
trueButton=findviewbyd(R.id.true\u按钮);
falseButton=findViewById(R.id.false_按钮);
nextButton=findviewbyd(R.id.next_按钮);
questionTextView=findViewById(R.id.question\u text\u视图);
Toast Toast=Toast.makeText(this,R.string.correct\u Toast,Toast.LENGTH\u SHORT);
toast.setGravity(Gravity.TOP,0,0);
trueButton.setOnClickListener((视图v)->{
toast.show();
});
falseButton.setOnClickListener((视图)->{
toast.show();
});
}
}
但是,只有在onCreate方法之前添加这些问题对象时,才会出现错误

代码工作时的一个示例:

package com.bignerdranch.android.geoquiz;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {

    private Button trueButton, falseButton, nextButton;
    private ArrayList<Question> questionList = new ArrayList<Question>();
    private int currentIndex = 0;
    private TextView questionTextView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        trueButton = findViewById(R.id.true_button);
        falseButton = findViewById(R.id.false_button);
        nextButton = findViewById(R.id.next_button);
        questionTextView = findViewById(R.id.question_text_view);
        Toast toast = Toast.makeText(this,R.string.correct_toast,Toast.LENGTH_SHORT);
        toast.setGravity(Gravity.TOP,0,0);

        trueButton.setOnClickListener((View v) ->{
            toast.show();
        });
        falseButton.setOnClickListener((View view) -> {
            toast.show();
        });
        questionList.add(new Question(R.string.question_australia,true));
        questionList.add(new Question(R.string.question_oceans, true));
        questionList.add(new Question(R.string.question_mideast, false));
        questionList.add(new Question(R.string.question_africa, false));
        questionList.add(new Question(R.string.question_americas, true));
        questionList.add(new Question(R.string.question_asia, true));
    }
} 
package com.bignerdranch.android.geoquick;
导入androidx.appcompat.app.appcompat活动;
导入android.os.Bundle;
导入android.view.Gravity;
导入android.view.view;
导入android.widget.Button;
导入android.widget.TextView;
导入android.widget.Toast;
导入java.util.ArrayList;
公共类MainActivity扩展了AppCompatActivity{
私人按钮trueButton、falseButton、nextButton;
private ArrayList questionList=新建ArrayList();
私有int currentIndex=0;
私有文本视图问题文本视图;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
trueButton=findviewbyd(R.id.true\u按钮);
falseButton=findViewById(R.id.false_按钮);
nextButton=findviewbyd(R.id.next_按钮);
questionTextView=findViewById(R.id.question\u text\u视图);
Toast Toast=Toast.makeText(this,R.string.correct\u Toast,Toast.LENGTH\u SHORT);
toast.setGravity(Gravity.TOP,0,0);
trueButton.setOnClickListener((视图v)->{
toast.show();
});
falseButton.setOnClickListener((视图)->{
toast.show();
});
添加(新问题(R.string.Question_australia,true));
添加(新问题(R.string.Question_,true));
添加(新问题(R.string.Question_mideast,false));
添加(新问题(R.string.Question_africa,false));
添加(新问题(R.string.Question_,true));
添加(新问题(R.string.Question_asia,true));
}
} 

为什么在onCreate方法之前将对象添加到列表时会显示错误?我真的希望我能得到一个专业的答案,这样我就能更好地理解onCreate方法。

这里有两个问题:

  • 不能直接在类中执行方法,除非将结果值赋给变量(例如,
    String text=“hello”)。子字符串(3)
    可以工作,
    “hello”。子字符串(3)
    不能单独工作
  • onCreate方法是Android生命周期的一部分(StackOverflow上对此有很多解释)。基本上,当创建活动(即xy扩展AppCompatActivity类的对象)并加载资源中的所有数据时,会调用它。但类对象是在加载资源之前创建的,因此您无法访问
    onCreate()
    之前的任何资源。这与在静态部分中执行的代码不同(
    static{…}
    ),在程序启动时调用,可以多次调用onCreate方法(例如,我单击“上一步”按钮[没有要返回的活动]。活动已停止,但应用程序未关闭。当我重新打开应用程序时,它仍会启动,就像程序一样
    • 在onCreate之前,您可以执行任何与android资源无关的操作(例如创建ArrayList)
    • 为了避免混淆:在调用
      findViewById()
      之前,您总是需要在
      onCreate()
      中调用
      setContentView()
      ,因为Android需要知道它应该从哪个布局获得视图,这是另一个主题