Intereting Posts
Я продолжаю получать сообщение об ошибке «Невозможно преобразовать из int в Drawable». Я пытаюсь назначить изображение местам. Есть ли способ обойти это? Как читать свойства, определенные в local.properties в build.gradle Android – как я могу узнать, когда gridview достиг дна? Способ получить разблокировку в андроиде? Android-соединение не может подключаться Как Ionic решает, какой Android-эмулятор запускать? Смена активности со скольжением пальца Скопируйте содержимое холста на другой холст, похожий на приложение amaziograph iphone Зависимости AndroidTestCompile, не признанные в импорте Каким должен быть размер значка пусковой установки по умолчанию Аналитика Google «ПОЛУЧИТЬ ФАЙЛ КОНФИГУРАЦИИ» не позволяет мне выбрать мою учетную запись Отображать отображаемое изображение с URL-адреса в ListView Совместное использование объектов домена между действиями Получить имена файлов из каталога на Android Поверхность :: setbuffersDimensions Лог, находящийся в спаме

Как изменить индикатор tablayout сверху вниз?

Я хочу изменить индикатор tablayout снизу вверх.

Мой код

activity_tab.xml

<android.support.design.widget.AppBarLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary" app:layout_scrollFlags="scroll|enterAlways" app:popupTheme="@style/ThemeOverlay.AppCompat.Light" /> <android.support.design.widget.TabLayout android:id="@+id/tabs" android:layout_width="match_parent" android:layout_height="wrap_content" app:tabIndicatorColor="#000000" app:tabMode="scrollable" /> </android.support.design.widget.AppBarLayout> <android.support.v4.view.ViewPager android:id="@+id/viewpager" android:layout_width="match_parent" android:layout_height="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior" /> 

Я хочу этот результат.

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

как сделать

Thx для меня спросить и извините за плохой английский.

К сожалению, вы не можете сделать это, установив атрибут или установив его в код. TabLayout имеет свойство mTabStrip для SlidingTabStrip (внутренний класс), которое задано как private final

 private final SlidingTabStrip mTabStrip; 

, Поэтому вы не можете получить к нему доступ, расширив TabLayout.

