Вкладки ViewPagerIndicator: значки выше текста

Я использую ViewPagerIndicator, и я хотел бы изменить стиль вкладки, чтобы я мог получать значки над текстом, а не по умолчанию, который помещает значок слева, а заголовок справа.

Причина, по которой значки всегда появляются слева, состоит из этой части кода:

if (iconResId != 0) { tabView.setCompoundDrawablesWithIntrinsicBounds(iconResId, 0, 0, 0); } 

Найдено в TabPageIndicator.java

Это часть частного метода ( addTab() ) и поэтому не может быть изменена без изменения самой библиотеки.

К счастью, это не так сложно сделать. Убедитесь, что исходный код ViewPagerIndicator загружен, затем откройте TabPageIndicator.java

Если вы хотите изменить местоположение навсегда (как можно iconResId с изменением исходного кода), измените местоположение iconResId в методе setCompoundDrawablesWithIntrinsicBounds () . Например, для размещения значков в верхней части необходимо, чтобы iconResId был вторым аргументом метода.

 tabView.setCompoundDrawablesWithIntrinsicBounds(0, iconResId, 0, 0); 

Если вам нужно что-то немного более гибкое, я придумал эти изменения (все еще в TabPageIndicator.java ), которые должны работать. Эти изменения были отражены на моем 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 строку в исходном коде библиотеки ViewPageIndicator.

Строка, подлежащая изменению, находится в числе 180 в классе TabPageIndicator внутри метода addTab (по крайней мере, на сегодняшней версии кода 28/05/2013)

Исходный файл

 180 tabView.setCompoundDrawablesWithIntrinsicBounds( iconResId, 0, 0, 0 ); 

И вы должны изменить его на следующее, если хотите, чтобы значок находился поверх текста.

 180 tabView.setCompoundDrawablesWithIntrinsicBounds( 0, iconResId, 0, 0 ); 

Вот скриншот изменения

Введите описание изображения здесь

Как вы, наверное, догадались, вы можете поместить значок в любом месте текста, играя с iconResId в разных аргументах метода setCompoundDrawablesWithIntrinsicBounds .

Существует более чистый способ сделать это без изменения библиотеки. Просто скопируйте и вставьте класс TabPageIndicator в свой проект и измените строки, указанные в других ответах. Затем переименуйте класс в нужное вам положение и используйте его, как если бы он был TabPageIndicator .