Boycott A.I.
Boycott A.I.

Reputation: 18911

Android - How to set visibility in xml depending on device?

I have a TextView in my activity that should be visible normally, but gone for tablet devices.

I know I can create a new layout file for the tablet, but that seems like a lot of duplication, so what I am trying to do is set in my (single) layout file something like...

android:visibility="@string/my_textview_visibility"

...for the TextView. And then, in my strings resources files, set...

<string name="my_textview_visibility">gone</string> (in values/strings.xml)

...and...

<string name="my_textview_visibility">visible</string> (in values-sw720dp/strings.xml)

...to hide the TextView for tablets.

However, when I try this, the app crashes when trying to show that activity.

Do I need to use the constant values instead of the above string values - e.g.,

"visible" -> 0

"gone" -> 8

..and, if so, what is the correct way to add/reference those values to/from my XML files?

Or is there another/better way of doing it?

NB - I do not want to show/hide the TextView programatically in my Java code.

Upvotes: 6

Views: 4706

Answers (3)

Chris Stillwell
Chris Stillwell

Reputation: 10547

You should be using /values/integers/ instead:

values/integers.xml

<integer name="my_textview_visibility">0</integer> <!-- 0 = View.VISIBLE -->

values-sw720dp/integers.xml

<integer name="my_textview_visibility">2</integer> <!-- 2 = View.GONE -->

Then called like so:

android:visibility="@integer/my_textview_visibility"

Upvotes: 9

Robert Estivill
Robert Estivill

Reputation: 12497

ChrisStillwell's answer is correct. But the values are incorrect according to the Android Documentation

enter image description here

Upvotes: 6

Luiz Fernando Salvaterra
Luiz Fernando Salvaterra

Reputation: 4182

As you said, the best way to do this is to create a specific layout for tablets where your TextView will be hidden. However, it is possible to do this using xml boolean resources : (as res/values-sw600dp/):

<resources>
    <bool name="isTablet">true</bool>
</resources>

Because the sw600dp qualifier is only valid for platforms above android 3.2. If you want to make sure this technique works on all platforms (before 3.2), create the same file in res/values-xlarge folder:

<resources>
    <bool name="isTablet">true</bool>
</resources>

Then, in the "standard" value file (as res/values/), you set the boolean to false:

<resources>
    <bool name="isTablet">false</bool>
</resources>

Then in you activity, you can get this value and check if you are running in a tablet size device:

boolean tabletSize = getResources().getBoolean(R.bool.isTablet);
if (tabletSize) {
    // do something
} else {
    // do something else
}

Font : Determine if the device is a smartphone or tablet?

Upvotes: 0

Related Questions