Tab中的图标不显示

我从Android开始,当我尝试用图标和文本做一个TabHost。 只有文本是可见的,如果我把文本留在空白,可以看到图标。 我想在屏幕上看到。

有人可以给我build议吗?

public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Usuario usu = new Usuario(); usu.nombre = "fsdf"; lista.add(usu); adaptador = new AdaptadorCelda(this,lista); ListView lstView = (ListView)findViewById(R.id.lista); lstView.setAdapter(adaptador); Button btn = (Button)findViewById(R.id.btnSalva); btn.setOnClickListener(onSave); Resources res = getResources(); TabHost tabs=(TabHost)findViewById(R.id.tabhost); tabs.setup(); TabHost.TabSpec spec=tabs.newTabSpec("mitab1"); spec.setContent(R.id.tab1); spec.setIndicator("",res.getDrawable(android.R.drawable.ic_menu_rotate)); tabs.addTab(spec); spec=tabs.newTabSpec("mitab2"); spec.setContent(R.id.tab2); spec.setIndicator("ddd", res.getDrawable(android.R.drawable.presence_invisible)); tabs.addTab(spec); tabs.setCurrentTab(0); spec.setIndicator("",res.getDrawable(android.R.drawable.ic_menu_rotate)) In this case icon appears. spec.setIndicator("ddd", res.getDrawable(android.R.drawable.presence_invisible)); 

这里是main.xml

 <TabHost xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/tabhost" android:layout_width="fill_parent" android:layout_height="fill_parent" > <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <TabWidget android:id="@android:id/tabs" android:layout_width="match_parent" android:layout_height="wrap_content" /> <FrameLayout android:id="@android:id/tabcontent" android:layout_width="match_parent" android:layout_height="match_parent" > <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/tab1" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <TextView android:id="@+id/lblNombre" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_marginTop="17dp" android:text="Nombre" android:textAppearance="?android:attr/textAppearanceLarge" /> <EditText android:id="@+id/txtNombre" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignTop="@+id/lblNombre" android:layout_marginLeft="35dp" android:layout_toRightOf="@+id/lblNombre" android:ems="10" > <requestFocus /> </EditText> <EditText android:id="@+id/txtApellido" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@+id/txtNombre" android:layout_below="@+id/txtNombre" android:ems="10" /> <TextView android:id="@+id/lblApellido" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignBottom="@+id/txtApellido" android:layout_alignParentLeft="true" android:text="Apellidos" android:textAppearance="?android:attr/textAppearanceLarge" /> <RadioGroup android:id="@+id/tipos" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/txtApellido" android:layout_marginTop="35dp" android:layout_toLeftOf="@+id/txtApellido" > <RadioButton android:id="@+id/rdbAlta" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="alta" /> <RadioButton android:id="@+id/rdbBaja" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="baja" /> <RadioButton android:id="@+id/rdbTramite" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="tramite" /> </RadioGroup> <Button android:id="@+id/btnSalva" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@+id/txtApellido" android:layout_alignTop="@+id/tipos" android:layout_marginLeft="58dp" android:layout_marginTop="30dp" android:text="Button" /> <ImageView android:id="@+id/imageView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_below="@+id/txtApellido" android:src="@drawable/ic_menu_chart" /> </RelativeLayout> <LinearLayout android:id="@+id/tab2" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <ListView android:id="@+id/lista" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_below="@+id/tipos" android:layout_marginTop="24dp" > </ListView> </LinearLayout> </FrameLayout> 

您是否在运行冰淇淋三明治的设备上testing过您的应用程序? 我最近注意到,根据目标设备和Android平台版本,默认的TabHost行为有所不同。

运行一个提供图标和文本到setIndicator的应用程序(如问题的源代码),得到以下testing结果:

  • 手机与Android 2.1:图标和文字显示(标签下的图标如预期)
  • 4.0.3电话:图标没有显示, 只有文字是可见的。
  • 运行ICS的平板电脑:显示图标和文字的标签

正如你也发现,用空stringreplace标签的图标出现在电话上 – 但是然后用户需要猜测图标的含义。 除此之外:在ICS手机上运行此版本的应用程序时:选项卡保持其大小,并在图像下留下空白区域。

要更改此设备驱动的决定选项卡应该得到多less空间,我find了本教程中如何自定义选项卡的解决scheme:

首先,您需要提供您自己的选项卡指示符布局(教程中的“layout / tab_indicator.xml”),包括ImageViewTextView 。 然后你告诉TabSpec通过setIndicator来使用它。 瞧:你可以用ICS在手机上看到图标和标签。

这里是如何设置指标(这是当前活动)的重要部分:

 TabHost.TabSpec spec = this.getTabHost().newTabSpec(tag); View tabIndicator = LayoutInflater.from(this).inflate(R.layout.tab_indicator, getTabWidget(), false); ((TextView) tabIndicator.findViewById(R.id.title)).setText(label); ((ImageView) tabIndicator.findViewById(R.id.icon)).setImageResource(drawableResourceId); spec.setIndicator(tabIndicator); 

如果你喜欢在较旧和较新的手机上的标签相同的外观在这里有一个额外的外观: http : //jgilfelt.github.com/android-actionbarstylegenerator/ 。 这个页面生成图像和样式来自定义包含标签的操作栏,并帮助我弄清楚9个补丁背景图像是如何定义的。

