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

如何在ListPreference中展示MainActivity标记的已连接IP列表?

实现ListPreference展示已成功连接IP列表的完整方案

我来帮你梳理下具体的实现步骤,这是我在项目中用过的可行方案:

1. 在MainActivity中保存成功连接的IP

SharedPreferences本身不支持直接存数组,但用StringSet来存储IP列表是最方便的,既能轻松追加,还能自动去重。当你确认IP连接成功后,执行这段代码:

// 获取自定义的SharedPreferences实例,名称随便取,比如"ConnectedIPs"
SharedPreferences sp = getSharedPreferences("ConnectedIPs", MODE_PRIVATE);
SharedPreferences.Editor editor = sp.edit();

// 先取出已保存的IP集合,没有的话就新建一个空集合
Set<String> savedIps = new HashSet<>(sp.getStringSet("success_ips", new HashSet<>()));

// 替换成你实际获取到的成功连接IP
String successIp = "192.168.1.101";

// 避免重复添加同一个IP
if (!savedIps.contains(successIp)) {
    savedIps.add(successIp);
    editor.putStringSet("success_ips", savedIps);
    editor.apply(); // 异步提交,比commit()更高效,不需要返回结果的话用这个就行
}

2. 配置ListPreference并加载IP列表

首先在res/xml/preferences.xml(没有的话新建这个文件)里定义你的ListPreference:

<ListPreference
    android:key="connected_ip_list"
    android:title="已成功连接的IP"
    android:summary="选择曾连接成功的IP"
    android:defaultValue="" />

接下来在你的偏好设置页面(现在推荐用PreferenceFragmentCompat,比传统Activity更灵活)中加载并设置IP列表:

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

        // 拿到之前存IP的SharedPreferences
        SharedPreferences sp = requireContext().getSharedPreferences("ConnectedIPs", MODE_PRIVATE);
        Set<String> ipSet = sp.getStringSet("success_ips", new HashSet<>());

        // 把Set转成数组,因为ListPreference需要数组类型的entries和entryValues
        String[] ipArray = ipSet.toArray(new String[0]);

        // 找到我们定义的ListPreference
        ListPreference ipListPref = findPreference("connected_ip_list");
        if (ipListPref != null) {
            // 处理没有IP的情况,给用户友好提示
            if (ipArray.length == 0) {
                ipListPref.setEntries(new String[]{"暂无已连接IP"});
                ipListPref.setEntryValues(new String[]{""});
                ipListPref.setEnabled(false); // 没数据时禁用选择
            } else {
                // 把IP同时作为显示条目和对应的值(如果需要区分显示和值可以单独设置)
                ipListPref.setEntries(ipArray);
                ipListPref.setEntryValues(ipArray);
                ipListPref.setEnabled(true);
            }
        }
    }
}

如果你的偏好设置是用Activity承载的,只需要把这个Fragment添加进去就行:

public class PreferencesActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 把Fragment添加到Activity中
        getSupportFragmentManager().beginTransaction()
                .replace(android.R.id.content, new SettingsFragment())
                .commit();
    }
}

3. 一些细节提醒

  • 去重:用HashSet自动帮你避免重复IP,不用自己写复杂的判断逻辑。
  • 实时刷新:每次打开偏好设置页面,onCreatePreferences都会重新读取SharedPreferences里的IP,所以MainActivity中新增的IP会立刻显示。
  • 空状态处理:没有IP时的提示和禁用操作,能提升用户体验,不会让用户看到空白的无意义列表。

这样就能完美实现你想要的效果啦:在MainActivity标记成功的IP会被存到SharedPreferences,打开偏好设置时ListPreference就会展示这些IP列表。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 04:35:39