Как изменить пролистывание вьюпейджера

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

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

Чего я хочу, так это..! > когда я на вкладке 1, а затем прокручиваю слева направо, я хочу, чтобы он переместился на вкладку 2 и так далее ..!

это возможно..!?

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

КОД


Мой клиент ViewPager

public class CustomViewPager extends android.support.v4.view.ViewPager{
private boolean enabled;

public CustomViewPager(Context context, AttributeSet attrs) {
    super(context, attrs);
    this.enabled = true;
}


@Override
public boolean onTouchEvent(MotionEvent event) {
    if (this.enabled) {
        return super.onTouchEvent(event);
    }

    return false;
}

@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
    if (this.enabled) {
        return super.onInterceptTouchEvent(event);
    }

    return false;
}

public void setPagingEnabled(boolean enabled) {
    this.enabled = enabled;
 }
 }

Моя TabActivity (вспомогательный класс)

  public class TabbedActivity extends BaseActivity { 

 //I extend BaseActivity to avoid repeating UI code like toolbar and stuff..

protected CustomViewPager viewPager;
public OrdersAdapter adapter;
public TabLayout tabs;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    tabs.setTabGravity(TabLayout.GRAVITY_FILL);
    viewPager.setAdapter(adapter);
    viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabs));


    tabs.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {

        @Override
        public void onTabSelected(TabLayout.Tab tab) {
            setTabSelected(tab);
        }


        @Override
        public void onTabUnselected(TabLayout.Tab tab) {

        }

        @Override
        public void onTabReselected(TabLayout.Tab tab) {

        }
    });
  }


public void setTabSelected(TabLayout.Tab tab) {
    viewPager.setCurrentItem(tab.getPosition());
}

public void addTab(int title) {

    tabs.addTab(tabs.newTab().setText(getString(title)));

}

}

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

public class MyOrders extends TabbedActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    setContentView(R.layout.activity_orders);

    tabs = (TabLayout) findViewById(R.id.tab_layout);
    addTab(R.string.NewOrderTabTitle); //tab1
    addTab(R.string.MyOrderTabTitle); // tab2
    addTab(R.string.FinOrderTabTitle); //tab3

     adapter = new OrdersAdapter(getSupportFragmentManager(), tabs.getTabCount());
    viewPager = (CustomViewPager) findViewById(R.id.pager);
    viewPager.setPagingEnabled(true);

    tabs.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
        @Override
        public void onTabSelected(TabLayout.Tab tab) {
            viewPager.setCurrentItem(tab.getPosition());

        }

        @Override
        public void onTabUnselected(TabLayout.Tab tab) {

        }

        @Override
        public void onTabReselected(TabLayout.Tab tab) {

        }
    });

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

        @Override
        public void onPageSelected(int position) {

        }

        @Override
        public void onPageScrollStateChanged(int state) {

        }
    });

    super.onCreate(savedInstanceState);


 }
}

Обновить


@регев авраам

добавляя вкладки в обратном порядке, а затем используйте viewPager.setCurrentItem(adapter.getCount() - 1);, чтобы выбрать последнюю вкладку.

на основе вашего комментария, вот что я сделал в действии с вкладками

 //code...
 tabs = (TabLayout) findViewById(R.id.tab_layout);
    addTab(R.string.FinOrderTabTitle); //tab3
    addTab(R.string.MyOrderTabTitle); // tab2
    addTab(R.string.NewOrderTabTitle); //tab1
 //code...

 viewPager.setCurrentItem(adapter.getCount() - 1);

person Alaa AbuZarifa    schedule 13.05.2017    source источник


Ответы (6)


Это немного сложно, android viewPager справа налево имеет небольшую ошибку, только заголовки страниц справа налево, а сами страницы - нет.

Чтобы исправить это, я использовал обычную раскладку слева направо и добавлял вкладки в обратном порядке, а затем использовал viewPager.setCurrentItem(adapter.getCount() - 1); для выбора последней вкладки.

