TypeArray в Android – Как сохранить пользовательские объекты в xml и получить их?

У меня есть класс вроде

public class CountryVO { private String countryCode; private String countryName; private Drawable countryFlag; public String getCountryCode() { return countryCode; } public void setCountryCode(String countryCode) { this.countryCode = countryCode; } public String getCountryName() { return countryName; } public void setCountryName(String countryName) { this.countryName = countryName; } public Drawable getCountryFlag() { return countryFlag; } public void setCountryFlag(Drawable countryFlag) { this.countryFlag = countryFlag; } } 

И хотите сохранить объекты этого класса в XML-массиве TypeArray, например

 <resources> <array name="custom_arr"> <item> <countryName>Albania</countryName> <countryCode>al</countryCode> <countryFlag>@drawable/al</countryFlag> </item> <item> <countryName>Algeria</countryName> <countryCode>dz</countryCode> <countryFlag>@drawable/dz</countryFlag> </item> <item> <countryName>American Samoa</countryName> <countryCode>as</countryCode> <countryFlag>@drawable/as</countryFlag> </item> <item> <countryName>India</countryName> <countryCode>in</countryCode> <countryFlag>@drawable/in</countryFlag> </item> <item> <countryName>South Africa</countryName> <countryCode>sa</countryCode> <countryFlag>@drawable/sa</countryFlag> </item> </array> </resources> 

Как я хочу получить доступ к этому массиву в моем классе Activty, например

 TypedArray customArr = getResources().obtainTypedArray(R.array.country_arr); CountryV) vo = new CountryVO(); vo.setCountryName(**value from array come here for first element's countryName attribute**); vo.setCountryCode(**value from array come here for first element's countryCode attribute**); vo.setCountryFlag(**value from array come here for first element's countryFlag attribute**); 

Но я не знаю, как это сделать. Я попробовал customArr.getString (0); Но он дает мне все как строку, как Албания al @ drawable / al

Пожалуйста, помогите мне решить эту проблему.

Заранее большое спасибо,

С наилучшими пожеланиями, Ишань

Solutions Collecting From Web of "TypeArray в Android – Как сохранить пользовательские объекты в xml и получить их?"

Вот пример . Прочтите его и посмотрите на методы TypedArray, например get...() например getDrawable(int index) . Я предлагаю хранить элементы одного типа в разделенных массивах.

 <array name="country"> <item>Albania</item> <item>Algeria</item> <item>American Samoa</item> </array> <array name="code"> <item>al</item> <item>dz</item> <item>as</item> </array> <array name="flag"> <item>@drawable/dz</item> <item>@drawable/al</item> <item>@drawable/as</item> </array> 

РЕДАКТИРОВАТЬ:

 public CountryVO getCountryVO(int index){ Resources resources = getResources(); TypedArray country = resources.obtainTypedArray(R.array.country); TypedArray code = resources.obtainTypedArray(R.array.code); TypedArray flag = resources.obtainTypedArray(R.array.flag); CountryVO vo = new CountryVO(country.getString(index), code.getString(index), flag.getDrawable(index)); country.recycle(); code.recycle(); flag.recycle(); return vo; } 

Когда мне нужны пользовательские объекты, которые можно редактировать вне кода, я обычно использую json, который легче читать как для людей, так и (возможно) машин;)

У вас также могут быть более сложные объекты, чем простые массивы.

После создания json-файла (например, countries.json) в папке /res/raw например:

 { "countries" : [ {"country" : "Albania", "countryCode" : "al" }, {"country" : "Algeria", "countryCode" : "dz"}, {"country" : "American Samoa", "countryCode" : "as"}, {"country" : "India", "countryCode" : "in"}, {"country" : "South Africa", "countryCode" : "sa"} ]} 

Вы можете загрузить данные следующим образом:

 InputStream jsonStream = context.getResources().openRawResource(R.raw.countries); JSONObject jsonObject = new JSONObject(Strings.convertStreamToString(jsonStream)); JSONArray jsonContries = jsonObject.getJSONArray("countries"); List<CountryVO> countries = new ArrayList<CountryVO>(); for (int i = 0, m = countries.length(); i < m; i++) { JSONObject jsonCountry = countries.getJSONObject(i); CountryVO country = new CountryVO(); country.setCountryName(jsonCountry.getString("country")); String co = jsonCountry.getString("countryCode"); country.setCountryCode(co); try { Class<?> drawableClass = com.example.R.drawable.class; // replace package Field drawableField = drawableClass.getField(co); int drawableId = (Integer)drawableField.get(null); Drawable drawable = getResources().getDrawable(drawableId); country.setCountryFlag(drawable); } catch (Exception e) { // report exception } countries.add(country); } 

Если вы не хотите выполнять парсинг вручную, вы также можете использовать gson, который поможет вам передать объекты, а затем загружать чертежи ленивым способом …;)

Изменить: добавлен класс утилиты

 public String convertStreamToString(InputStream is) { Scanner s = new Scanner(is).useDelimiter("\\A"); return s.hasNext() ? s.next() : ""; } 

Надеюсь, поможет

Вам нужно разобрать xml, прежде чем пытаться сохранить его в своем классе. Я бы рекомендовал вам использовать API SAX, здесь вы можете найти учебник . Надеюсь это поможет!