You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Activity间列表传递及SplashActivity未运行问题求助

Android新手开发问题:启动页无法运行+列表为空解决办法

问题1:SplashActivity无法运行

你的AndroidManifest.xml里,MainActivity被设置为了App启动入口(带有LAUNCHER的intent-filter),而SplashActivity仅配置为普通Activity,所以App启动时默认打开MainActivity,不会进入SplashActivity。

修复方案:

将SplashActivity设置为启动入口,同时调整其他Activity的intent-filter配置:

<application
    android:allowBackup="true"
    android:dataExtractionRules="@xml/data_extraction_rules"
    android:fullBackupContent="@xml/backup_rules"
    android:icon="@drawable/mainscreenlogo"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/Theme.QuizTheoryApplication"
    tools:targetApi="31">

    <!-- 设置SplashActivity为启动页 -->
    <activity
        android:name=".example.QuizTheoryApplication.SplashActivity"
        android:exported="true">
        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>
            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>
    </activity>

    <!-- MainActivity改为普通Activity -->
    <activity
        android:name=".example.QuizTheoryApplication.MainActivity"
        android:exported="true"/>

    <!-- DashboardActivity移除多余intent-filter(无特殊需求时) -->
    <activity
        android:name=".example.QuizTheoryApplication.DashboardActivity"
        android:label="Preferences"
        android:exported="true"/>
</application>

问题2:列表始终为空

核心原因:

  1. 你在DashboardActivity中直接赋值allQuestionsList=listS,但listS是SplashActivity的静态变量,若SplashActivity未被初始化(比如未启动过),该变量为null,调用Collections.shuffle()会触发空指针,更无法获取数据。
  2. 尝试用putStringArrayListExtra传递列表,但listS是ArrayList<ModelClass>,与ArrayList<String>类型不匹配,接收时自然拿不到数据。

修复方案:

方法1:让ModelClass实现Parcelable,通过Intent传递列表(推荐,避免静态变量内存泄漏)

首先修改ModelClass实现Parcelable接口:

public class ModelClass implements Parcelable {
    private String question;
    private String optionA;
    private String optionB;
    private String optionC;
    private String optionD;
    private String answer;

    // 构造方法
    public ModelClass(String question, String optionA, String optionB, String optionC, String optionD, String answer) {
        this.question = question;
        this.optionA = optionA;
        this.optionB = optionB;
        this.optionC = optionC;
        this.optionD = optionD;
        this.answer = answer;
    }

    // Parcelable 核心方法
    protected ModelClass(Parcel in) {
        question = in.readString();
        optionA = in.readString();
        optionB = in.readString();
        optionC = in.readString();
        optionD = in.readString();
        answer = in.readString();
    }

    public static final Creator<ModelClass> CREATOR = new Creator<ModelClass>() {
        @Override
        public ModelClass createFromParcel(Parcel in) {
            return new ModelClass(in);
        }

        @Override
        public ModelClass[] newArray(int size) {
            return new ModelClass[size];
        }
    };

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(question);
        dest.writeString(optionA);
        dest.writeString(optionB);
        dest.writeString(optionC);
        dest.writeString(optionD);
        dest.writeString(answer);
    }

    // 添加上getter方法供DashboardActivity调用
    public String getQuestion() { return question; }
    public String getOptionA() { return optionA; }
    public String getOptionB() { return optionB; }
    public String getOptionC() { return optionC; }
    public String getOptionD() { return optionD; }
    public String getAnswer() { return answer; }
}

修改SplashActivity传递列表:

public class SplashActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.splash_activity_main);

        ArrayList<ModelClass> listS = new ArrayList<>();
        listS.add(new ModelClass("here is the question", "a", "b", "c", "d", "answer"));
        listS.add(new ModelClass("Under-inflated tires increase fuel consumption. A single tire under-inflated by 56 kpa (8 psi) can increase fuel consumption by?", "25 per cent", "15 per cent", "Seven per cent", "Four per cent", "Four per cent"));
        listS.add(new ModelClass("You are not allowed to park a vehicle within _____________ of a pedestrian corridor", "9 metres", "3 metres", "30 metres", "15 metres", "15 metres"));
        listS.add(new ModelClass("What class licence permits the holder to operate a motorcycle?", "Class 4", "Class 1", "Class 6", "Class 5", "Class 6"));
        listS.add(new ModelClass("Seatbelts must be worn by all drivers and passengers:", "Only when driving in the city", "Only when carrying passengers", "All the time unless exempted by law", "Only when driving on the highway", "All the time unless exempted by law"));

        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                Intent intent = new Intent(SplashActivity.this, DashboardActivity.class);
                // 传递Parcelable类型列表
                intent.putParcelableArrayListExtra("question_list", listS);
                startActivity(intent);
                finish(); // 关闭SplashActivity,避免返回重复进入
            }
        }, 1500);
    }
}

修改DashboardActivity接收并使用列表:

public class DashboardActivity extends AppCompatActivity {
    private ArrayList<ModelClass> allQuestionsList;
    private ModelClass modelClass;
    private int index = 0; // 初始化index值

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

        Hooks();
        // 从Intent获取列表
        allQuestionsList = getIntent().getParcelableArrayListExtra("question_list");
        
        // 先判断列表是否有效,避免空指针
        if (allQuestionsList != null && !allQuestionsList.isEmpty()) {
            Collections.shuffle(allQuestionsList);
            modelClass = allQuestionsList.get(index);
            setAllData();
        } else {
            Toast.makeText(this, "暂无题目数据", Toast.LENGTH_SHORT).show();
        }
    }

    // 你的Hooks()方法(初始化控件)
    private void Hooks() {
        // 示例:textViewQuestion = findViewById(R.id.text_view_question);
    }

    // 你的setAllData()方法(绑定数据到UI)
    private void setAllData() {
        // 示例:textViewQuestion.setText(modelClass.getQuestion());
    }
}

方法2:保留静态变量(不推荐,易引发内存泄漏)

若暂时不想修改Parcelable,需确保SplashActivity是启动页,并在DashboardActivity中增加空判断:

// DashboardActivity的onCreate方法
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_dashboard);

    Hooks();
    // 先判断静态列表是否有效
    if (SplashActivity.listS != null && !SplashActivity.listS.isEmpty()) {
        allQuestionsList = SplashActivity.listS;
        Collections.shuffle(allQuestionsList);
        modelClass = allQuestionsList.get(index);
        setAllData();
    } else {
        Toast.makeText(this, "数据加载失败", Toast.LENGTH_SHORT).show();
    }
}

内容的提问来源于stack exchange,提问作者Igal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 23:04:51