Why do 9-patch graphics size correctly in the emulator but not on a phone?

android, android-layout, android-mapview, layoutparams

Solution

Make sure you have an mdpi and an hdpi version if you test on different densities. If you put your 9patch in res/drawable/ for instance, it will be treated as an mdpi asset and scaled up automatically on hdpi devices (Nexus S). Because it's an automatic process, the results are not guaranteed.

Problem

I have a RelativeLayout that has a 9-patch background image. The image is a simple speech bubble with a perfectly centered "arrow" at the bottom middle. The RelativeLayout is inflated and placed on a MapView. Using the emulator, the speech bubble can be easily pointed to a location and will expand to its contents (text, an image, or both). When I run my app on a phone however, the 9-patch doesn't stretch properly. The "arrow" for the speech bubble will be offset to the left by a very noticeable amount. I primarily test on a Nexus S, but also a Samsung Captivate and Nexus One. Targeting SDK 7. Tested emulators for SDK 7+. Only hardware devices seem to have this problem. ``` <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_height="wrap_content" android:id="@+id/BubbleLayout" android:background="@drawable/bubble" android:layout_width="wrap_content" android:gravity="center_horizontal"> <TextView android:layout_height="wrap_content" android:id="@+id/date" android:layout_width="wrap_content" android:maxWidth="196dp"></TextView> <TextView android:layout_below="@+id/date" android:layout_height="wrap_content" android:layout_width="wrap_content" android:maxWidth="196dp" android:id="@+id/summary"></TextView> </RelativeLayout> ```

Original source