如何更改TabHost中的选项卡图片

27

我正在使用TabHost来开发我的应用程序,该应用程序中有四个选项卡,当特定选项卡被选中或未选中时,我希望在TabHost中使用不同的图像。我需要为每个特定选项卡使用两个不同的图像。

当我选择任何选项卡时,图像会变亮,当我切换到另一个选项卡时,那张明亮的图像会变成灰色的。

我已经实现了TabHost,但是我不知道如何更改TabHost中的图像。

有谁可以帮助我吗?

谢谢, david


1
@Suchismita 这个答案被原帖发布者接受了。这个赏金的目的是什么? - Ron
9个回答

42

如果您希望为选定和未选定状态使用不同的图像,则需要在drawable文件夹中为每个选项卡创建“selector” XML文件,例如tab1_selector.xml、tab2_selector.xml等,文件应包含以下内容,并将可绘制的引用替换为所需的选定和未选定状态的图像。

    <?xml version="1.0" encoding="utf-8"?>
<selector
  xmlns:android="http://schemas.android.com/apk/res/android">
  <item
    android:state_selected="true"
    android:drawable="@drawable/tab1_selected_image" />
  <item
    android:state_selected="false"
    android:drawable="@drawable/tab2_unselected_image" />
</selector>

接着按照bharath上面所写的方法使用 .setIndicator 方法,你需要引用你新建的xml可拉伸资源文件。


16

首先,您必须拥有两张图片,因为您想要从一张图片更改为另一张,所以您需要这两张图片,并且必须将它们放在三个可绘制的文件夹中。

在我的例子中,我有两张图片,一张名为icon1.png,另一张名为icon2.png

之后,在drawable文件夹中创建一个XML文件(所有drawable文件夹都使用相同的文件)。以下是该文件的内容:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!-- When selected, use icon1 -->
<item android:drawable="@drawable/icon1"
      android:state_selected="true" />
<!-- When not selected, use icon2-->
<item android:drawable="@drawable/icon2" />
</selector>
你可以选择哪个图像在选定标签时显示。 在这种情况下,icon1会出现,因为我们在state_selected=true的标签中声明了它。
所以现在,你有了两个图像和三个drawable文件夹中的xml文件。好的!
现在,在声明选项卡的类中,为要添加的每个选项卡添加此行。
tabHost.addTab(tabHost
.newTabSpec("one")
.setIndicator("The Tab",
  res.getDrawable(R.drawable.yourxmlfile))
.setContent(new Intent(this, YourClass.class)));

记住,R.drawable.yourxmlfile 对应于您在drawable文件夹中创建的XML文件。

就是这样!希望这对你有所帮助。


1
一个更完整的答案。谢谢 :) - Sufian
最好和令人愉快的解释.. :) - Subhalaxmi

10

为了设置文本和图标,我们需要使用setIndicator属性。

 tabSpec.setIndicator(Char,Drawable);
 firstTabSpec.setIndicator("First Tab Name", getResources().getDrawable(R.drawable.logo));
 secondTabSpec.setIndicator("Second Tab Name",getResources().getDrawable(R.drawable.logo));

使用此方法为每个选项卡设置单独的图像。


我不想使用文本和图标,我想在选定和未选定的表单上更改选项卡的图像。 - David Brown

6
创建一个选择器XML文件tabicon.xml,并放入以下代码。
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/tab_enbled" android:state_selected="true"/>
    <item android:drawable="@drawable/tab_default" android:state_selected="false"/>
</selector>

现在,请转到您的TabActivity并放置此代码。
TabSpec MyTab = tabhost.newTabSpec("MyTab");
MyTab.setIndicator("", getResources().getDrawable(R.drawable.tabicon));
//note:if you give some text in setIndicator sometimes the icon will not be showed. 
Intent tabIntent = new Intent(this, TabOne.class);
TWTTab.setContent(tabIntent);

2
这段代码展示了如何在选项卡主机中设置图标并设置意图。
  TabHost tabHost = getTabHost();

        // Tab for Photos
        TabSpec photospec = tabHost.newTabSpec("Photos");
        // setting Title and Icon for the Tab
        photospec.setIndicator("", getApplicationContext().getResources().getDrawable(R.drawable.icon_photos_tab));
        Intent photosIntent = new Intent(this, PhotosActivity.class);
        photospec.setContent(photosIntent);

        // Tab for Songs
        TabSpec songspec = tabHost.newTabSpec("Songs");
        songspec.setIndicator("", getApplicationContext().getResources().getDrawable(R.drawable.icon_songs_tab));
        Intent songsIntent = new Intent(this, SongsActivity.class);
        songspec.setContent(songsIntent);


        // Tab for Videos
        TabSpec videospec = tabHost.newTabSpec("Videos");
        videospec.setIndicator("", getApplicationContext().getResources().getDrawable(R.drawable.icon_videos_tab));
        Intent videosIntent = new Intent(this, VideosActivity.class);
        videospec.setContent(videosIntent);

        // Adding all TabSpec to TabHost
        tabHost.addTab(photospec); // Adding photos tab
        tabHost.addTab(songspec); // Adding songs tab
        tabHost.addTab(videospec); // Adding videos tab

2
这个 TabLayout 教程中,当 Tab 被选中和未被选中时使用了不同的图像。
基本上,您需要创建一个Statelist drawable。以下是来自开发者网站的代码:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- When selected, use grey -->
    <item android:drawable="@drawable/ic_tab_artists_grey"
          android:state_selected="true" />
    <!-- When not selected, use white-->
    <item android:drawable="@drawable/ic_tab_artists_white" />
</selector>

还调用了setIndicator(CharSequence, Drawable)来设置选项卡的文本和图标。

1

您可以使用ImageButton,因为它更好,因为ImageView可以被选择和未选择,而ImageButton可以被选择、未选择、按下等其他操作。


0

@Suchismita,你最好使用TextView而不是TabActivity。 我在TabActivity中遇到了以下问题:

  • 我无法在同一选项卡中启动另一个活动,这是我遇到的主要问题

  • 接下来是自定义选项卡视图,我无法更改分隔符可绘制对象。

  • 而且,在ICS中,TabActivity已被弃用

接下来,使用TextView,我发现处理事件和活动流非常容易,在这里,您完全控制应用程序的行为,并且还可以根据需要自定义选项卡的外观和感觉。

你有兴趣知道如何实现吗?


0
如果您想以编程方式更改选项卡的图像,则:
ImageView yourImage= (ImageView)mTabHost.getTabWidget().getChildTabViewAt(youtTabPosition).findViewById(android.R.id.icon);   
yourImage.setImageResource(R.drawable.ic_more_vert_white_24dp);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接