Таким образом, SlidingTabStrip (который расширяет LinearLayoyut) представляет собой представление, которое переопределяет метод draw

 @Override public void draw(Canvas canvas) { super.draw(canvas); // Thick colored underline below the current selection if (mIndicatorLeft >= 0 && mIndicatorRight > mIndicatorLeft) { canvas.drawRect(mIndicatorLeft, getHeight() - mSelectedIndicatorHeight, mIndicatorRight, getHeight(), mSelectedIndicatorPaint); } } 

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

Возможно, в будущем у них будет флаг, чтобы изменить его.

Это невозможно сделать с помощью атрибута xml, но это можно сделать, установив изображение в фоновом режиме вкладки с заполненным цветом сверху и прозрачным снизу.

  <android.support.design.widget.TabLayout ... app:tabBackground="@drawable/bg_tab" ... /> 

bg_tab.xml

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

cap.png

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

Прозрачный снизу

Это можно сделать с помощью атрибута xml, использовать android:scaleY="-1" в коде xml. Вид будет переворачиваться вертикально. Используйте тот же метод, чтобы исправить текст и изображение, используемые в заголовке табуляции.

В файле xml:

 <android.support.design.widget.TabLayout android:id="@+id/tabLayout" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="?attr/colorPrimary" android:minHeight="?attr/actionBarSize" android:scaleY="-1" android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"/> 

В коде Java

 tabLayout = (TabLayout) findViewById(R.id.tabLayout); // Adding the tabs using addTab() method tabLayout.addTab(tabLayout.newTab().setText("Section 1")); tabLayout.addTab(tabLayout.newTab().setText("Section 2")); tabLayout.addTab(tabLayout.newTab().setText("Section 3")); tabLayout.setTabGravity(TabLayout.GRAVITY_FILL); TextView tv1 = (TextView)(((LinearLayout)((LinearLayout)tabLayout.getChildAt(0)).getChildAt(0)).getChildAt(1)); tv1.setScaleY(-1); TextView tv2 = (TextView)(((LinearLayout)((LinearLayout)tabLayout.getChildAt(0)).getChildAt(1)).getChildAt(1)); tv2.setScaleY(-1); TextView tv3 = (TextView)(((LinearLayout)((LinearLayout)tabLayout.getChildAt(0)).getChildAt(2)).getChildAt(1)); tv3.setScaleY(-1); 

Пример скриншота

У меня есть другой подход для этого.

  1. Установите цвет индикатора табуляции так же, как цвет фона макета вкладки (чтобы вы не увидели индикатор вкладки внизу)

  2. Добавьте линейный макет (горизонтальный) чуть выше макета вкладки, содержащий представления (то же число, что и количество вкладок).

<LinearLayout android:layout_width="match_parent" android:layout_height="5dp" android:orientation="horizontal" android:background="@color/tab_bg" android:weightSum="3">

 <View android:id="@+id/view1" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:elevation="10dp" android:background="@drawable/selector_tab_indicator_white"/> <View android:id="@+id/view2" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:elevation="10dp" android:background="@drawable/selector_tab_indicator_blue"/> <View android:id="@+id/view3" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:elevation="10dp" android:background="@drawable/selector_tab_indicator_blue"/> 

</LinearLayout>

  1. Теперь просто программно настройте фоновые изображения.

    viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

     } @Override public void onPageSelected(int position) { setTitle(getPageTitle(position)); switch(position){ case 0: view1.setBackgroundResource( R.drawable.selector_tab_indicator_white ); view2.setBackgroundResource( R.drawable.selector_tab_indicator_blue ); view3.setBackgroundResource( R.drawable.selector_tab_indicator_blue ); break; case 1: view1.setBackgroundResource( R.drawable.selector_tab_indicator_blue ); view2.setBackgroundResource( R.drawable.selector_tab_indicator_white ); view3.setBackgroundResource( R.drawable.selector_tab_indicator_blue ); break; case 2: view1.setBackgroundResource( R.drawable.selector_tab_indicator_blue ); view2.setBackgroundResource( R.drawable.selector_tab_indicator_blue ); view3.setBackgroundResource( R.drawable.selector_tab_indicator_white ); break; default: view1.setBackgroundResource( R.drawable.selector_tab_indicator_white ); view2.setBackgroundResource( R.drawable.selector_tab_indicator_blue ); view3.setBackgroundResource( R.drawable.selector_tab_indicator_blue ); break; } } @Override public void onPageScrollStateChanged(int state) { } 

    });

Используйте эти селекторы для настройки представлений

selector_tab_indicator_white.xml

 <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <corners android:radius="50dp"/> <stroke android:width="1dp" android:color="#c4c0c0" /> <solid android:color="#fafafa" /> 1 <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <corners android:radius="50dp"/> <stroke android:width="1dp" android:color="#c4c0c0" /> <solid android:color="#fafafa" /> 

selector_tab_indicator_blue.xml

 <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <corners android:radius="0dp"/> <stroke android:width="1dp" android:color="@color/tab_bg" /> <solid android:color="@color/tab_bg" /> 1 <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <corners android:radius="0dp"/> <stroke android:width="1dp" android:color="@color/tab_bg" /> <solid android:color="@color/tab_bg" /> 

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

Я знаю, что этот вопрос задавали два года назад, но я не нашел простого решения без использования какой-либо библиотеки (smartTabLayout не имеет свойства SelectedTextColour).

Инвертируйте tabLayout, чтобы получить индикатор наверху
android:rotationX="180"
Теперь это приведет к тому, что текст на этой вкладке также будет инвертирован, поэтому чтобы противостоять этому
Мы должны создать пользовательский вид табуляции. Создайте файл xml, например: layout_custom_tab

 <TextView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/tab.text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center" android:maxLines="1" android:padding="10dp" android:rotationX="180" android:textAllCaps="true" android:textSize="12sp" android:textColor="@color/white" /> 

Примечание: вам не требуется RelativeLayout или anything else, когда есть только один элемент

