繁体   English   中英

在 android 工作室的活动中的 onCreate 方法之前将 object 添加到列表中

[英]Adding an object to a list before onCreate method in an Activity in 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.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();
        });
    }
}

但似乎只有当我在 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));
    }
} 

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

这里有2个问题:

  1. 您不能直接在 class 中执行方法,除非您将结果值分配给变量(例如String text = "hello".substring(3)可以工作,而单独使用"hello".substring(3)不行。
  2. onCreate 方法是 Android 生命周期的一部分(StackOverflow 上有很多解释)。 基本上它是在活动时调用的,因此 class xy 扩展 AppCompatActivity 的 object 被创建并加载来自资源的所有数据。 但是 class object 是在加载资源之前创建的,因此在onCreate()之前无法访问任何资源。 与在程序启动时调用的 static 部分( static {...} )中执行的代码不同,可以多次调用 onCreate 方法(例如,我单击后退按钮 [并且没有对 Z34D16B61FB2E5A8A18 的活动)返回]。活动停止但应用程序没有关闭。当我重新打开应用程序时,它仍然启动,就像程序一样。
  • 您可以在 onCreate 之前执行任何与 android 资源无关的操作(例如创建 ArrayList)。
  • 只是为了避免混淆:在调用findViewById() onCreate()中调用setContentView() ) ,因为 Android 需要知道它应该从哪个布局获取视图,这是另一个主题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM