I'm having problems to get an array of colors.
I get a NullPointerException while I fetch the data from the file strings.xml.
The Logcat reports a NPE in this line:
colorList.add(Color.parseColor(colore));
strings.xml
<array name="colors">
<item>#FFFFFF</item>
<item >#FFFFF0</item>
<item >#FFFFE0</item>
<item >#FFFF00</item>
</array>
Adapter
public class ColorPickerAdapter extends BaseAdapter {
private Context context;
private List<Integer> colorList = new ArrayList<Integer>();
public ColorPickerAdapter(Context context) {
this.context = context;
String colors[] = context.getResources().getStringArray(R.array.colors);
colorList = new ArrayList<Integer>();
// add the color array to the list
for(String colore : colors){
colorList.add(Color.parseColor(colore));
}
}
<string-array name="colors">
<item>#FFFFFF</item>
<item>#FFFFF0</item>
<item>#FFFFE0</item>
<item>#FFFF00</item>
</string-array>
use string-array instead of array.
Related
let's say i have this Multidimensional Array :
myArray = new String[][]{{"Hello","World"},{"I Love","Android"},{"something","Random"}};
and in my app , i'm dealing with it like this :
for (int i=0; i<myArray.length; i++) {
for (int x=0; x<myArray[i].length; x++) {
// set textview or something
}
}
I want to do this Multidimensional Array by XML resource file.
i tried this way but did not work for me :
<string-array name="myArray">
<item><item>Hello</item><item>World</item></item>
<item><item>I Love</item><item>Android</item></item>
<item><item>something</item><item>Random</item></item>
</string-array>
I know I can do normal string-array in the XML file and make it look like Multidimensional Array by Java but I just want to know if it's possible to do it in XML directly
You can maintain your xml for array like this:
<resources>
<array name="categories_0">
<item>1</item>
<item>Pizza</item>
</array>
<array name="categories_1">
<item>2</item>
<item>Burger</item>
</array>
<array name="categories_2">
<item>3</item>
<item>Maggie</item>
</array>
Now each category is an array with a key/value pair for it’s properties. What ties it with other categories is the integer suffix. Now we can use this dandy static method to grab them:
Than, we can define global reference for index of the array:
public class ResourceHelper {
public static List<TypedArray> getMultiTypedArray(Context context, String key) {
List<TypedArray> array = new ArrayList<>();
try {
Class<R.array> res = R.array.class;
Field field;
int counter = 0;
do {
field = res.getField(key + "_" + counter);
array.add(context.getResources().obtainTypedArray(field.getInt(null)));
counter++;
} while (field != null);
} catch (Exception e) {
e.printStackTrace();
} finally {
return array;
}
}
}
This is dynamically retrieving the resources programmatically, with an incremented counter to find the next object until there isn’t one left. Now this can be consumed throughout your code base like this:
for (TypedArray item : ResourceHelper.getMultiTypedArray(this, "categories")) {
Category category = new Category();
category.ID = item.getInt(0, 0);
category.title = item.getString(1);
mCategories.add(category);
}
Here you may face error in encapsulating class or method. You can just add #SuppressWarnings("ResourceType") to that method or class.
This example will work for you.
It's impossible. You can put Json String inside
<item>{"dummy":"dummy"} </item> and then parse it.
I have the following items stored in an array-string in String.xml file
<string-array name="cr">
<item name="x"> 20</item>
<item name="y"> 40</item>
<item name="z"> 60</item>
<item name="k"> 80</item>
<item name="i"> 100</item>
<item name="l"> 120</item>
</string-array>
how can i get the value (eg 80) using the item name in mainactivity.java file?
int index =Arrays.asList(getResources().getStringArray(R.array.cr)).indexOf(..); I tried this but it doesn't work
You can use two array(one for key, one for value) and then put them into Hashmap object.
Example:
String[] mobileArray = getResources().getStringArray(R.array.mobile);
String[] priceArray = getResources().getStringArray(R.array.price);
Map<String, String> map = new HashMap<>();
for (int i = 0; i < mobileArray.length; i++) {
map.put(mobileArray[i], priceArray[i]);
}
strings.xml
<string-array name="mobile">
<item>Samsung</item>
<item>Lenevo</item>
<item>Karbon</item>
<item>Moto</item>
<item>Xperia</item>
<item>Micromax</item>
<item>Lava</item>
<item>Xiomi</item>
</string-array>
<string-array name="price">
<item>10000</item>
<item>12000</item>
<item>10000</item>
<item>12000</item>
<item>10000</item>
<item>12000</item>
<item>10000</item>
<item>12000</item>
</string-array>
I think you need something like this
String[] yourArray = getResources().getStringArray(R.array. cr);
String yourString = yourArray[3];
hope this is what you need
I just can't figure out how to accomplish the following;
I'd like to display the "human readable form" (refresh_interval_entries), for example in a Log.d(), corresponding to what has been selected in refresh_interval_values.
I have two arrays defined in values\arrays.xml:
<string-array name="refresh_interval_entries" translatable="false">
<item>1 minute</item>
<item>2 minutes</item>
<item>3 minutes</item>
</string-array>
<string-array name="refresh_interval_values" translatable="false">
<item>60</item>
<item>120</item>
<item>180</item>
</string-array>
I save the selected value from refresh_interval_values in a ListPreference.
First I was thinking of doing something like;
String[] mEntries = getResources().getStringArray(R.array.refresh_interval_entries);
But I don't think that will work since I can't get the correct index for mEntries[index], since i can't use the values in refresh_interval_values.
I am not trying to display this in an Activity that extends PreferenceActivity, just in a normal Activity.
Any ideas how to do this?
How about on start of your application, you make a HashMap out of the two arrays:
HashMap<String, String> dictionary = new HashMap<String, String>();
String[] mEntries = getResources().getStringArray(R.array.refresh_interval_entries);
String[] mValues = getResources().getStringArray(R.array.refresh_interval_values);
for (int i = 0; i < mEntries.length; i++) {
dictionary.put(mValues[i], mEntries[i]);
}
and use it like:
String entry = dictionary.get("60");
Do something like this:
{
...
String[] mEntries = getResources().getStringArray(R.array.refresh_interval_entries);
String[] mValues = getResources().getStringArray(R.array.refresh_interval_values);
Log.d(TAG, "120=" + getEntryFromValue("120", mEntries, mValues));
}
private String getEntryFromValue(String value, String[] mEntries, String[] mValues) {
for (int i=0; i < mValues.length; i++) {
if (value.equals(mValues[i])) {
// check mEntries length
return mEntries[i];
}
}
return "NOT FOUND";
}
i have a string-array in my res/values/strings.xml
<string-array name="my_list">
<item>Item1</item>
<item>Item2</item>
</string-array>
i am accessing it in my application as and comparing it with my value in loop.
String[] myStrings = getResources().getStringArray(R.array.my_list);
for(int i=0;i<myStrings.length;i++)
{
System.out.println(myStrings[i]);
}
Now i need the search the items according to key to get the respective item.Example
<string-array name="my_list">
<item name="one">Item1</item>
<item name="two">Item2</item>
</string-array>
if my search hay key "one" then get its corresponding value(Item1).
How to accomplish this task.
Thanks
Well, I've done it using two arrays. Easy to manage as well.
One for Keys:
<string-array name="codes">
<item>AC</item>
<item>AD</item>
<item>AE</item>
</string-array>
One for Values:
<string-array name="names">
<item>Ascension</item>
<item>Andorra</item>
<item>United Arab Emirates</item>
</string-array>
And the search method.
private String getCountryByCode(String code) {
int i = -1;
for (String cc: getResources().getStringArray(R.array.codes)) {
i++;
if (cc.equals(code))
break;
}
return getResources().getStringArray(R.array.names)[i];
}
Note: The code above will not work if items inside the two lists was unordered. So make sure you arranged the items.
What you have there is a Map like data structure. Sadly there is currently no way to create a Map of Strings through XML like that.
You could either do it all in Java or write your map in a Raw XML file and read/parse that in to a map at runtime.
Unfortunately there is no built-in way to achive that, but you can do something like that:
<string-array name="my_array">
<item>key1|value1</item>
<item>key2|value2</item>
</string-array>
And have a util function something like:
Map<String, String> getKeyValueFromStringArray(Context ctx) {
String[] array = ctx.getResources().getStringArray(R.array.my_array);
Map<String, String> result = new HashMap<>();
for (String str : array) {
String[] splittedItem = str.split("|");
result.put(splittedItem[0], splittedItem[1])
}
return result
}
It's look a little bit hacky, but in general, because you have control over your dictionary - probably it not so awful idea.
XML:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="area_key">
<item>北</item>
<item>中</item>
<item>南</item>
</string-array>
<integer-array name="area_value">
<item>0</item>
<item>1</item>
<item>2</item>
</integer-array>
</resources>
Java file:
String[] areaKey = getResources().getStringArray(R.array.area_key);
int[] areaValue = getResources().getIntArray(R.array.area_value);
HashMap<String, Integer> areas = new HashMap<String, Integer>();
for (int i = 0; i < areaKey.length; i++) {
areas.put(areaKey[i], areaValue[i]);
}
I had the same problem.
The decision for me was to create many strings in xml-file (not string arrays) and to create String[] array in code. It looks like this:
Builder builder = new AlertDialog.Builder(DMCBrowser.this);
builder.setTitle(R.string.title_playlist);
final CharSequence[] items = new CharSequence[] { getResources().getString(R.string.watch_all),
getResources().getString(R.string.select_items) };
builder.setItems(items, new DialogInterface.OnClickListener() {
#Override
public void onClick(DialogInterface dialog, int which) {
if (items[which].equals(getResources().getString(R.string.watch_all))) {
Log.d(TAG, "Watch all");
} else if (items[which].equals(getResources().getString(R.string.select_items))) {
Log.d(TAG, "Select items");
}
}
}).show();
Although it does not look much compact, we can differ one item from another not only by non-understandable identifier like 1 or 2, but by human-readable android R-id. If i would like to change item order, it will be very easy.
A great way to do this is to make an array of arrays with XML as shown below. Then the native functions make it pretty easy to get the array with the named index you want and get the string inside it.
<string-array name="one">
<item>"Item 1"</item>
</string-array>
<string-array name="two">
<item>"Item 2"</item>
</string-array>
<array name="my_list">
<item>#array/one</item>
<item>#array/two</item>
</array>
you can use in java code:
public static HashMap<Integer, String> getAll()
{
HashMap<Integer, String> items = new HashMap<Integer, String>();
items.put(0, "item 1");
items.put(1, "item 2");
items.put(2, "item 3");
return items;
}
public static Integer getKey(Map hm, String value) {
for (Object o : hm.keySet()) {
if (hm.get(o).equals(value)) {
return (Integer)o;
}
}
return 0;
}
and bind to spinner:
Spinner spn_items = (Spinner) view.findViewById(R.id.spn_items);
ArrayAdapter<Object> adapter = new ArrayAdapter<Object>(getActivity(),android.R.layout.simple_spinner_dropdown_item, getAll().values().toArray()); adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spn_items.setAdapter(adapter);
You can make resource of your string array like below to show as hashmap kind :
<string-array name="list_websites">
<item>
<string name="title">Amazon</string>
<string name="isChecked">0</string>
</item>
<item>
<string name="title">eBay</string>
<string name="isChecked">0</string>
</item>
<item>
<string name="title">Sam\'s Club</string>
<string name="isChecked">0</string>
</item>
<item>
<string name="title">Wallmart</string>
<string name="isChecked">0</string>
</item>
<item>
<string name="title">Best Buy</string>
<string name="isChecked">0</string>
</item>
<item>
<string name="title">Rekuten</string>
<string name="isChecked">0</string>
</item>
</string-array>
Now above code can be parsed as ArrayList of HashMap kind.
I have a class like
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;
}
}
and want to store objects of this class in an TypeArray xml of android like
<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>
how i want to access this array in my Activty class like
TypedArray customArr = getResources().obtainTypedArray(R.array.country_arr);
CountryVO 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**);
But i don't to how to achieve this.
I tried customArr.getString(0); but it gives me everything as string like
Albania al #drawable/al
Please help me to solve this problem.
Thanks a lot in advance,
With best regards,
Ishan
Here is example. Read it and look at the methods of TypedArray like get...() for example getDrawable(int index). I would suggest to keep items of the same type in separated arrays.
<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;
}
When I need custom objects that can be edited outside code i generally use json which is easier to read for both humans and (possibly) machines ;)
You can also have more complex objects than with simple arrays.
Once you create a json file (e.g. countries.json) in the /res/raw folder like this:
{ "countries" : [
{"country" : "Albania", "countryCode" : "al" },
{"country" : "Algeria", "countryCode" : "dz"},
{"country" : "American Samoa", "countryCode" : "as"},
{"country" : "India", "countryCode" : "in"},
{"country" : "South Africa", "countryCode" : "sa"}
]}
you can load the data like this:
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);
}
If you don't want to do the parsing manually you can also use gson which helps you to pass the objects and then load the drawables in a lazy fashion... ;)
Edit: Added utility class
public String convertStreamToString(InputStream is) {
Scanner s = new Scanner(is).useDelimiter("\\A");
return s.hasNext() ? s.next() : "";
}
Hope it helps
You need to parse the xml before trying to store it in your class. I would recommend that you use the SAX API, you can find a tutorial on it here. Hope this helps!