【问题标题】:How to know if any fragment is active or visible?如何知道任何片段是否处于活动状态或可见?
【发布时间】:2017-07-27 09:35:36
【问题描述】:

我在一个活动中有三个片段 A、B 和 c,活动有一个带有测试视图标题的工具栏。

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

为此,在片段 B 和 C 中,我正在获取主要活动的工具栏和文本视图并更改其标题,如下所示:

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

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

我尝试在主要活动的 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();

【问题讨论】:

标签: java android android-fragments visible fragment-backstack


【解决方案1】:

如果您想为不同的片段更改活动中工具栏的标题,而不是使用interface

创建界面:

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

在你的活动中实现这个接口

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

【讨论】:

  • 不工作。它仍然显示 b 片段的标题到 A 主片段的背面按下。
  • @Sid 在所有具有不同文本的片段中设置此 onResume 方法,它将起作用。
  • @Sid 你可以和popBackStack() 核对一下吗?检查我在活动代码中的编辑。
【解决方案2】:

这个函数让你知道片段是否可见

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
    if (isVisibleToUser) {
        // Handle when fragment is visible
    } else {
        // And not
    }
}

但是在您的用例中,如果您使用ViewPagerTab,您可以通过此轻松获得您的标题

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

        }
    });

【讨论】:

  • 我没有使用视图寻呼机。
  • 你可以采用第一种方法
  • 第一种方法给出了无法解析方法 setUserVisibleHint 的错误。需要添加什么?
【解决方案3】:

使用导航图进行片段导航。通过这样做,您可以通过调用 navController.currentDestination.label 获取片段标签

【讨论】:

  • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-31
  • 2023-03-24
相关资源
最近更新 更多