这是在ICS中显示文本和图标的简单方法。 设置Tabhost后,我调用下面的方法:

 setTabIcon(mTabHost, 0, R.drawable.ic_tab1); //for Tab 1 setTabIcon(mTabHost, 1, R.drawable.ic_tab2); //for Tab 2 public void setTabIcon(TabHost tabHost, int tabIndex, int iconResource) { ImageView tabImageView = (ImageView) tabHost.getTabWidget().getChildTabViewAt(tabIndex).findViewById(android.R.id.icon); tabImageView.setVisibility(View.VISIBLE); tabImageView.setImageResource(iconResource); } 

如果您想要更高级的解决scheme,您需要创build一个像@sunadorer推荐的布局。 我的build议是,您可以使用全息主题布局创build布局,在您的sdk_dir / platforms / android-14 / data / res / layout / tab_indicator_holo.xml中search文件。

我的高级解决scheme是下一个,你需要创build一个这样的布局:

tab_indicator.xml

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_height="wrap_content" android:orientation="vertical" android:paddingTop="5dp" android:paddingBottom="5dp" style="@android:style/Widget.Holo.Tab"> <ImageView android:id="@android:id/icon" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:visibility="visible" /> <TextView android:id="@android:id/title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" style="@android:style/Widget.Holo.ActionBar.TabText" /> </LinearLayout> 

在你的活动或片段中,创build下一个function:

 public View createTabIndicator(LayoutInflater inflater, TabHost tabHost, int textResource, int iconResource) { View tabIndicator = inflater.inflate(R.layout.tab_indicator, tabHost.getTabWidget(), false); ((TextView) tabIndicator.findViewById(android.R.id.title)).setText(textResource); ((ImageView) tabIndicator.findViewById(android.R.id.icon)).setImageResource(iconResource); return tabIndicator; } 

最后,当您在活动或片段中创build选项卡时,请使用下面的代码:

 mTabHost.addTab( mTabHost.newTabSpec("tab1") .setIndicator(createTabIndicator(inflater, mTabHost, R.string.tab1, R.drawable.ic_tab1)) .setContent(R.id.tab1) ); 

我已经在ICS中testing了这个解决scheme,工作正常。

祝你好运 :)

还有另一个非常简单的解决scheme。

看来这个问题在新的Holo主题和TabWidget 。 所以你应该做的是在你的values-v11文件夹中定义Holo主题,但是像这样的旧的TabWidget风格:

 <style name="MyAppTheme" parent="@android:style/Theme.Holo.NoActionBar"> <item name="android:tabWidgetStyle">@android:style/Widget.TabWidget</item> </style> 

它适用于我,希望它可以帮助别人。

我尝试以下方法来做到这一点,它工作正常:

  1. 使用setIndicator(“TAB”)仅设置文本。
  2. 使用setBackgroundDrawable( – )来设置图标。

示例代码:

  final TabHost tabHost = (TabHost)findViewById(android.R.id.tabhost); final Resources res = getResources(); int i; tabHost.setup(); //Call setup() before adding tabs if loading TabHost using findViewById(). TabHost.TabSpec ts = tabHost.newTabSpec("trackinfo"); //ts.setIndicator("", res.getDrawable(R.drawable.icon_trackinfo)); ts.setIndicator("Track Information"); ts.setContent(R.id.tabTrackInfo); tabHost.addTab(ts); TabHost.TabSpec ts2 = tabHost.newTabSpec("collection"); //ts2.setIndicator("", res.getDrawable(R.drawable.icon_collection_gray)); ts2.setIndicator("My Collection"); ts2.setContent(R.id.tabMyCollecton); tabHost.addTab(ts2); tabHost.setOnTabChangedListener(new OnTabChangeListener(){ @Override public void onTabChanged(String tabId) { if("trackinfo".equals(tabId)) { // TabWidget tw = (TabWidget)tabHost.findViewById(android.R.id.tabs); View tabView = tw.getChildTabViewAt(0); TextView tv = (TextView)tabView.findViewById(android.R.id.title); tv.setTextColor(TabColor[0]); tabView.setBackgroundDrawable(res.getDrawable(R.drawable.icon_selected)); tabView = tw.getChildTabViewAt(1); tv = (TextView)tabView.findViewById(android.R.id.title); tv.setTextColor(TabColor[1]); tabView.setBackgroundDrawable(res.getDrawable(R.drawable.icon_gray)); } if("collection".equals(tabId)) { // TabWidget tw = (TabWidget)tabHost.findViewById(android.R.id.tabs); View tabView = tw.getChildTabViewAt(0); TextView tv = (TextView)tabView.findViewById(android.R.id.title); tv.setTextColor(TabColor[1]); tabView.setBackgroundDrawable(res.getDrawable(R.drawable.icon_gray)); tabView = tw.getChildTabViewAt(1); tv = (TextView)tabView.findViewById(android.R.id.title); tv.setTextColor(TabColor[0]); tabView.setBackgroundDrawable(res.getDrawable(R.drawable.icon_selected)); } }}); // END OF tabHost.setOnTabChangedListener // After Tabs being added // change font settings TabWidget tw = (TabWidget)tabHost.findViewById(android.R.id.tabs); for(i=0;i<2;i++) { View tabView = tw.getChildTabViewAt(i); TextView tv = (TextView)tabView.findViewById(android.R.id.title); tv.setHeight(25); tv.setTextColor(TabColor[i]); tv.setTypeface(Typeface.SANS_SERIF, Typeface.BOLD_ITALIC); tv.setTextSize(20); tabView.setBackgroundDrawable(res.getDrawable(TabIcon[i])); }