Wednesday, July 8, 2009
How to protect part of a public method from being executed by others
To solve this problem I used enforceCallingOrSelfPermission.
Anything you do in your code until you call that method will be runnable by anyone who can access your method but passed this point it will through a SecurityException If neither you nor the calling process has been granted a particular permission.
Here's what it looks like:
void myMethod() {
// my code every one has access to...
myContext.enforceCallingOrSelfPermission(myPermission, myMessage);
// my super code that noone else can execute
}
Wednesday, June 17, 2009
How to have a few layout elements wrap around
Here is a problem people might encounter when dealing with layouts on android.
Say you want to place an image at the middle of a sentence. you may add a couple TextView and an ImageView but if the horizontal space gets too small the two TextViews are going to start wrapping around independently wich is going to look weird. You'd want the image to be part of your TextView and the entire sentence to wrap around nicely.
To do so:* replace the three objects by one Spannable TextView
* use a SpannableStringBuilder to append all your strings (don't forget to add an extra character (a space for example) that will be replaced by your image)
* and finally use setSpan(ImageSpan, begin, end, flag) on that builder where ImageSpan is an ImageSpan containing the drawable of your picture, begin is the index of the character you've inserted
So instead of having something that looks like this:
I really really really really like | Picasa because it's a very very very very nice free image editing software |
You get something that looks more like that:
I really really really really like Picasa because it's a very very very very nice free image editing software |
And here's what the code would look like:
add android:bufferType="spannable" to your TextView
SpannableStringBuilder builder = new SpannableStringBuilder();
builder.append(mContext.getText(R.string.part1));
int lengthOfPart1 = builder.length();
builder.append(" ");
builder.append(mContext.getText(R.string.part2));
Drawable d = mContext.getResources().getDrawable(R.drawable.picasaIcon);
d.setBounds(0, 0, d.getIntrinsicWidth(), d.getIntrinsicHeight()); // <---- Very important otherwise your image won't appear
ImageSpan myImage = new ImageSpan(d);
builder.setSpan(myImage, lengthOfPart1, lengthOfPart1 + 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
myTextView.setText(builder);
Tuesday, June 16, 2009
How to create a custom progress bar
<layer-list xmlns:android="http://schemas.
</shape>
</clip>
</item>
</layer-list>
Then you would add that custom progress bar to the layout you want that bar to appear:
And finally you would access it from your code like you would with any regular progress bar:
Special Thx to Mikael for this one.
Using resources
When using resources the name used behind the @ sign is not the name of the resource file you will find that value in but the type of resource you are refering to. here xxxx is the type and yyyy is the name of the variable you're using. So your layout file would have something like this:
android:background="@xxxx/yyyy"
and your resource file (say mySuperRes.xml) would look something like that:
<xxxx name="yyyy">zzzz</xxxx>Adding and removing things to the API
- If you want to add a system setting or anything to the API you need to run:
make update-api
- If you remove a system setting or anything from the API and end up with this error:
******************************
You have tried to change the API from what has been previously released in
an SDK. Please fix the errors listed above.
******************************
you need to run:
make update-api
if that doesn't do it edit "build/core/api/current.xml" and "build/core/api/1.xml" and make sure your setting is no longer there.How to pop a toast (sort of alert messages)
Toast.makeText([the current context, for example: this], "Hello World", Toast.LENGTH_LONG).show();