2012-05-17 14 views
6

Estoy trabajando en una aplicación de Android que utiliza los iconos de Tab Host descargados de Internet y el tamaño del icono es 30x30.Android tabHost y tabWidget icon issue

for(int i = 0; i < titleNames.size(); i++) 
{ 
    intent = new Intent().setClass(context, Gallery.class); 
    sp = tabHost.newTabSpec(titleNames.get(i)).setIndicator(titleNames.get(i), res.getDrawable(R.drawable.icon)).setContent(intent); 
    tabHost.addTab(sp); 
} 

Si utilizo este código anterior (icono de recursos) para establecer el texto del indicador y el icono, que funciona bastante bien y el icono se ajusta al widget pestaña.

for(int i = 0; i < titleNames.size(); i++) 
{ 
    intent = new Intent().setClass(context, Gallery.class); 
    sp = tabHost.newTabSpec(titleNames.get(i)).setIndicator(titleNames.get(i), Drawable.createFromPath(path+iconNames.get(i))).setContent(intent); 
    tabHost.addTab(sp); 
} 

Pero Si utilizo este código (imagen descargada de Internet y está en la memoria interna) en lugar de la anterior, iconos parecen tan pequeña, e incluso los valores de altura y anchura son los mismos para los dos iconos. No escalo los íconos cuando los descargo de internet y los guardo como PNG. ¿Alguien tiene alguna idea sobre cuál es el problema?

Here is the tabhost with icons from resources

Here is the tabhost with icons downloaded from internet

SOLUCIÓN:

En lugar de añadir objetos al host pestaña con mi código anterior, ahora uso el código de abajo, y funciona bastante bien. La diferencia entre estos dos es nueva: se usa un diseño que tiene vista de imagen y vista de texto para indicar el icono y el texto a continuación para establecer el indicador del intento. Así, de esta manera, puedo llamar al método desde la vista de imagen para hacer que la imagen se ajuste a sus límites, que se define en el archivo xml. Aquí está la manera de hacerlo con Vista.

private void addTab(String labelId, Drawable drawable, Class<?> c) { 

    tabHost = getTabHost(); 
    intent = new Intent(this, c); 
    spec = tabHost.newTabSpec("tab" + labelId); 

    View tabIndicator = LayoutInflater.from(this).inflate(R.layout.tab_indicator, getTabWidget(), false); 
    TextView title = (TextView) tabIndicator.findViewById(R.id.title); 
    title.setText(labelId); 

    ImageView icon = (ImageView) tabIndicator.findViewById(R.id.icon); 
    icon.setImageDrawable(drawable); 
    icon.setScaleType(ImageView.ScaleType.FIT_CENTER); 

    spec.setIndicator(tabIndicator); 
    spec.setContent(intent); 
    tabHost.addTab(spec); 
} 

Y aquí está el diseño con vista de imagen y vista de texto.

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="0dip" 
android:layout_height="55dip"  
android:layout_weight="1" 
android:orientation="vertical" 
android:padding="5dp" 
android:weightSum="55" > 
<ImageView 
    android:id="@+id/icon" 
    android:layout_width="match_parent" 
    android:layout_height="0dp" 
    android:src="@drawable/icon" 
    android:adjustViewBounds="false" 
    android:layout_weight="30" 
/> 
<TextView 
    android:id="@+id/title" 
    android:layout_width="fill_parent" 
    android:layout_height="0dp" 
    android:layout_weight="25" 
    android:gravity="center_horizontal" 
/> 
</LinearLayout> 

Gracias a @Venky y @SpK por hacerme una idea.

+0

[Es mejor que pruebe este ejemplo] (http://stackoverflow.com/a/6992662/940096) Siempre sugiero este ejemplo a todos. – Praveenkumar

+0

http://stackoverflow.com/questions/5567532/android-ui-tabactivity-issue/5567823#5567823 .. Pruebe esta publicación – Venky

+0

Gracias por sus respuestas, son bastante útiles, puedo usarlo más adelante. Pero lo que quiero hacer es configurar estos iconos de la barra de pestañas con iconos que descargué de Internet, y como no utilizo drawable-mdpi o drawable-ldpi en recursos, no se ajustan a tabbar correctamente según la resolución de la pantalla. En lugar de usar recursos, me gustaría utilizar íconos en mi memoria interna. por ejemplo, con createDrawableFromPath(). – osayilgan

Respuesta

11

En lugar de agregar objetos al host de pestañas con mi código anterior, ahora utilizo el siguiente código y funciona bastante bien. La diferencia entre estos dos es nueva: se usa un diseño que tiene vista de imagen y vista de texto para indicar el icono y el texto a continuación para establecer el indicador del intento. Así, de esta manera, puedo llamar al método desde la vista de imagen para hacer que la imagen se ajuste a sus límites, que se define en el archivo xml. Esta es la forma de hacerlo con View.

private void addTab(String labelId, Drawable drawable, Class<?> c) { 

tabHost = getTabHost(); 
intent = new Intent(this, c); 
spec = tabHost.newTabSpec("tab" + labelId); 

View tabIndicator = LayoutInflater.from(this).inflate(R.layout.tab_indicator, getTabWidget(), false); 
TextView title = (TextView) tabIndicator.findViewById(R.id.title); 
title.setText(labelId); 

ImageView icon = (ImageView) tabIndicator.findViewById(R.id.icon); 
icon.setImageDrawable(drawable); 
icon.setScaleType(ImageView.ScaleType.FIT_CENTER); 

spec.setIndicator(tabIndicator); 
spec.setContent(intent); 
tabHost.addTab(spec); 
} 

Y aquí está el diseño con vista de imagen y vista de texto.

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="0dip" 
android:layout_height="55dip"  
android:layout_weight="1" 
android:orientation="vertical" 
android:padding="5dp" 
android:weightSum="55" > 
<ImageView 
    android:id="@+id/icon" 
    android:layout_width="match_parent" 
    android:layout_height="0dp" 
    android:src="@drawable/icon" 
    android:adjustViewBounds="false" 
    android:layout_weight="30" 
/> 
<TextView 
    android:id="@+id/title" 
    android:layout_width="fill_parent" 
    android:layout_height="0dp" 
    android:layout_weight="25" 
    android:gravity="center_horizontal" 
/> 
</LinearLayout> 

Gracias a @Venky y @SpK por hacerme una idea.

+0

¿Qué es getTabWidget()? –

3

dimensiones icono Tab para alta densidad (IPAP) pantallas: activos completo: 48 x 48 px Icon: 42 x 42 px

dimensiones icono Tab para de densidad media (MDPI) pantallas: completo de activos : 32 x 32 px Icon: 28 x 28 píxeles

dimensiones icono Tab de baja densidad (LDPI) pantallas: activos completo: 24 x 24 píxeles Icono: 22 x 22 píxeles

se puede ver esto: http://developer.android.com/guide/practices/ui_guidelines/icon_design_tab.html

+1

puede utilizar esto en el caso de que utilice los iconos de recursos de la aplicación no de la memoria interna, porque solo hay una dimensión para el icono descargado. – osayilgan

+0

@osayilgan de recursos de aplicaciones significa de carpeta dibujable? – user3233280

+0

@ user3233280 Sí, recursos significa cualquier cosa incluida con su aplicación. Puede ser cualquier cosa en la carpeta "Res" o "Assets". – osayilgan