Android: How to Declare Styleable in R.java? - android

I'm trying to use this ViewPager extension. This plugin helps me using SwipeyTab. I succeed to run example as a single application. So I want to integrate extension in to my application.Then I coppied the java files and changed package names, everything is fine. But I've got some errors on these lines:
mTextColorCenter = a.getColor(R.styleable.ViewPagerExtensions_textColorSelected, mTextColorCenter);
mLineColorCenter = a.getColor(R.styleable.ViewPagerExtensions_lineColorSelected, mLineColorCenter);
mLineHeightSelected = a.getDimensionPixelSize(R.styleable.ViewPagerExtensions_lineHeightSelected, mLineHeightSelected);
Eclipse says: Styleable cannot be resolved or is not a field. Other lines which contains styleable also gives the same errors too. If I try to click solve this problem nothing changes.
When I have looked at extension's R.java file, I saw these lines:
public static final class styleable {
public static final int[] ViewPagerExtensions = {
0x7f010000, 0x7f010001, 0x7f010002, 0x7f010003,
0x7f010004, 0x7f010005, 0x7f010006, 0x7f010007,
0x7f010008, 0x7f010009, 0x7f01000a
};
public static final int ViewPagerExtensions_dividerColor = 7;
// there is more
}
I know it's not possible to edit R.java. How could I define styleable in R.java for this extension? Any suggestions?

You should define, attributes that you gonna need, in a seperate xml file. I mean create a values.xml and use <declare-styleable name="ViewPagerExtensions"></declare-styleable> tags.
Let me give an example:
<declare-styleable name="ViewPagerExtensions">
<attr format="integer" name="dividerColor" />
</declare-styleable>
By the way, there is already attrs.xml in project, check it out:

Related

CTS PrivateAttributeTest in M: How to resolve it by using private attribute correctly?

