簡體   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