首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android 動態修改 strings.xml 陷阱:資源文件唯讀,應改用數組/數據庫持久化

     編輯:程式設計綜合問答

需求:用戶通過 EditText 輸入新項目,動態添加到 strings.xml 的 string-array 中,供多個 Spinner 共享。

核心誤區:strings.xml 是編譯時只讀資源

  • res/values/strings.xml 打包進 APK,**運行時不可修改**。
  • 任何嘗試寫入 Resources 的操作都會失敗或崩潰。

正確方案:運行時數據源分離

方案一:內存數組 + SharedPreferences 持久化(輕量)

// 初始化:從 SP 恢復或默認
Set saved = prefs.getStringSet("planets", new HashSet<>(Arrays.asList("AAA","BBB")));
List planets = new ArrayList<>(saved);

// Spinner 適配器
ArrayAdapter adapter = new ArrayAdapter<>(this, 
    android.R.layout.simple_spinner_item, planets);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(adapter);

// 用戶添加
String input = editText.getText().toString().trim();
if (!input.isEmpty() && !planets.contains(input)) {
    planets.add(input);
    adapter.notifyDataSetChanged();
    prefs.edit().putStringSet("planets", new HashSet<>(planets)).apply();
}

方案二:Room 數據庫(結構化、多表、查詢靈活)

@Entity
public class Planet { @PrimaryKey String name; }

@Dao
public interface PlanetDao {
    @Query("SELECT * FROM planet") List getAll();
    @Insert(onConflict = OnConflictStrategy.IGNORE) void insert(Planet p);
}

// ViewModel + LiveData 驅動 UI 自動更新

方案三:File 存儲 JSON(簡單持久化)

File file = new File(getFilesDir(), "planets.json");
// 讀寫 List 為 JSON 數組

多 Spinner 共享數據源

將 List planets 封裝為 **單例 Repository** 或 **ViewModel**,所有 Spinner 共用同一 ArrayAdapter 實例或觀察同一 LiveData>。

總結

  • **拋棄動態修改 strings.xml 幻想**,轉用運行時可變數據結構。
  • 優先選擇 SharedPreferences + 內存列表(簡單鍵值)或 Room(複雜數據)。
  • 适配器持有列表引用,notifyDataSetChanged() 即時刷新所有綁定 Spinner。

資源文件靜態化,數據動態化,是 Android 開發鐵律。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved