0

J'ai trois fragments A, B et c dans une activité, l'activité a une barre d'outils avec titre de vue de test.Comment savoir si un fragment est actif ou visible?

Maintenant que je navigue d'un fragment à l'autre, je veux changer le texte de l'affichage du texte en fonction du fragment affiché.

Pour ce dans le fragment B et C Je reçois la barre d'outils principale activité et la vue du texte et en changeant son titre comme celui-ci:

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

Cela fonctionne très bien. Mais quand je reviens au fragment principal, je veux changer de nouveau le titre mais ça ne change pas.

J'ai essayé de le mettre en mode onCreate d'activité principale, et comme celui-ci:

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

     } 
    } 
} 

Mais avec cela, il changera son nom à titre principal des fragments même fragment B est visible.

Comment puis-je faire cela. S'il vous plaît aider. Je vous remercie.

EDIT:

MainFragment:

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

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

fragment 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(); 
+0

En bref, vous voulez changer le titre de la barre d'outils en fonction du fragment droit? –

+0

vérifiez ceci: https://stackoverflow.com/a/33123356/6021469 –

Répondre

1

Si vous voulez changer le titre de la barre d'outils de l'activité pour les différents fragments que utiliser interface.

Créer une interface:

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

implémentent cette interface dans votre activité

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

Après que le texte de jeu de la méthode onResume de fragment.

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

ne fonctionne pas. Il montre toujours le titre du fragment b à un fragment principal sur le dos appuyé. – Sid

+0

@Sid définir cette méthode onResume dans tous les fragments avec du texte différent, cela va fonctionner. –

+0

Je l'ai mis. ne fonctionne pas. – Sid

1

Cette fonction vous permet de savoir si le fragment est visible ou non

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

Mais dans votre cas d'utilisation, si vous en utilisant ViewPager ou Tab, vous pouvez obtenir votre titre facilement par ce

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

     } 
    }); 
+0

Je n'utilise pas view pager. – Sid

+0

Vous pouvez aller avec la première approche – ManishNegi

+0

première approche donnant l'erreur de ne peut pas résoudre la méthode setUserVisibleHint. Qu'est-ce qui doit être ajouté? – Sid