Вот как должен выглядеть результат: https://drive.google.com/open?id=0B0FzrLgjet7pSE9lMFFFT0JiekE

где size — первая вкладка, display — вторая и так далее

Чтобы сохранить поведение RTL и поведение LTR, вы должны использовать это:

Configuration config = getResources().getConfiguration();
if (config.getLayoutDirection() == View.LAYOUT_DIRECTION_RTL)
{
     //use the RTL trick here
}
else
{
     //use the regular case here
}
person regev avraham    schedule 13.05.2017
comment
Я сделал это, но это только записало положение моих вкладок и не отменило пролистывание.! Можете ли вы показать мне, какой именно код нужно изменить.! - person Alaa AbuZarifa; 13.05.2017
comment
Не могли бы вы добавить, что вы сделали? Это решение сработало для моего приложения. - person regev avraham; 13.05.2017
comment
Я обновляю свой ответ видео, которое показывает желаемое поведение. Это то, чего вы хотите достичь? - person regev avraham; 14.05.2017
comment
ДА.. это именно то, что я хочу, но я сделал то, что вы сказали, и это не сработало, поэтому я, скорее всего, что-то упустил, не могли бы вы проверить классы выше и посмотреть, что нужно изменить и где именно, я действительно может использовать помощь.! - person Alaa AbuZarifa; 15.05.2017
comment
Вы забыли установить направление макета вкладок слева направо, а не справа налево? - person regev avraham; 15.05.2017
comment
Это сработало, но осталась одна последняя проблема...! каждый раз, когда запускается действие, содержащее 3 вкладки, по умолчанию открывается вкладка 3, а не 1..? как я могу это решить..!? - person Alaa AbuZarifa; 16.05.2017
comment
Обновил мой ответ. - person regev avraham; 16.05.2017

вы можете проверить эту библиотеку

https://github.com/diego-gomez-olvera/RtlViewPager

и реализовать, как показано ниже

dependencies {
...
compile 'com.booking:rtlviewpager:1.0.1'
}

просто добавьте это вместо Viewpager

<com.booking.rtlviewpager.RtlViewPager
        android:id="@+id/pager"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
person android cat    schedule 13.05.2017
comment
Я не могу этого сделать, я не хочу использовать библиотеку для этого. Я надеялся найти решение без этого ..! - person Alaa AbuZarifa; 14.05.2017
comment
Спасибо. Отличная библиотека. Работает отлично. - person rajath; 26.07.2019

Я столкнулся с этой проблемой при разработке приложения RTL. Вот что нужно сделать:

  1. Добавьте tabs в обратном порядке:

