Как узнать, является ли какой-либо фрагмент активным или видимым?

У меня есть три фрагмента 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();

Фрагмент Б

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

person Sid    schedule 27.07.2017    source источник
comment
Короче говоря, вы хотите изменить заголовок панели инструментов в соответствии с фрагментом, верно?   -  person Shweta Chauhan    schedule 27.07.2017
comment
проверьте это: stackoverflow.com/a/33123356/6021469   -  person Shweta Chauhan    schedule 27.07.2017


Ответы (2)


Если вы хотите изменить заголовок панели инструментов в действии для разных фрагментов, используйте 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));
}
person Akash Patel    schedule 27.07.2017
comment
не работает. Он по-прежнему показывает заголовок фрагмента b для основного фрагмента A на задней панели. - person Sid; 27.07.2017
comment
@Sid установил этот метод onResume во всех фрагментах с другим текстом, он будет работать. - person Akash Patel; 27.07.2017
comment
@Sid ты можешь уточнить у popBackStack() ? проверьте мое редактирование в коде активности. - person Akash Patel; 27.07.2017
comment
Давайте продолжим это обсуждение в чате. - person Akash Patel; 27.07.2017

Эта функция позволяет узнать, виден фрагмент или нет.

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

Но в вашем случае использования, если вы используете 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) {

        }
    });
person nhp    schedule 27.07.2017
comment
Я не использую просмотр пейджера. - person Sid; 27.07.2017
comment
Вы можете пойти с первым подходом - person ManishNegi; 27.07.2017
comment
первый подход дает ошибку не может разрешить метод setUserVisibleHint. Что нужно добавить? - person Sid; 27.07.2017