我有一张单人床 Activity
它通过一个 ViewPager
. 在活动的 onCreate
方法我正在使用以下代码来更改 ActionBar
职务:
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
if(getSupportActionBar() != null) {
getSupportActionBar().setTitle(getResources().getString(R.string.custom_title));
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
它工作得很好,但我无法尽快改变它 Fragment
变得可见。为了检测它,我实现了:
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser && getContext() != null) {
((MainActivity) getContext()).editActionBarTitle("new title");
}
}
以下是 editActionBarTitle
:
public void editActionBarTitle(String title) {
if(getSupportActionBar() != null) {
getSupportActionBar().setTitle(title);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
}
我可以看到,只要一个片段变得可见,就会调用这个方法,但是它对actionbar的标题没有任何影响。为了正确编辑标题,我遗漏了什么?
编辑
我也尝试过 addOnPageChangeListener
在 viewPager
,我可以看出 onPageSelected
调用,但对标题没有影响,以下是mainactivity的示例:
public class MainActivity extends BaseActivity {
private NoScrollViewPager mViewPager;
private SectionsPagerAdapter mAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Toolbar initialization
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
if(getSupportActionBar() != null) {
getSupportActionBar().setTitle("MainActivity");
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
// ViewPager initialization
mViewPager = findViewById(R.id.containter);
setupViewPager();
}
private void setupViewPager() {
mAdapter = new SectionsPagerAdapter(getSupportFragmentManager());
mAdapter.addFragment(new Fragment1(), "Fragment 1");
mAdapter.addFragment(new Fragment2(), "Fragment 2");
mAdapter.addFragment(new Fragment3(), "Fragment 3");
mViewPager.setOffscreenPageLimit(mAdapter.getCount());
mViewPager.setAdapter(mAdapter);
// viewPager event listener
mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { }
@Override
public void onPageSelected(int position) {
setTitle("fragment " + position);
if(getSupportActionBar() != null) {
getSupportActionBar().setTitle("fragment " + position);
}
}
@Override
public void onPageScrollStateChanged(int state) { }
});
}
public void setViewPager(int position) { mViewPager.setCurrentItem(position); }
}
这是习俗 ViewPager
班级:
public class NoScrollViewPager extends ViewPager {
// Disable horizontal scrolling in ViewPager
private boolean isPagingEnabled = false;
public NoScrollViewPager(Context context) {
super(context);
}
public NoScrollViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
@SuppressLint("AndroidLintClickableViewAccessibility")
public boolean onTouchEvent(MotionEvent event) {
return this.isPagingEnabled && super.onTouchEvent(event);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
return this.isPagingEnabled && super.onInterceptTouchEvent(event);
}
public void setPagingEnabled(boolean b) {
this.isPagingEnabled = b;
}
}
这是自定义适配器类:
public class SectionsPagerAdapter extends FragmentStatePagerAdapter {
private final List<Fragment> mFragmentList = new ArrayList<>();
private final List<String> mFragmentTitleList = new ArrayList<>();
private FragmentManager fragmentManager;
public SectionsPagerAdapter(FragmentManager fm) {
super(fm);
fragmentManager = fm;
}
public void addFragment(Fragment fragment, String title) {
mFragmentList.add(fragment);
mFragmentTitleList.add(title);
}
@Override
public Fragment getItem(int position) { return mFragmentList.get(position); }
@Override
public int getCount() { return mFragmentList.size(); }
@Override
public int getItemPosition(Object object) { return POSITION_NONE; }
}
6条答案
按热度按时间ztigrdn81#
你也可以使用
viewPager.addOnPageChangeListener()
添加一个侦听器,该侦听器将在页面更改或以增量方式滚动时调用在
viewPager.addOnPageChangeListener()
你需要在你的书名中设置标题actionbar
内部onPageSelected()
返回当前选定页的当前值viewpager
样本代码这是我的工作代码
活动代码
布局
输出
https://www.youtube.com/watch?v=ytjogokj1zq
qzwqbdag2#
我在最近的一个项目中遇到了这个问题。最后,我为每个片段设计了单独的工具栏,每个片段都有自己的标题。我确实用过:
jhkqcmku3#
更改onpageselected from中的代码
为了这个
扩展appcompatactivity而不是baseactivity。在oncreate中保留相同的代码
5rgfhyps4#
唯一合法的理解方式
FragmentA
正在中显示ViewPager
对…有ReactOnPageChangeListener
回调。采用本答案中提到的技术,您可能会得到以下代码:
这假设在
ViewPager
,实现TitleOwner
:和片段类:
kx1ctssn5#
在oncreateview方法中尝试将其转换为片段。也许对你有帮助。
如果在片段中使用viewpager,那么可以使用
qfe3c7zg6#
你能检查一下你用的是不是电话机吗
NoActionBar
主题。例如Theme.AppCompat.Light.NoActionBar
或者Theme.MaterialComponents.NoActionBar
.