2013-02-22 4 views
0

Я создаю Вкладка так:TabHost setIndicator - использовать макеты, а не значки?

TabSpec tab = tabHost.newTabSpec("Tab1").setIndicator("Tab1",res.getDrawable(R.drawable.tab1_selector)); 

и это мой селектор:

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/tab3Selector"> 

    <item android:drawable="@drawable/icon_pressed" android:state_selected="true"/> 
    <item android:drawable="@drawable/icon_unpressed"/> 

</selector> 

где icon_pressed и icon_unpressed просто иконки (PNG). Это прекрасно работает. Тем не менее, я хотел бы использовать вместо настройки значка и заголовка для установки только макета (где я могу установить значок названия +, но я хочу). Поэтому я попытался это:

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/tab3Selector">  
    <item android:drawable="@drawable/layout_pressed" android:state_selected="true"/> 
    <item android:drawable="@drawable/layout_unpressed"/>  
</selector> 

где layout_pressed и layout_unpressed являются макеты, как это:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content"> 

    <ImageView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:src="@drawable/icon_pressed" 
     android:layout_alignParentLeft="true"/> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_marginLeft="35dp" 
     android:textColor="@color/red" 
     android:textSize="@dimen/fontSmall"/> 

</RelativeLayout> 

И странно я во время выполнения мое приложение бросает ошибку:

89): FATAL EXCEPTION: main 
02-22 11:22:40.422: E/AndroidRuntime(9089): java.lang.RuntimeException: Unable to start activity ComponentInfo {com.test.myapp/com.test.myapp.activities.TabsActivity}: android.content.res.Resources$NotFoundException: File res/drawable-hdpi/tab3_selector.xml from drawable resource ID #0x7f020010 
02-22 11:22:40.422: E/AndroidRuntime(9089):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2185) 
02-22 11:22:40.422: E/AndroidRuntime(9089):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2210) 
02-22 11:22:40.422: E/AndroidRuntime(9089):  at android.app.ActivityThread.access$600(ActivityThread.java:142) 
02-22 11:22:40.422: E/AndroidRuntime(9089):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1208) 
02-22 11:22:40.422: E/AndroidRuntime(9089):  at android.os.Handler.dispatchMessage(Handler.java:99) 
02-22 11:22:40.422: E/AndroidRuntime(9089):  at android.os.Looper.loop(Looper.java:137) 
02-22 11:22:40.422: E/AndroidRuntime(9089):  at android.app.ActivityThread.main(ActivityThread.java:4931) 
02-22 11:22:40.422: E/AndroidRuntime(9089):  at java.lang.reflect.Method.invokeNative(Native Method) 
02-22 11:22:40.422: E/AndroidRuntime(9089):  at java.lang.reflect.Method.invoke(Method.java:511) 
02-22 11:22:40.422: E/AndroidRuntime(9089):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791) 
02-22 11:22:40.422: E/AndroidRuntime(9089):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:558) 
02-22 11:22:40.422: E/AndroidRuntime(9089):  at dalvik.system.NativeStart.main(Native Method) 
02-22 11:22:40.422: E/AndroidRuntime(9089): Caused by: android.content.res.Resources$NotFoundException: File res/drawable-hdpi/tab1_selector.xml from drawable resource ID #0x7f020010 
02-22 11:22:40.422: E/AndroidRuntime(9089):  at android.content.res.Resources.loadDrawable(Resources.java:1947) 
02-22 11:22:40.422: E/AndroidRuntime(9089):  at android.content.res.Resources.getDrawable(Resources.java:659) 
02-22 11:22:40.422: E/AndroidRuntime(9089):  at com.test.myapp.activities.TabsActivity.onCreate(TabsActivity.java:39) 
02-22 11:22:40.422: E/AndroidRuntime(9089):  at android.app.Activity.performCreate(Activity.java:5008) 
02-22 11:22:40.422: E/AndroidRuntime(9089):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079) 
02-22 11:22:40.422: E/AndroidRuntime(9089):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2139) 
02-22 11:22:40.422: E/AndroidRuntime(9089):  ... 11 more 
02-22 11:22:40.422: E/AndroidRuntime(9089): Caused by: android.content.res.Resources$NotFoundException: File res/drawable- 
hdpi/layout_pressed.xml from drawable resource ID #0x7f020016 
02-22 11:22:40.422: E/AndroidRuntime(9089):  at android.content.res.Resources.loadDrawable(Resources.java:1947) 
02-22 11:22:40.422: E/AndroidRuntime(9089):  at android.content.res.Resources.getDrawable(Resources.java:659) 
02-22 11:22:40.422: E/AndroidRuntime(9089):  at android.graphics.drawable.StateListDrawable.inflate(StateListDrawable.java:173) 
02-22 11:22:40.422: E/AndroidRuntime(9089):  at android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:881) 
02-22 11:22:40.422: E/AndroidRuntime(9089):  at android.graphics.drawable.Drawable.createFromXml(Drawable.java:818) 
02-22 11:22:40.422: E/AndroidRuntime(9089):  at android.content.res.Resources.loadDrawable(Resources.java:1944) 
02-22 11:22:40.422: E/AndroidRuntime(9089):  ... 16 more 
02-22 11:22:40.422: E/AndroidRuntime(9089): Caused by: org.xmlpull.v1.XmlPullParserException: Binary XML file line #2: invalid drawable tag RelativeLayout 
02-22 11:22:40.422: E/AndroidRuntime(9089):  at android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:877) 
02-22 11:22:40.422: E/AndroidRuntime(9089):  at android.graphics.drawable.Drawable.createFromXml(Drawable.java:818) 
02-22 11:22:40.422: E/AndroidRuntime(9089):  at android.content.res.Resources.loadDrawable(Resources.java:1944) 
02-22 11:22:40.422: E/AndroidRuntime(9089):  ... 21 more 

