java - 如何知道任何 fragment 是否处于 Activity 状态或可见?

标签 java android android-fragments visible fragment-backstack

我在一个 Activity 中有三个 fragment A、B 和 c, Activity 有一个带有测试 View 标题的工具栏。

现在,当我从一个 fragment 导航到另一个 fragment 时,我想根据显示的 fragment 更改 TextView 的文本。

为此,在 fragment B 和 C 中,我获取了主要 Activity 的工具栏和 TextView ,并像这样更改其标题:

        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);

这很好用。但是当我回到主要 fragment 时,我想再次更改标题,但它没有得到改变。

我试图在主要 Activity 的 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 fragment 可见,它也会将其标题更改为主要 fragment 标题。

我该怎么做。请帮忙。谢谢。

编辑:

主要 fragment :

        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();

fragment :

                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 fragment

       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();

最佳答案

如果您想为不同的 fragment 更改 Activity 工具栏的标题,而不是使用interface

创建接口(interface):

public interface OnFragmentTitleChangeListener {
    void onFragmentTitle(String strTitle);
}

在你的activity中实现这个接口(interface)

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;
  }
}

之后从 fragment 的 onResume 方法设置文本。

@Override
public void onResume() {
    super.onResume();
    ((OnFragmentTitleChangeListener) mContext).onFragmentTitle(getResources().getString(R.string.yourtext));
}

关于java - 如何知道任何 fragment 是否处于 Activity 状态或可见?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45346825/

相关文章:

android - 如何在未捕获的异常后停止后在 android 中重新启动服务?

android - 在 api 14 + 中工作时出现 XMl 错误

android - Admob 安全异常 : Permission Denial

android setText 使我的应用程序崩溃

android - Android 中 map fragment 上显示的黑线

java - Gradle 内部 slf4j 与我自己的 slf4j 依赖项冲突

java - 如何使JTextPane达到一张纸的大小?

java - 在 POST 映射中使用 jackson 而不是 DTO?

android - 打开某个 fragment 时如何隐藏抽屉导航?

java - 删除除 jsoup 中 h1 标签之后第一个 div 之外的所有 div 元素