It's always interesting to learn a new operating system or API, but it can often be a little frustrating. You never know when you're going to run into a couple of hours of head scratching. Often, it seems to be the simplest tasks - such as determining the height or width of an element you can plainly see rendered on the screen - that turn into hours of twiddling.
In Android, you attach a view tree to your Actitity in order to be able to interact with the UI.
Once this is done, you can get references to your widgets (views) using a call like this from your Activity:
TextView t = (TextView) findViewById(R.id.txtName);
Now, views all sport a method like this: t.getHeight()
Which, presumably returns the actual height of that view element. Problem is, this method invariably returns zero.
At first I thought it was because I was calling this during the onCreate() method in my activity class. Perhaps the layout wasn't fully calculated at this time. So I moved my code to the onResume() method. This method is called whenever the activity is entered or re-entered. But again, no luck. Strange, as the layout at this point should be fully ready to display. I think there's a bug here in Android (I'm at version 2.2 currently.)
Luckily, I accidentally hit the search button while running a test on my EVO and, lo and behold, the height values I was trying to report on a TextView in my layout suddenly had non-zero values in them. Obviously, some sort of layout process had been forced, and the state of the view tree had been updated.
How can I get notified when the layout is fully calculated? The short answer is to attached a listener for a callback when the layout is calculated. Here's what it looks like.
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
RelativeLayout vMain = (RelativeLayout)
this.getLayoutInflater().inflate(R.layout.main, null);
vMain.getViewTreeObserver().addOnGlobalLayoutListener(
new ViewTreeObserver.OnGlobalLayoutListener() {
public void onGlobalLayout() {
DisplayLayoutDimensions();
}
});
setContentView(vMain);
}
public void DisplayLayoutDimensions()
{
StringWriter sw = new StringWriter(1000);
PrintWriter out = new PrintWriter(sw);
TextView t = (TextView) findViewById(R.id.textview);
ImageView img = (ImageView) findViewById(R.id.hp67);
out.printf("\nImage Drawable\n");
out.printf("ImageView Height dp: %d\n", img.getHeight());
out.printf("ImageView Measured Height dp: %\n",
img.getMeasuredHeight());
t.setText(sw.toString());
}
This helped me a lot !
ReplyDeleteThanks!
This is brilliant. Thanks man !
ReplyDelete