Что это означает, что я не могу использовать в TabHost tabs setIndicator (селектор с макетами)?

+0

У вас есть ресурсы $ NotFoundException в файле res/drawable-hdpi/layout_pressed.xml проверьте, что у вас есть все ресурсы, которые вы используете в этом макете - значок, цвет, размер –

+0

ваш лог-код показывает, что tab1_selector.xml не найден в папке res/drawable-hdpi/tab1_selector.xml –

+0

, вы можете переместить файл tab1_selector.xml в drawable -hdpi для тестирования –

ответ

0

ну, это, вероятно, не моя вина, но проблема с андроидом. Посмотрите на мой селектор:

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/tab3Selector"> 

    <!-- Layouts (in drawable folder) - don't work !!! --> 

    <item android:drawable="@drawable/pressed_layout" android:state_selected="true"/> 
    <item android:drawable="@drawable/unpressed_layout" android:state_selected="false"/> 

    <!-- Icons (in drawable folder) - work !!! --> 

<!--<item android:drawable="@drawable/pressed_icon" android:state_selected="true"/> --> 
<!--<item android:drawable="@drawable/unpressed_icon"/> --> 

</selector> 

Похоже, в TabHost метод setIndicator просто не может, т быть селектор с макетами, но может быть селектор с иконками ...

0
  1. Сначала положить все файлы selector.xml в разрешении/вытяжке папку

Заменить

TabSpec tab = tabHost.newTabSpec("Tab1").setIndicator("Tab1",res.getDrawable(R.drawable.tab1_selector)); 

С

TabSpec tab = tabHost.newTabSpec("Tab1").setIndicator("Tab1",getResources().getDrawable(R.drawable.tab1_selector)); 
+0

ну, конечно res - локальная переменная: res = getResources();) Это не проблема. И все мои селекторы находятся в выпадающем каталоге, а также все используемые макеты в селекторах ... – qkx

0

Caused by: android.content.res.Resources$NotFoundException: File res/drawable-hdpi/tab1_selector.xml from drawable resource ID #0x7f020010



Caused by: android.content.res.Resources$NotFoundException: File res/drawable-hdpi/layout_pressed.xml from drawable resource ID #0x7f020010

Stacktrace показывает, что система Android не может найти некоторые ресурсы в указанных папках. Предоставляли ли вы резорбции в соответствующих папках.

0

Я знаю, что это старый, но в соответствии с TabHost Страница API с быстрой связью here, если вы хотите что-либо сделать с макетами, используйте setIndicator(View view) вместо версии setIndicator(CharSequence label, Drawable icon).

Основано на Drawable API, layout не может быть Drawable. Это похоже на попытку превратить апельсин в яблоко. Оба являются плодами, так же, как и layout, и icon - это то, что вы видите как нечто потенциально больше, чем просто текст. Однако они по-прежнему отличаются друг от друга и обрабатываются по-разному.