所以我的应用程序是RTL,有了这个,标签现在从右到左排序..!
..但是当我在标签之间滑动滑动时,它与常识相矛盾,所以我想要扭转它......!看图片看问题..!
我想要的是......! >当我在Tab1然后我从左向右滑动时我想让它滑到Tab 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)));
}
}
我的包含Tablayout的活动,有三个片段,每个片段一个。
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);
}
}
更新
@regev avraham
以相反的顺序添加选项卡,然后使用
viewPager.setCurrentItem(adapter.getCount() - 1);
选择最后一个 标签
根据您的评论,这是我在具有tablayout
的活动中所做的 //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);
答案 0 :(得分:3)
你可以查看这个Lib
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" />
答案 1 :(得分:2)
如果minSdkVersion
为17岁以上,您可以对标签布局执行此操作:
TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
tabLayout.setLayoutDirection(View.LAYOUT_DIRECTION_RTL);
答案 2 :(得分:2)
这有点棘手,android viewPager从右到左有一个小bug,只有页面标题是从右到左,而页面本身没有。
为了解决这个问题,我所做的是使用常规的从左到右的布局并按相反的顺序添加标签,然后使用viewPager.setCurrentItem(adapter.getCount() - 1);
选择最后一个标签。
这是结果的样子: https://drive.google.com/open?id=0B0FzrLgjet7pSE9lMFFFT0JiekE
其中size是第一个标签,显示是第二个,依此类推
要保持RTL行为和LTR行为,您应该使用它:
Configuration config = getResources().getConfiguration();
if (config.getLayoutDirection() == View.LAYOUT_DIRECTION_RTL)
{
//use the RTL trick here
}
else
{
//use the regular case here
}
答案 3 :(得分:1)
我在开发 RTL 应用时遇到了这个问题。这是要做的事情:
tabs
:tabLayout.addTab(tabLayout.newTab()。setText(“ Tab2”); tabLayout.addTab(tabLayout.newTab()。setText(“ Tab1”);
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; } }
OnCreate
处选择最后一个标签索引:TabLayout.Tab tab = tabLayout.getTabAt(1); tab.select();
TabLayout
的方向设置为LTR:if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { tabLayout.setLayoutDirection(View.LAYOUT_DIRECTION_LTR); }
onTabSelected
事件应如下所示:public void onTabSelected(TabLayout.Tab tab) { viewPager.setCurrentItem(tab.getPosition()); }
效果很好。
答案 4 :(得分:1)
现在,您可以使用类似的小部件(支持RTL分页滑动)以高效的方式进行操作。 它将根据系统本地自动更改滑动方向,也可以手动设置。
Android开发了一个名为ViewPager2
ViewPager2
是ViewPager
的改进版本,它提供了 增强功能并解决使用中的常见困难ViewPager
。
您可以按照以下简单步骤创建与ViewPager2
集成的TabLayout
。
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>
创建名称为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;
}
}
在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();
}
}
我使用的这些资源(您可以阅读以了解更多详细信息):
我希望对此有所帮助。
答案 5 :(得分:0)
最简单的方法是使用这一行代码:
tabLayout.setLayoutDirection(View.LAYOUT_DIRECTION_LTR);
对于选项卡的RTL排序,您应该在寻呼机中执行此操作:
viewPager.setCurrentItem(adapter.getCount());
感谢:arash-hatemi