There are cases, where custom objects need to be created and defined in the resources of the application. Such objects can be composed of Java
simple types, for example Integer
, Float
, String
.
Here is the example of how to import an object defined in application resources.
The object Category
constains 3 properties of category:
This POJO
has it's equivalent in categories.xml
file, where each of array has the same properties defined for each category.
public class Category {
private Type id;
private @ColorRes int color;
private @StringRes String name;
public Category getId() {
return id;
}
public void setId(Category id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getColor() {
return color;
}
public void setColor(int color) {
this.color = color;
}
public enum Type{
REGISTRATION,
TO_ACCEPT,
TO_COMPLETE,
TO_VERIFY,
CLOSED
}
}
res/values
folder:categories.xml
<array name="no_action">
<item>0</item>
<item>@android:color/transparent</item>
<item>@string/statusRegistration</item>
</array>
<array name="to_accept">
<item>1</item>
<item>@color/light_gray</item>
<item>@string/acceptance</item>
</array>
<array name="opened">
<item>2</item>
<item>@color/material_green_500</item>
<item>@string/open</item>
</array>
<array name="to_verify">
<item>3</item>
<item>@color/material_gray_800</item>
<item>@string/verification</item>
</array>
<array name="to_close">
<item>4</item>
<item>@android:color/black</item>
<item>@string/closed</item>
</array>
Define an array in resources file:
<array name="categories">
<item>@array/no_action</item>
<item>@array/to_accept</item>
<item>@array/opened</item>
<item>@array/to_verify</item>
<item>@array/to_close</item>
</array>
Create a function to import them:
@NonNull
public List<Category> getCategories(@NonNull Context context) {
final int DEFAULT_VALUE = 0;
final int ID_INDEX = 0;
final int COLOR_INDEX = 1;
final int LABEL_INDEX = 2;
if (context == null) {
return Collections.emptyList();
}
// Get the array of objects from the `tasks_categories` array
TypedArray statuses = context.getResources().obtainTypedArray(R.array.categories);
if (statuses == null) {
return Collections.emptyList();
}
List<Category> categoryList = new ArrayList<>();
for (int i = 0; i < statuses.length(); i++) {
int statusId = statuses.getResourceId(i, DEFAULT_VALUE);
// Get the properties of one object
TypedArray rawStatus = context.getResources().obtainTypedArray(statusId);
Category category = new Category();
int id = rawStatus.getInteger(ID_INDEX, DEFAULT_VALUE);
Category.Type categoryId;
//The ID's should maintain the order with `Category.Type`
switch (id) {
case 0:
categoryId = Category.Type.REGISTRATION;
break;
case 1:
categoryId = Category.Type.TO_ACCEPT;
break;
case 2:
categoryId = Category.Type.TO_COMPLETE;
break;
case 3:
categoryId = Category.Type.TO_VERIFY;
break;
case 4:
categoryId = Category.Type.CLOSED;
break;
default:
categoryId = Category.Type.REGISTRATION;
break;
}
category.setId(categoryId);
category.setColor(rawStatus.getResourceId(COLOR_INDEX, DEFAULT_VALUE));
int labelId = rawStatus.getResourceId(LABEL_INDEX, DEFAULT_VALUE);
category.setName(getString(context.getResources(), labelId));
categoryList.add(taskCategory);
}
return taskCategoryList;
}