android eclipse с использованием строкового ресурса для размера текста в макетах

Я хочу иметь возможность хранить размер шрифта (18sp) в ресурсе, чтобы его можно было использовать во многих моих макетах, чтобы я мог легко изменить размер в будущем, если мне нужно. У меня есть строка в файле строковых ресурсов со значением «18sp», и я могу вызвать ее в редакторе макета, установив размер текста «@strings/string_name». В этот момент все в порядке, и текст меняется на правильный шрифт. Проблема в том, что когда я пытаюсь проверить это на реальном устройстве, я получаю:

04-13 12:01:01.210: E/AndroidRuntime(17114): Caused by: android.view.InflateException:    Binary XML file line #50: Error inflating class <unknown>


04-13 12:01:01.210: E/AndroidRuntime(17114):    at 

android.view.LayoutInflater.createView(LayoutInflater.java:606)
04-13 12:01:01.210: E/AndroidRuntime(17114):    at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56)
04-13 12:01:01.210: E/AndroidRuntime(17114):    at android.view.LayoutInflater.onCreateView(LayoutInflater.java:653)
04-13 12:01:01.210: E/AndroidRuntime(17114):    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:678)
04-13 12:01:01.210: E/AndroidRuntime(17114):    at android.view.LayoutInflater.rInflate(LayoutInflater.java:739)
04-13 12:01:01.210: E/AndroidRuntime(17114):    at android.view.LayoutInflater.rInflate(LayoutInflater.java:742)
04-13 12:01:01.210: E/AndroidRuntime(17114):    at android.view.LayoutInflater.rInflate(LayoutInflater.java:742)
04-13 12:01:01.210: E/AndroidRuntime(17114):    at android.view.LayoutInflater.rInflate(LayoutInflater.java:742)
04-13 12:01:01.210: E/AndroidRuntime(17114):    at android.view.LayoutInflater.rInflate(LayoutInflater.java:742)
04-13 12:01:01.210: E/AndroidRuntime(17114):    at android.view.LayoutInflater.rInflate(LayoutInflater.java:742)
04-13 12:01:01.210: E/AndroidRuntime(17114):    at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
04-13 12:01:01.210: E/AndroidRuntime(17114):    at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
04-13 12:01:01.210: E/AndroidRuntime(17114):    at android.view.LayoutInflater.inflate(LayoutInflater.java:352)
04-13 12:01:01.210: E/AndroidRuntime(17114):    at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:251)
04-13 12:01:01.210: E/AndroidRuntime(17114):    at android.app.Activity.setContentView(Activity.java:1835)
04-13 12:01:01.210: E/AndroidRuntime(17114):    
04-13 12:01:01.210: E/AndroidRuntime(17114):    at android.app.Activity.performCreate(Activity.java:4465)
04-13 12:01:01.210: E/AndroidRuntime(17114):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
04-13 12:01:01.210: E/AndroidRuntime(17114):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)
04-13 12:01:01.210: E/AndroidRuntime(17114):    ... 11 more
04-13 12:01:01.210: E/AndroidRuntime(17114): Caused by: java.lang.reflect.InvocationTargetException
04-13 12:01:01.210: E/AndroidRuntime(17114):    at java.lang.reflect.Constructor.constructNative(Native Method)
04-13 12:01:01.210: E/AndroidRuntime(17114):    at java.lang.reflect.Constructor.newInstance(Constructor.java:417)
04-13 12:01:01.210: E/AndroidRuntime(17114):    at android.view.LayoutInflater.createView(LayoutInflater.java:586)
04-13 12:01:01.210: E/AndroidRuntime(17114):    ... 29 more
04-13 12:01:01.210: E/AndroidRuntime(17114): Caused by: java.lang.UnsupportedOperationException: Can't convert to dimension: type=0x3
04-13 12:01:01.210: E/AndroidRuntime(17114):    at android.content.res.TypedArray.getDimensionPixelSize(TypedArray.java:463)
04-13 12:01:01.210: E/AndroidRuntime(17114):    at android.widget.TextView.<init>(TextView.java:786)
04-13 12:01:01.210: E/AndroidRuntime(17114):    at android.widget.TextView.<init>(TextView.java:442)

Это потому, что я использую строковый ресурс в качестве размера текста, или это какая-то другая основная проблема? Если это связано с тем, что я использую строковый ресурс, есть ли другой/более правильный способ иметь глобальный размер текста, к которому я могу обратиться, чтобы я мог изменить все, изменив 1 значение?

Также обратите внимание: мое приложение работало нормально, прежде чем я попытался использовать строковый ресурс в качестве размера текста, поэтому я относительно уверен, что это не может быть чем-то посторонним, что вызывает ошибку.

Спасибо!


person Nick    schedule 13.04.2012    source источник


Ответы (2)


Создайте файл dimens.xml в вашем каталоге res с содержимым, подобным этому:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <dimen name="some_text_size">18dp</dimen>
</resources>

Затем вместо того, чтобы ссылаться на него как @string/blah, используйте @dimen/blah.

person Shellum    schedule 13.04.2012
comment
Работает как шарм. Большое спасибо! - person Nick; 13.04.2012
comment
У меня есть 4 папки значений, такие как значения-маленькие, нормальные, большие, большие. и поместите в них 4 файла dimens.xml. но они не работают! - person Dr.jacky; 27.10.2012
comment
можешь объяснить что ты имеешь в виду под словом не работает? Я только что провел быстрый тест проверки, и значения по сравнению с большими значениями отлично подходят для извлечения разных значений из разных файлов dimens.xml. - person Shellum; 29.10.2012

Используйте это как свой XML-ресурс и вызывайте его из любого места...

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <dimen name="textview_height">25dp</dimen>
    <dimen name="textview_width">150dp</dimen>
    <dimen name="ball_radius">30dp</dimen>
    <dimen name="font_size">16sp</dimen>
</resources>

Затем вызовите это в коде:

Resources res = getResources();
float fontSize = res.getDimension(R.dimen.font_size);
person Arif Nadeem    schedule 13.04.2012
comment
Спасибо! Определенно правильный ответ, но предыдущий автор ответил первым. - person Nick; 13.04.2012