tabLayout.addTab(tabLayout.newTab().setText("Tab2"); tabLayout.addTab(tabLayout.newTab().setText("Tab1");

  1. Настройте адаптер ViewPager, чтобы он возвращал Fragments в обратном порядке:
public Fragment getItem(int position) {
    switch (position) {
        case 0:
            Fragment2 f2 = new Fragment2();
            return f2;
        case 1:
            Fragment1 f1 = new Fragment1();
            return f1;
        default:
            return null;
    }
}
  1. Выберите индекс последней вкладки в OnCreate :
TabLayout.Tab tab = tabLayout.getTabAt(1);
tab.select();
  1. Установите направление TabLayout на LTR:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
    tabLayout.setLayoutDirection(View.LAYOUT_DIRECTION_LTR);
}
  1. И, наконец, ваше событие onTabSelected должно выглядеть так:
public void onTabSelected(TabLayout.Tab tab) {
    viewPager.setCurrentItem(tab.getPosition());
}

Это работает хорошо.

person Mr Brigante    schedule 26.11.2018

Если вашему minSdkVersion 17+, вы можете сделать это с макетом вкладки:

TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
tabLayout.setLayoutDirection(View.LAYOUT_DIRECTION_RTL);
person Veneet Reddy    schedule 13.05.2017
comment
это не сработало, ничего не изменилось, когда я добавил эту строку.! - person Alaa AbuZarifa; 13.05.2017

Теперь вы можете сделать это более эффективно с помощью аналогичного виджета (поддерживает пролистывание по страницам RTL). Он автоматически изменит направление прокрутки в соответствии с локальной системой, или вы можете установить его вручную.

Android разработал новый виджет под названием ViewPager2

ViewPager2 — это улучшенная версия ViewPager, предлагающая расширенные функциональные возможности и устраняющая распространенные трудности при использовании ViewPager.

Вы можете выполнить эти простые шаги, чтобы создать ViewPager2, интегрированный с TabLayout.

  1. в layout_main.xml используйте этот код:

    <?xml version="1.0" encoding="utf-8"?>
    <androidx.coordinatorlayout.widget.CoordinatorLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    
     <com.google.android.material.appbar.AppBarLayout
         android:id="@+id/app_bar_layout"
         android:layout_width="match_parent"
         android:layout_height="wrap_content">
    
        <androidx.appcompat.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            app:title="@string/app_name">
        </androidx.appcompat.widget.Toolbar>
    
        <com.google.android.material.tabs.TabLayout
            android:id="@+id/tabs"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@color/colorPrimary" />
    
    </com.google.android.material.appbar.AppBarLayout>
    
    <androidx.viewpager2.widget.ViewPager2
        android:id="@+id/view_pager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layoutDirection="locale"
        app:layout_behavior="@string/appbar_scrolling_view_behavior" />
    
    </androidx.coordinatorlayout.widget.CoordinatorLayout>
    
  2. Создайте класс адаптера с именем PagerAdapter:

    public class PagerAdapter extends FragmentStateAdapter {
        public PagerAdapter(FragmentActivity fm) {
            super(fm);
        }
    
        @NonNull
        @Override
        public Fragment createFragment(int position) {
            switch (position) {
                case 0:
                    return YourFragment1.newInstance();
                case 1:
                    return YourFragment2.newInstance();
            }
            return null;
        }
    
        @Override
        public int getItemCount() {
            return 2;
        }
    }
    
  3. В MainActivity (используя привязку представления для получения представлений из xml файлов):

    public class MainActivity extends AppCompatActivity {
         //Tabs titles
         private static final int[] TAB_TITLES = new int[]{R.string.tab_text_1, R.string.tab_text_2};
         //Binding object
         private ActivityMainBinding binding;
    
         @Override
         protected void onCreate(Bundle savedInstanceState) {
             super.onCreate(savedInstanceState);
             //Inflate layout
             binding = ActivityMainBinding.inflate(getLayoutInflater());
             View view = binding.getRoot();
             setContentView(view);
    
             //Get TabLayout View
             TabLayout tabs = binding.tabs;
             //Get the viewPager View
             ViewPager2 viewPager = binding.viewPager;
    
             //Adapter for ViewPager
             PagerAdapter pagerAdapter = new PagerAdapter(this);
             //Set Adapter for ViewPager
             viewPager.setAdapter(pagerAdapter);
    
             //Integrate TabLayout with ViewPager
             //i use it to get tabs titles
             new TabLayoutMediator(tabs, viewPager, new TabLayoutMediator.TabConfigurationStrategy() {
                 @Override
                 public void onConfigureTab(@NonNull TabLayout.Tab tab, int position) {
                     //set the title for the tab at position index
                     tab.setText(getResources().getString(TAB_TITLES[position]));
                 }
             }).attach();
         }
    }
    

Эти ресурсы, которые я использовал (вы можете прочитать для более подробной информации):

Надеюсь, я помог с этим.

person Ali Alnadous    schedule 29.10.2020

Самый простой способ - использовать эту одну строку кода:

tabLayout.setLayoutDirection(View.LAYOUT_DIRECTION_LTR);

для RTL-упорядочивания ваших вкладок вы должны сделать это в пейджере:

viewPager.setCurrentItem(adapter.getCount());

спасибо: arash-hatemi

person Rezasys    schedule 27.02.2018