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>
как я хочу получить доступ к этому массиву в моем классе Activity, например
TypedArray customArr = getResources().obtainTypedArray(R.array.country_arr);
CountryV) vo = new CountryVO();
vo.setCountryName(**value from array come here for first element countryName attribute**);
vo.setCountryCode(**value from array come here for first element countryCode attribute**);
vo.setCountryFlag(**value from array come here for first element countryFlag attribute**);
Но я не знаю, как этого добиться.
Я попробовал customArr.getString(0); но он дает мне все как строку, как
Албания al @drawable/al
Пожалуйста, помогите мне решить эту проблему.
Большое спасибо заранее,
С наилучшими пожеланиями,
Ishan
Ответы
Ответ 1
Вот пример. Прочтите его и посмотрите на методы 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>
EDIT:
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;
}
Ответ 2
Когда мне нужны пользовательские объекты, которые можно редактировать вне кода, я обычно использую 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() : "";
}
Надеюсь, что это поможет
Ответ 3
Вам нужно разобрать xml, прежде чем пытаться сохранить его в своем классе. Я бы рекомендовал вам использовать API SAX, вы можете найти учебник по нему здесь. Надеюсь, что это поможет!