我正在使用ViewPagerIndicator 我想更改标签样式,以便我可以在文本上方显示图标,而不是默认设置,将图标放在左侧,标题放在右侧。
答案 0 :(得分:13)
图标总是出现在左边的原因是因为这段代码:
if (iconResId != 0) {
tabView.setCompoundDrawablesWithIntrinsicBounds(iconResId, 0, 0, 0);
}
中找到
这是私有方法(addTab()
)的一部分,因此,如果不修改库本身,则无法更改。
幸运的是,这并不难做到。确保您已下载ViewPagerIndicator
源代码,然后打开TabPageIndicator.java
如果您想永久更改位置(与源代码更改一样永久更改),请在setCompoundDrawablesWithIntrinsicBounds()方法中更改iconResId
的位置。例如,将图标放在顶部需要iconResId
作为方法的第二个参数。
tabView.setCompoundDrawablesWithIntrinsicBounds(0, iconResId, 0, 0);
如果你需要一些更灵活的东西,我想出了应该有效的这些变化(仍在TabPageIndicator.java
中)。这些更改已镜像on my GitHub,因此有一个工作示例。
成员变量:
/**
* Constants to improve readability - no magic numbers.
*/
public final static int LOCATION_LEFT =0;
public final static int LOCATION_UP = 1;
public final static int LOCATION_RIGHT = 2;
public final static int LOCATION_BOTTOM =3;
/**
* Stores the location of the tab icon
*/
private int location = LOCATION_LEFT;
/**
* Used to store the icon.
*/
private int [] drawables = new int [4];
/**
* Holds the value used by setCompoundDrawablesWithIntrinsicBounds used to denote no icon.
*/
private static int NO_ICON = 0;
添加此方法:
public void setTabIconLocation (int newLocation){
if (location > LOCATION_BOTTOM || location < LOCATION_LEFT)
throw new IllegalArgumentException ("Invalid location");
this.location = newLocation;
for (int x = 0; x < drawables.length;x++){
drawables [x] = NO_ICON;
}
}
在addTab()
中,更改
if (iconResId != 0) {
tabView.setCompoundDrawablesWithIntrinsicBounds(iconResId, 0, 0, 0);
}
到
if (iconResId != 0) {
drawables [location] = iconResId;
tabView.setCompoundDrawablesWithIntrinsicBounds(drawables[0], drawables[1], drawables[2], drawables[3]);
}
非库实现(取自提供的示例代码)
TabPageIndicator indicator = (TabPageIndicator)findViewById(R.id.indicator);
indicator.setTabIconLocation (TabPageIndicator.LOCATION_UP);
indicator.setViewPager(pager);
答案 1 :(得分:8)
您可以通过仅修改ViewPageIndicator库源代码中的1行来实现此效果。
要修改的行位于180
方法内的TabPageIndicator
类中的addTab
个数字(至少在今天的代码28/05/2013版本中)
原始文件是
180 tabView.setCompoundDrawablesWithIntrinsicBounds( iconResId, 0, 0, 0 );
如果您希望图标位于文本顶部,则应将其修改为以下内容。
180 tabView.setCompoundDrawablesWithIntrinsicBounds( 0, iconResId, 0, 0 );
以下是更改的屏幕截图
正如您现在可能已经猜到的那样,您可以通过在setCompoundDrawablesWithIntrinsicBounds
方法的不同参数中使用iconResId将图标放在文本的任何位置。
答案 2 :(得分:0)
有一种更简洁的方法可以在不修改库的情况下完成。只需将类TabPageIndicator复制并粘贴到项目中,然后修改其他答案中指出的行。然后将类重命名为您喜欢的任何内容,并将其用作TabPageIndicator
。