Создайте свой собственный TabLayout и установите для него customView.

 public class TabLayoutPlus extends TabLayout { public TabLayoutPlus(Context context) { super(context); } public TabLayoutPlus(Context context, AttributeSet attrs) { super(context, attrs); } public TabLayoutPlus(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @Override public void setupWithViewPager(ViewPager viewPager) { super.setupWithViewPager(viewPager); this.removeAllTabs(); PagerAdapter adapter = viewPager.getAdapter(); for (int i = 0, count = adapter.getCount(); i < count; i++) { Tab tab = this.newTab(); View customView = LayoutInflater.from(getContext()).inflate(R.layout.layout_custom_tab, null); TextViewPlus tv = (TextViewPlus) customView.findViewById(R.id.tab_text); tv.setText(adapter.getPageTitle(i)); tab.setCustomView(customView); this.addTab(tab.setText(adapter.getPageTitle(i))); } } } 

Ваш TabLayout в вашей деятельности будет выглядеть следующим образом:

 <TabLayoutPlus android:id="@+id/tablayout" android:layout_width="match_parent" android:layout_height="36dp" android:layout_above="@+id/camera.buttons.layout" android:layout_centerHorizontal="true" android:background="@color/cardscan.background" android:rotationX="180" app:tabGravity="center" app:tabIndicatorColor="@color/colorPrimary" app:tabMode="fixed" app:tabSelectedTextColor="@color/colorPrimary" app:tabTextColor="@color/white" /> 

Если вам нужно выделить выделенный цвет текста вкладки

 private void setSelectedTab(TabLayoutPlus.Tab tab) { View view = tab.getCustomView(); TextViewPlus tabtext = (TextViewPlus) view.findViewById(R.id.tab_text); tabtext.setTextColor(ContextCompat.getColor(this, R.color.colorPrimary)); // color you want to highlight your text with } private void setUnselectedTab(TabLayoutPlus.Tab tab){ View view = tab.getCustomView(); TextViewPlus tabtext = (TextViewPlus) view.findViewById(R.id.tab_text); tabtext.setTextColor(ContextCompat.getColor(this, R.color.white)); // color you want to lowlight your text with } 

Теперь просто добавьте OnTabSelectedListener

 tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { @Override public void onTabSelected(TabLayout.Tab tab) { setSelectedTab(tab); } @Override public void onTabUnselected(TabLayout.Tab tab) { setUnselectedTab(tab); } @Override public void onTabReselected(TabLayout.Tab tab) { setSelectedTab(tab); } }); 

Вы можете добиться этого, повернув TabLayout следующим образом:

 tabLayout.setRotationX(180); 

Затем вы должны повернуть все свои дети TextView, или вы можете настроить TabLayout для пользовательского представления вместо рекурсивного поиска TextView:

 TabLayout.Tab tab = tabLayout.getTabAt(i); tab.setCustomView(R.layout.layout_tab_view); 

layout_tab_view.xml

  <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:rotationX="180" android:text="HOME"/> 

Я думаю, вы потеряете некоторые функции по умолчанию, если вы настроили пользовательский вид, например, название названия фрагмента из PagerAdapter и отключенного внешнего вида TextView, но вы можете связать это каким-то образом другим способом.

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

Вам нужны только эти линии

 tabLayout.setRotationX(180); tabListed = ((LinearLayout)tabLayout.getChildAt(0)); for(int position = 0;position<tabListed.getChildCount();position++) { LinearLayout item=((LinearLayout) tabListed.getChildAt(position)); item.setBackground(getDrawable(R.drawable.square_tab)); item.setRotationX(180); } 

Первый шаг поворота вкладки поворота 180º, тогда вы получите все вкладки, и они повернут на 180º. Поэтому они снова будут хорошими.

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

Поскольку AppBarLayout является расширением LinearLayout, попробуйте изменить порядок TabLayout & Toolbar, как этот

  <android.support.design.widget.TabLayout android:id="@+id/tabs" android:layout_width="match_parent" android:layout_height="wrap_content" app:tabIndicatorColor="#000000" app:tabMode="scrollable" /> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary" app:layout_scrollFlags="scroll|enterAlways" app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />