如何知道任何片段是否处于活动状态或可见?
How to know if any fragment is active or visible?
我将三个片段 A、B 和 c 合而为一 activity,activity 有一个带有测试视图标题的工具栏。
现在,当我从一个片段导航到另一个片段时,我想根据显示的片段更改文本视图的文本。
为此,在片段 B 和 C 中,我得到主 activity 的工具栏和文本视图,并像这样更改其标题:
final Toolbar toolbar = (Toolbar) ((MainActivity) getActivity()).findViewById(R.id.toolbar);
((MainActivity) getActivity()).setSupportActionBar(toolbar);
TextView title = (TextView) getActivity().findViewById(R.id.textView_Title);
title.setVisibility(View.VISIBLE);
title.setText(R.string.profile);
这很好用。但是当我回到主要片段时,我想再次更改标题,但它没有改变。
我试着在mainactivity的onCreate方法中设置它,像这样:
@Override
public void onBackPressed() {
DashboardFragment test = (DashboardFragment) getSupportFragmentManager().findFragmentByTag("DASHBOARD_FRAGMENT");
if (test != null && test.isVisible()) {
//DO STUFF
title = (TextView) findViewById(R.id.textView_Title);
title.setVisibility(View.VISIBLE);
title.setText(R.string.dashboardTitle);
}
else {
//Whatever
}
// Do nothing if the back button is disabled.
if (!mBackPressCancelled) {
if (getFragmentManager().getBackStackEntryCount() > 0) {
getFragmentManager().popBackStackImmediate();
}
else {
super.onBackPressed();
}
}
}
但是有了这个,它会将标题更改为主要片段标题,即使 B 片段也是可见的。
我该怎么做。请帮忙。谢谢。
编辑:
主要片段:
fragmentManager = getSupportFragmentManager();
DashboardFragment fragment1 = new DashboardFragment();
Bundle bundle = new Bundle();
fragment1.setArguments(bundle);
fragmentManager.popBackStack(null,FragmentManager.POP_BACK_STACK_INCLUSIVE);
fragmentManager.beginTransaction().replace(R.id.frame, fragment1, "DASHBOARD_FRAGMENT").commitAllowingStateLoss();
片段:
fragmentManager = ((MainActivity)(mContext)).getSupportFragmentManager();
ProfileFragment fragment1 = new ProfileFragment();
Bundle bundle = new Bundle();
fragment1.setArguments(bundle);
fragmentManager.beginTransaction().add(R.id.frame, fragment1, "PROFILE_FRAGMENT").addToBackStack("B").commit();
B片段
fragmentManager = getActivity().getSupportFragmentManager();
ProfileEditFragment fragment1 = new ProfileEditFragment();
Bundle bundle = new Bundle();
fragment1.setArguments(bundle);
fragmentManager.beginTransaction().add(R.id.frame, fragment1, "PROFILE_EDIT_FRAGMENT").addToBackStack("C").commit();
这个函数让你知道片段是否可见
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser) {
// Handle when fragment is visible
} else {
// And not
}
}
但是在你的 use-case 中,如果你使用 ViewPager
或 Tab
,你可以通过这个
轻松获得你的称号
viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
yourFragmentPagerAdapter.getTitle(position);
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
如果您想为不同的片段更改 activity 中的工具栏标题,而不是使用 interface
。
创建接口:
public interface OnFragmentTitleChangeListener {
void onFragmentTitle(String strTitle);
}
在您的 activity
中实现此接口
public class YourActivity extends AppCompatActivity implements OnFragmentTitleChangeListener
{
TextView title;
......
......
// Initialize title in onCreate method
......
......
// Override this method
public void onFragmentTitle(String strTitle)
{
title.setText(strTitle);
}
@Override
public void onBackPressed() {
FragmentManager fm = getSupportFragmentManager();
if (onBack(fm)) {
return;
}
super.onBackPressed();
}
private boolean onBack(FragmentManager fm) {
if (fm != null) {
if (fm.getBackStackEntryCount() > 0) {
fm.popBackStack();
return true;
}
}
return false;
}
}
之后从片段的 onResume 方法设置文本。
@Override
public void onResume() {
super.onResume();
((OnFragmentTitleChangeListener) mContext).onFragmentTitle(getResources().getString(R.string.yourtext));
}
使用导航图进行片段导航。这样做很简单,您可以通过调用 navController.currentDestination.label
来获取片段标签
我将三个片段 A、B 和 c 合而为一 activity,activity 有一个带有测试视图标题的工具栏。
现在,当我从一个片段导航到另一个片段时,我想根据显示的片段更改文本视图的文本。
为此,在片段 B 和 C 中,我得到主 activity 的工具栏和文本视图,并像这样更改其标题:
final Toolbar toolbar = (Toolbar) ((MainActivity) getActivity()).findViewById(R.id.toolbar);
((MainActivity) getActivity()).setSupportActionBar(toolbar);
TextView title = (TextView) getActivity().findViewById(R.id.textView_Title);
title.setVisibility(View.VISIBLE);
title.setText(R.string.profile);
这很好用。但是当我回到主要片段时,我想再次更改标题,但它没有改变。
我试着在mainactivity的onCreate方法中设置它,像这样:
@Override
public void onBackPressed() {
DashboardFragment test = (DashboardFragment) getSupportFragmentManager().findFragmentByTag("DASHBOARD_FRAGMENT");
if (test != null && test.isVisible()) {
//DO STUFF
title = (TextView) findViewById(R.id.textView_Title);
title.setVisibility(View.VISIBLE);
title.setText(R.string.dashboardTitle);
}
else {
//Whatever
}
// Do nothing if the back button is disabled.
if (!mBackPressCancelled) {
if (getFragmentManager().getBackStackEntryCount() > 0) {
getFragmentManager().popBackStackImmediate();
}
else {
super.onBackPressed();
}
}
}
但是有了这个,它会将标题更改为主要片段标题,即使 B 片段也是可见的。
我该怎么做。请帮忙。谢谢。
编辑:
主要片段:
fragmentManager = getSupportFragmentManager();
DashboardFragment fragment1 = new DashboardFragment();
Bundle bundle = new Bundle();
fragment1.setArguments(bundle);
fragmentManager.popBackStack(null,FragmentManager.POP_BACK_STACK_INCLUSIVE);
fragmentManager.beginTransaction().replace(R.id.frame, fragment1, "DASHBOARD_FRAGMENT").commitAllowingStateLoss();
片段:
fragmentManager = ((MainActivity)(mContext)).getSupportFragmentManager();
ProfileFragment fragment1 = new ProfileFragment();
Bundle bundle = new Bundle();
fragment1.setArguments(bundle);
fragmentManager.beginTransaction().add(R.id.frame, fragment1, "PROFILE_FRAGMENT").addToBackStack("B").commit();
B片段
fragmentManager = getActivity().getSupportFragmentManager();
ProfileEditFragment fragment1 = new ProfileEditFragment();
Bundle bundle = new Bundle();
fragment1.setArguments(bundle);
fragmentManager.beginTransaction().add(R.id.frame, fragment1, "PROFILE_EDIT_FRAGMENT").addToBackStack("C").commit();
这个函数让你知道片段是否可见
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser) {
// Handle when fragment is visible
} else {
// And not
}
}
但是在你的 use-case 中,如果你使用 ViewPager
或 Tab
,你可以通过这个
viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
yourFragmentPagerAdapter.getTitle(position);
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
如果您想为不同的片段更改 activity 中的工具栏标题,而不是使用 interface
。
创建接口:
public interface OnFragmentTitleChangeListener {
void onFragmentTitle(String strTitle);
}
在您的 activity
中实现此接口public class YourActivity extends AppCompatActivity implements OnFragmentTitleChangeListener
{
TextView title;
......
......
// Initialize title in onCreate method
......
......
// Override this method
public void onFragmentTitle(String strTitle)
{
title.setText(strTitle);
}
@Override
public void onBackPressed() {
FragmentManager fm = getSupportFragmentManager();
if (onBack(fm)) {
return;
}
super.onBackPressed();
}
private boolean onBack(FragmentManager fm) {
if (fm != null) {
if (fm.getBackStackEntryCount() > 0) {
fm.popBackStack();
return true;
}
}
return false;
}
}
之后从片段的 onResume 方法设置文本。
@Override
public void onResume() {
super.onResume();
((OnFragmentTitleChangeListener) mContext).onFragmentTitle(getResources().getString(R.string.yourtext));
}
使用导航图进行片段导航。这样做很简单,您可以通过调用 navController.currentDestination.label
来获取片段标签