Android Material 设计右对齐选项卡
Android Material Design Right Alignment Tab
我想制作一个带有类似休闲图片标签的应用程序,标签位于右侧。不幸的是,我尝试了很多方法 none ,但它们都奏效了。请一些 body 帮助。
更新
我的activity:
public class MainActivity extends AppCompatActivity {
private Toolbar toolbar;
private TabLayout tabLayout;
private ViewPager viewPager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_main);
toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
tabLayout = (TabLayout) findViewById(R.id.tabs);
viewPager = (ViewPager) findViewById(R.id.viewpager);
viewPager.setAdapter(adapter);
tabLayout.setupWithViewPager(viewPager);
}
//
static int count = 1;
ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
public void addTab(View v){
Bundle bundle = new Bundle();
bundle.putInt("index", count);
MyFragment fragment = new MyFragment();
fragment.setArguments(bundle);
adapter.addFragment(fragment, "Tab "+count++);
TabLayout.Tab tab = tabLayout.getTabAt(adapter.getCount()-1);
tab.select();
}
//
public void delTab(View v){
int index = tabLayout.getSelectedTabPosition();
adapter.removeFragment(index);
}
//
class ViewPagerAdapter extends FragmentStatePagerAdapter {
private final List<Fragment> mFragmentList = new ArrayList<>();
private final List<String> mFragmentTitleList = new ArrayList<>();
public ViewPagerAdapter(FragmentManager manager) {
super(manager);
}
@Override
public Fragment getItem(int position) {
return mFragmentList.get(position);
}
@Override
public int getCount() {
return mFragmentList.size();
}
//
public void addFragment(Fragment fragment, String title) {
mFragmentList.add(fragment);
mFragmentTitleList.add(title);
notifyDataSetChanged();
}
//
public void removeFragment(int position){
mFragmentTitleList.remove(position);
mFragmentList.remove(position);
notifyDataSetChanged();
}
@Override
public int getItemPosition(Object object) {
return PagerAdapter.POSITION_NONE;
}
@Override
public CharSequence getPageTitle(int position) {
return mFragmentTitleList.get(position);
}
}
}
我可以 add/remove 标签页。它工作完美,但我不知道如何将标签 rtl 和标签 1 放置在右侧。
有很多技巧可以解决这个问题:
如果仅希望通过反转标题顺序并在 fragment/Activity 的首次加载中调用 viewPager.setCurrentItem(adapter.size()-1)
来支持 RTL 语言,您的问题将得到解决。
你的 FragmentAdapter
应该是这样的:
public class PagerAdapter extends FragmentPagerAdapter {
private static final int POSITION_HOME = 4; //first item from right
private static final int POSITION_CATEGORIES = 3;
public PagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
switch (position) {
case POSITION_HOME:
return HomeFragment.newInstance();
case POSITION_CATEGORIES:
return CategoryFragment.newInstance();
//other fragment
}
}
@Override
public int getCount() {
return 4;
}
@Override
public CharSequence getPageTitle(int position) {
switch (position) {
case POSITION_HOME:
return "HOME";
case POSITION_CATEGORIES:
return "CATEGORY";
//other title
}
}
}
但是,如果您在运行时更改应用程序的位置,以前的方法会很痛苦。所以更好的选择是使用以下代码两次更改应用程序的布局方向:
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1){
getWindows().getDecorView().setLayoutDirection(View.LAYOUT_DIRECTION_RTL);
}
或
更改语言环境并重新创建 activity:
Locale.setDefault(new Locale("fa"));
编辑: 正如您在评论中提到的那样,您需要 dynamic FragmentPager 以便您可以对您应用相同的逻辑 FragmentPager
(稍作修改)。
我想制作一个带有类似休闲图片标签的应用程序,标签位于右侧。不幸的是,我尝试了很多方法 none ,但它们都奏效了。请一些 body 帮助。
更新
我的activity:
public class MainActivity extends AppCompatActivity {
private Toolbar toolbar;
private TabLayout tabLayout;
private ViewPager viewPager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_main);
toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
tabLayout = (TabLayout) findViewById(R.id.tabs);
viewPager = (ViewPager) findViewById(R.id.viewpager);
viewPager.setAdapter(adapter);
tabLayout.setupWithViewPager(viewPager);
}
//
static int count = 1;
ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
public void addTab(View v){
Bundle bundle = new Bundle();
bundle.putInt("index", count);
MyFragment fragment = new MyFragment();
fragment.setArguments(bundle);
adapter.addFragment(fragment, "Tab "+count++);
TabLayout.Tab tab = tabLayout.getTabAt(adapter.getCount()-1);
tab.select();
}
//
public void delTab(View v){
int index = tabLayout.getSelectedTabPosition();
adapter.removeFragment(index);
}
//
class ViewPagerAdapter extends FragmentStatePagerAdapter {
private final List<Fragment> mFragmentList = new ArrayList<>();
private final List<String> mFragmentTitleList = new ArrayList<>();
public ViewPagerAdapter(FragmentManager manager) {
super(manager);
}
@Override
public Fragment getItem(int position) {
return mFragmentList.get(position);
}
@Override
public int getCount() {
return mFragmentList.size();
}
//
public void addFragment(Fragment fragment, String title) {
mFragmentList.add(fragment);
mFragmentTitleList.add(title);
notifyDataSetChanged();
}
//
public void removeFragment(int position){
mFragmentTitleList.remove(position);
mFragmentList.remove(position);
notifyDataSetChanged();
}
@Override
public int getItemPosition(Object object) {
return PagerAdapter.POSITION_NONE;
}
@Override
public CharSequence getPageTitle(int position) {
return mFragmentTitleList.get(position);
}
}
}
我可以 add/remove 标签页。它工作完美,但我不知道如何将标签 rtl 和标签 1 放置在右侧。
有很多技巧可以解决这个问题:
如果仅希望通过反转标题顺序并在 fragment/Activity 的首次加载中调用 viewPager.setCurrentItem(adapter.size()-1)
来支持 RTL 语言,您的问题将得到解决。
你的 FragmentAdapter
应该是这样的:
public class PagerAdapter extends FragmentPagerAdapter {
private static final int POSITION_HOME = 4; //first item from right
private static final int POSITION_CATEGORIES = 3;
public PagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
switch (position) {
case POSITION_HOME:
return HomeFragment.newInstance();
case POSITION_CATEGORIES:
return CategoryFragment.newInstance();
//other fragment
}
}
@Override
public int getCount() {
return 4;
}
@Override
public CharSequence getPageTitle(int position) {
switch (position) {
case POSITION_HOME:
return "HOME";
case POSITION_CATEGORIES:
return "CATEGORY";
//other title
}
}
}
但是,如果您在运行时更改应用程序的位置,以前的方法会很痛苦。所以更好的选择是使用以下代码两次更改应用程序的布局方向:
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1){
getWindows().getDecorView().setLayoutDirection(View.LAYOUT_DIRECTION_RTL);
}
或
更改语言环境并重新创建 activity:
Locale.setDefault(new Locale("fa"));
编辑: 正如您在评论中提到的那样,您需要 dynamic FragmentPager 以便您可以对您应用相同的逻辑 FragmentPager
(稍作修改)。