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

首次运行App为何显示默认值US而非预期的-1?

问题:首次运行App时Toast显示默认值US而非预期的-1

按照Android官方教程使用Settings Activity模板开发,模板生成root_preferences.xml而非多份偏好屏幕XML文件,我基本遵循步骤实现。教程指出首次运行App时Toast应显示-1(因为尚未修改设置),但实际首次运行显示US——我知道XML里默认值设为US,但教程同样设置默认值为US却预期显示-1,这是为什么?


代码实现

SettingsActivity.java

package com.example.droidcafe;

import android.os.Bundle;

import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import androidx.preference.PreferenceFragmentCompat;

public class SettingsActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.settings_activity);
        if (savedInstanceState == null) {
            getSupportFragmentManager()
                    .beginTransaction()
                    .replace(R.id.settings, new SettingsFragment())
                    .commit();
        }
        ActionBar actionBar = getSupportActionBar();
        if (actionBar != null) {
            actionBar.setDisplayHomeAsUpEnabled(true);
        }
    }

    public static class SettingsFragment extends PreferenceFragmentCompat {
        @Override
        public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
            setPreferencesFromResource(R.xml.root_preferences, rootKey);
        }
    }
}

MainActivity.java

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

    Toolbar toolbar = findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    FloatingActionButton fab = findViewById(R.id.fab);
    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent intent =
                    new Intent(MainActivity.this, OrderActivity.class);
            intent.putExtra(EXTRA_MESSAGE, mOrderMessage);
            startActivity(intent);
        }

    });

    PreferenceManager.setDefaultValues(this,
            R.xml.root_preferences, false);

    SharedPreferences sharedPref = PreferenceManager
            .getDefaultSharedPreferences(this);
    String marketPref = sharedPref
            .getString("market", "-1");
    displayToast(marketPref);

}

root_preferences.xml

<PreferenceScreen xmlns:app="http://schemas.android.com/apk/res-auto">

    <PreferenceCategory app:title="@string/pref_header_account">

        <ListPreference
            app:defaultValue="US"
            app:entries="@array/pref_market_titles"
            app:entryValues="@array/pref_market_values"
            app:key="market"
            app:negativeButtonText="@null"
            app:positiveButtonText="@null"
            app:title="@string/pref_title_account" />

    </PreferenceCategory>

</PreferenceScreen>

strings.xml

<string name="pref_header_account">Account</string>
<!-- Sync Preferences -->
<string name="pref_title_account">Market</string>
<string-array name="pref_market_titles">
    <item>United States</item>
    <item>Canada</item>
    <item>United Kingdom</item>
    <item>India</item>
    <item>Japan</item>
    <item>Other</item>
</string-array>

<string-array name="pref_market_values">
    <item>US</item>
    <item>CA</item>
    <item>UK</item>
    <item>IN</item>
    <item>JA0</item>
    <item>-1</item>
</string-array>

运行结果

首次运行App时,Toast显示:
Toast显示US

教程预期显示:-1

教程中的默认值设置截图:
教程中的默认值设置

核心疑问:我知道XML里默认值设为US,但教程同样设置默认值为US却预期首次显示-1,这是为什么?


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 05:01:26