Google have added this new CTS case in M, which is cts/tests/tests/content/src/android/content/res/cts/PrivateAttributeTest.java
It enforces that NO vendor custom attribute (type=attr, id=0x0101*) shall be added to framework/base/core/res/res/values/public.xml, according to the comments of this test case:
/**
* Tests that private attributes are correctly placed in a separate type to
* prevent future releases from stomping over private attributes with new public ones.
*/
Seems that vendor should use the private attribute mechanism instead, which is built into aapt already. Basically it is an alias of attr, with its own id range.
It works, except one caveat:
The doclint check of javadoc is broke by private attribute, since aapt (framework/base/tools/aapt/Resource.cpp::writeLayoutClasses) add an invalid link to the comments of private attribute, like this:
assume we add a private attribute named "foo" in public.xml:
<public type="attrprivate" name="foo" id="0x01110000"/>
which is a styleable for View:
<resources>
<declare-styleable name="View">
<attr name="foo" format="reference|float">
</declare-styleable>
</resources>
the R.java generated by aapt will be:
/*
blabla
<p>This corresponds to the global attribute
resource symbol {#link android.R.attr#foo}.
#attr name android:foo
*/
public static final int View_foo = 87;
but {#link android.R.attr#foo} is invalid since there is no android.R.attr.foo symbol, hence broke the doclint check of javadoc.
Am I using private attribute correctly? or is it an issue of the framework for now?
Thanks,
Heng

attrs not resolved or not a field

As with many I am writing my first app. I am trying to use the three button toggle from here: http://androidasilearnit.wordpress.com/2011/03/05/custom-toggle-button/
The only problem I have at the moment is I have created the attrs.xml file and it is in the res/values folder. However, when I have created the TriToggleButton.java class I am getting errors on all three states that are declared in attrs.xml
//Get the attributes created in attrs.xml
private static final int[] STATE_ONE_SET =
{
R.attr.state_one
};
private static final int[] STATE_TWO_SET =
{
R.attr.state_two
};
private static final int[] STATE_THREE_SET =
{
R.attr.state_three
};
I have looked in R.java (as that was a suggested fix) and they are not in there. I can see all the other XML info in there but not the attr
Any ideas?
Edit:
Here is the attrs.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="CustomButtonState">
<!-- Use one for every state you want to have -->
<attr name="litres" format="boolean" />
<attr name="usgal" format="boolean" />
<attr name="impgal" format="boolean" />
</declare-styleable>
</resources>
Oh and the clean has really broken it. Now all my resources are not being found!! IN MainActivity.java I am now getting "R cannot be resolved to a variable"
For those in the future. Whenever I have this problem it is invariably an XML problem. For me, it is generally always the menu. As far as i can tell it is an eclipse problem because I can delete the whole XML and the R.java will update. I can post the whole XML back in unchanged and the program will compile and run without problem. It is tedious but I can work around it.

How to get Integer value from res/integers.xml?

Following is my integers.xml file,
<?xml version="1.0" encoding="utf-8"?>
<resources>
<integer name="LOCATION_ALARM_INTERVAL">60000</integer>
<integer name="MID_NIGHT_ALARM_INTERVAL">86400000</integer>
</resources>
if it was strings.xml, i could have access variable like below,
getString( R.string.<variable_name> );
but how can I do same to get value from integeres.xml file ?
when I write getResources().getInteger(R.integer. it is showing me 3 variable which I haven't declared.
So How can I access the variable which I declared in integers.xml file ?
It should be done like this:
Resources res = getResources();
int i= res.getInteger(R.integer.int_value);
where int_value is the variable name given in your xml
You're looking at the android.R.integer instead of your.namespace.R.integer.
Eclipse probably imported the wrong one; it does that sometimes, it's rather annoying.
Go to your imports at the top of the file and remove:
import android.R;
Then you should be able to use the quick-fix to add the correct import.
May be you have to clean your project once before accessing these file. I do it like this and it always works.
Resources r = getResources();
int i = r.getInteger(R.integer.<variable_name>)
Try to clean your project and restart your eclipse because this is the right way of doing it.
simple code :
int maximum = getContext().getResources().getInteger(R.integer.maximum);

Android : Error in R.java class

I am having a strange error that I can not resolve in class R.java in my android application
the error is in the following line
public static final class string {
public static final int =0x7f05002f;
because it has no variable after the int
can anyone help me please with this error ?
R.java is auto-generated, and is not meant to be edited manually.
If you face issues, delete R.java and rebuild your project and it will be generated again, according to your layout.
If problem persists, look into your xml files ( strings.xml, layout.xml, etc) for any errors.
check your strings.xml file.It seems like you have saved some value without assigning any name to that.
Look for an entry not having any name attribute. something like <string>8</string>, either remove that or assign a name attribute to that like <string name="anyname">8</string>
A bad R.java would mean an error somewhere else. If deleting it and rebuilding the projetc doesn't solve it look at your manifest and other xml resources for errors.

What is the use of the res/values/public.xml file on Android?

I've searched on Google, but couldn't find any relevant results.
I also checked the official Android docs and this page (for all the available resources) was all I could find. The relevant links (to the res/values/ directory) I found on this page were:
string resources
style resources
more resources
These pages don't tell anything about the res/values/public.xml file.
Here is an example I found for this type of file.
Small snippet
<?xml version="1.0" encoding="utf-8"?>
<resources>
<public type="attr" name="commentTextColor" id="0xAA010007" />
<public type="drawable" name="add_icon_bl" id="0xAA020000" />
<public type="layout" name="act_date_picker" id="0xAA030001" />
<public type="anim" name="activity_slide_from_bottom" id="0xAA040000" />
<public type="xml" name="pref_menu" id="0xAA050000" />
<public type="raw" name="alert_bell_animation_bl" id="0xAA060000" />
<public type="array" name="taskRepeat" id="0xAA070000" />
<public type="color" name="theme_main_color_bl" id="0xAA080000" />
<public type="string" name="no_internet" id="0xAA0a0001" />
<public type="id" name="page1" id="0xAA0d0015" />
</resources>
As you can see from the type attribute, it contains pretty much all the standard resource types that you normally put in separate directories under the res directory...
Why would one want to misuse the directories that Android provides and use a single file to store all the values in? Can someone give more information about this?
The file res/values/public.xml is used to assign fixed resource IDs to Android resources.
Consider these set of string resources in res/values/strings.xml:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="string1">String 1</string>
<string name="string3">String 3</string>
</resources>
The Android Asset Packaging Tool (aapt) might assign the following resource IDs for these resources when the app is compiled:
public final class R {
// ...
public static final class string {
public static final int string1=0x7f040000;
public static final int string3=0x7f040001;
}
}
Now, change the set of string resources to
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="string1">String 1</string>
<string name="string2">String 2</string>
<string name="string3">String 3</string>
</resources>
and you'll notice that the resource ID for #string/string3 has changed:
public final class R {
// ...
public static final class string {
public static final int string1=0x7f040000;
public static final int string2=0x7f040001;
public static final int string3=0x7f040002; // New ID! Was 0x7f040001
}
}
To prevent this, you can use res/values/public.xml:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<public type="string" name="string3" id="0x7f040001" />
</resources>
which will result in the resource IDs being assigned as follows:
public final class R {
// ...
public static final class string {
public static final int string1=0x7f040000;
public static final int string2=0x7f040002;
public static final int string3=0x7f040001; // Resource ID from public.xml
}
}
Applications rarely have any use for res/values/public.xml since the resource IDs assigned to resources does not matter. When they change, the entire application is rebuilt anyway so any references in Java code to resources by resource ID will be updated.
The most significant user of res/values/public.xml is the Android platform itself. Applications built against old versions of Android assumes that certain resource have a certain resource ID. For example, the Android resource #android:style/Theme must always have the resource ID 0x01030005 for the platform to be backwards compatible with apps built against old versions of the platform.
If you are curious about more details on how resource IDs are assigned, please refer to this answer: How does the mapping between android resources and resources ID work?
https://developer.android.com/studio/projects/android-library.html#PrivateResources
public.xml is useful for library projects in general. If you include a public.xml, it's assumed that the rest of your resources are meant to be private.
Although private resources will still be usable by other projects, the linter will warn about using them, and they won't be included in AndroidStudio's autocompletion.
Here's a gist for autogenerating public.xml
https://gist.github.com/HannahMitt/99922d4183bdb03356fd339413ba6303
Is it not a file just for the use authors of the OS code to define a mapping between symbolic names and system resource ids?
You'll find it in your SDK at YOUR_SDK_LOCATION\platforms\android-??\data\res\values.
It's headed
This file defines the base public resources exported by the platform,
which must always exist
and has the caveat:
IMPORTANT NOTE FOR ANYONE MODIFYING THIS FILE READ THIS BEFORE YOU
MAKE ANY CHANGES
This file defines the binary compatibility for resources. As such,
you must be very careful when making changes here, or you will
completely break backwards compatibility with old applications
It has entries such as
<public type="attr" name="smallScreens" id="0x01010284" />
<public type="attr" name="normalScreens" id="0x01010285" />
<public type="attr" name="largeScreens" id="0x01010286" />
in it - all system resurce ids, so anyone changing entries will break their code, insomuch as it won't run on a standard device.

Categories

Resources