Fragments/ViewPager 的 ActionBar 标题 - 为错误的片段显示的标题
ActionBar Title with Fragments/ViewPager - Title shown for wrong Fragment
我已经四处寻找了几天,试图解决这个问题,但我似乎无法将其缩小到我的具体问题。
我有一个使用 4 个片段的应用程序,通常是 FragmentPagerAdapter、TabLayout 等。我正在使用普通的 ActionBar 并想更新 ActionBar 的标题以反映我正在使用 4 个片段中的哪一个当前。
我已经实施了某人更改标题的解决方案,但它并没有真正奏效:
((MainActivity) getActivity()).setActionBarTitle("Locations");
使用上面的代码,出于某种我无法理解的奇怪原因,标题总是针对我当前所在的下一个片段!所以当我在 "Food" 片段上时,标题显示 "Photos",这是它之后的下一个片段的标题。我已尝试将此代码放入每个片段的 onCreateView()、onActivityCreated() 和 onResume() 中,但结果是相同的 - 标题不是正确的片段。
我将使用我当前的代码,以便有希望地发现任何问题...
注意:我不想更改 TabLayout 中每个选项卡的标题,因为我为它们设置了图标,我只想更改与当前显示的 Fragment 相关的 ActionBar 的标题. :)
FragmentPagerAdapter:
public class CategoryAdapter extends FragmentPagerAdapter {
private Context mContext;
public CategoryAdapter(Context context, FragmentManager fm) {
super(fm);
mContext = context;
}
@Override
public Fragment getItem(int position) {
if (position == 0) {
return new Locations();
} else if (position == 1) {
return new Food();
} else if (position == 2) {
return new Photos();
} else {
return new History();
}
}
@Override
public int getCount() {
return 4;
}
@Override
public CharSequence getPageTitle(int position) {
return null;
}
}
MainActivityclass:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager);
CategoryAdapter adapter = new CategoryAdapter(this, getSupportFragmentManager());
viewPager.setAdapter(adapter);
TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
int[] imageResId = {
R.drawable.ic_place_white_48dp,
R.drawable.ic_restaurant_white_48dp,
R.drawable.ic_wallpaper_white_48dp,
R.drawable.ic_account_balance_white_48dp};
for (int i = 0; i < tabLayout.getTabCount(); i++) {
tabLayout.getTabAt(i).setIcon(imageResId[i]);
}
}
public void setActionBarTitle(String title) {
getSupportActionBar().setTitle(title);
}
}
有什么想法吗?非常感谢您的帮助!
你可以试试这个。
1.usesetupWithViewPager
方法
2.you必须在setupWithViewPager
方法后使用setIcon
方法
3.set默认ActionBar
标题
4.set ActionBar
选择标签时的标题
5.在fragment
中删除((MainActivity) getActivity()).setActionBarTitle("Locations");
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager);
CategoryAdapter adapter = new CategoryAdapter(this, getSupportFragmentManager());
viewPager.setAdapter(adapter);
TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
int[] imageResId = {
R.drawable.ic_place_white_48dp,
R.drawable.ic_restaurant_white_48dp,
R.drawable.ic_wallpaper_white_48dp,
R.drawable.ic_account_balance_white_48dp};
// title
final String[] mTitleNames = {"location", "food", "photos", "history"};
// setupWithViewPager
tabLayout.setupWithViewPager(viewPager);
// you must setIcon after setupWithViewPager method
for (int i = 0; i < imageResId.length; i++) {
tabLayout.getTabAt(i).setIcon(imageResId[i]);
}
// set default actionbar title
setActionBarTitle(mTitleNames[0]);
// set actionbar title when tab is selected
tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
int pos = tab.getPosition();
setActionBarTitle(mTitleNames[pos]);
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
}
});
}
public void setActionBarTitle(String title) {
getSupportActionBar().setTitle(title);
}
我已经四处寻找了几天,试图解决这个问题,但我似乎无法将其缩小到我的具体问题。
我有一个使用 4 个片段的应用程序,通常是 FragmentPagerAdapter、TabLayout 等。我正在使用普通的 ActionBar 并想更新 ActionBar 的标题以反映我正在使用 4 个片段中的哪一个当前。
我已经实施了某人更改标题的解决方案,但它并没有真正奏效:
((MainActivity) getActivity()).setActionBarTitle("Locations");
使用上面的代码,出于某种我无法理解的奇怪原因,标题总是针对我当前所在的下一个片段!所以当我在 "Food" 片段上时,标题显示 "Photos",这是它之后的下一个片段的标题。我已尝试将此代码放入每个片段的 onCreateView()、onActivityCreated() 和 onResume() 中,但结果是相同的 - 标题不是正确的片段。
我将使用我当前的代码,以便有希望地发现任何问题...
注意:我不想更改 TabLayout 中每个选项卡的标题,因为我为它们设置了图标,我只想更改与当前显示的 Fragment 相关的 ActionBar 的标题. :)
FragmentPagerAdapter:
public class CategoryAdapter extends FragmentPagerAdapter {
private Context mContext;
public CategoryAdapter(Context context, FragmentManager fm) {
super(fm);
mContext = context;
}
@Override
public Fragment getItem(int position) {
if (position == 0) {
return new Locations();
} else if (position == 1) {
return new Food();
} else if (position == 2) {
return new Photos();
} else {
return new History();
}
}
@Override
public int getCount() {
return 4;
}
@Override
public CharSequence getPageTitle(int position) {
return null;
}
}
MainActivityclass:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager);
CategoryAdapter adapter = new CategoryAdapter(this, getSupportFragmentManager());
viewPager.setAdapter(adapter);
TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
int[] imageResId = {
R.drawable.ic_place_white_48dp,
R.drawable.ic_restaurant_white_48dp,
R.drawable.ic_wallpaper_white_48dp,
R.drawable.ic_account_balance_white_48dp};
for (int i = 0; i < tabLayout.getTabCount(); i++) {
tabLayout.getTabAt(i).setIcon(imageResId[i]);
}
}
public void setActionBarTitle(String title) {
getSupportActionBar().setTitle(title);
}
}
有什么想法吗?非常感谢您的帮助!
你可以试试这个。
1.usesetupWithViewPager
方法
2.you必须在setupWithViewPager
方法后使用setIcon
方法
3.set默认ActionBar
标题
4.set ActionBar
选择标签时的标题
5.在fragment
((MainActivity) getActivity()).setActionBarTitle("Locations");
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager);
CategoryAdapter adapter = new CategoryAdapter(this, getSupportFragmentManager());
viewPager.setAdapter(adapter);
TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
int[] imageResId = {
R.drawable.ic_place_white_48dp,
R.drawable.ic_restaurant_white_48dp,
R.drawable.ic_wallpaper_white_48dp,
R.drawable.ic_account_balance_white_48dp};
// title
final String[] mTitleNames = {"location", "food", "photos", "history"};
// setupWithViewPager
tabLayout.setupWithViewPager(viewPager);
// you must setIcon after setupWithViewPager method
for (int i = 0; i < imageResId.length; i++) {
tabLayout.getTabAt(i).setIcon(imageResId[i]);
}
// set default actionbar title
setActionBarTitle(mTitleNames[0]);
// set actionbar title when tab is selected
tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
int pos = tab.getPosition();
setActionBarTitle(mTitleNames[pos]);
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
}
});
}
public void setActionBarTitle(String title) {
getSupportActionBar().setTitle(title);
}