it-swarm.com.de

Wie bekomme ich das aktuell angezeigte Fragment?

Ich spiele mit Fragmenten in Android.

Ich weiß, dass ich ein Fragment mithilfe des folgenden Codes ändern kann:

FragmentManager fragMgr = getSupportFragmentManager();
FragmentTransaction fragTrans = fragMgr.beginTransaction();

MyFragment myFragment = new MyFragment(); //my custom fragment

fragTrans.replace(Android.R.id.content, myFragment);
fragTrans.addToBackStack(null);
fragTrans.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
fragTrans.commit();

Meine Frage ist, wie bekomme ich in einer Java-Datei die aktuell angezeigte Fragment-Instanz?

369
Leem.fin

Wenn Sie das Fragment in Ihre Transaktion einfügen, sollten Sie ein Tag verwenden.

fragTrans.replace(Android.R.id.content, myFragment, "MY_FRAGMENT");

... und später, wenn Sie prüfen möchten, ob das Fragment sichtbar ist:

MyFragment myFragment = (MyFragment)getFragmentManager().findFragmentByTag("MY_FRAGMENT");
if (myFragment != null && myFragment.isVisible()) {
   // add your code here
}

Siehe auch http://developer.Android.com/reference/Android/app/Fragment.html

416
ramdroid

Ich weiß, dass es ein alter Beitrag ist, hatte aber zuvor auch Probleme damit. Eine Lösung gefunden, die dies in der Funktion onBackStackChanged() tun sollte

  @Override
    public void onBackPressed() {
        super.onBackPressed();

         Fragment f = getActivity().getFragmentManager().findFragmentById(R.id.fragment_container);
      if(f instanceof CustomFragmentClass) 
        // do something with f
        ((CustomFragmentClass) f).doSomething();

    }

Dies funktionierte für mich, da ich nicht jedes Fragment durchlaufen musste, das ich finden muss, um ein sichtbares zu finden. Hoffe, es hilft auch jemand anderem.

348
Sev

Hier ist meine Lösung, die ich für Szenarien mit niedrigem Fragment hilfreich finde

public Fragment getVisibleFragment(){
    FragmentManager fragmentManager = MainActivity.this.getSupportFragmentManager();
    List<Fragment> fragments = fragmentManager.getFragments();
    if(fragments != null){
        for(Fragment fragment : fragments){
            if(fragment != null && fragment.isVisible())
                return fragment;
        }
    }
    return null;
}
133
Matt Mombrea

Jedes Mal, wenn Sie Fragment anzeigen, müssen Sie es in den Backstack einfügen:

FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.setTransition(FragmentTransaction.TRANSIT_ENTER_MASK);       
ft.add(R.id.primaryLayout, fragment, tag);
ft.addToBackStack(tag);
ft.commit();        

Wenn Sie dann ein aktuelles Fragment benötigen, können Sie diese Methode verwenden:

public BaseFragment getActiveFragment() {
    if (getSupportFragmentManager().getBackStackEntryCount() == 0) {
        return null;
    }
    String tag = getSupportFragmentManager().getBackStackEntryAt(getSupportFragmentManager().getBackStackEntryCount() - 1).getName();
    return (BaseFragment) getSupportFragmentManager().findFragmentByTag(tag);
}
74
Dmitry_L

Was ich verwende, um das aktuell angezeigte Fragment zu finden, ist in dem folgenden Code dargestellt. Es ist einfach und es funktioniert jetzt für mich. Es läuft in der Aktivität, die die Fragmente enthält

    FragmentManager fragManager = this.getSupportFragmentManager();
    int count = this.getSupportFragmentManager().getBackStackEntryCount();
    Fragment frag = fragManager.getFragments().get(count>0?count-1:count);
21
tainy

Der reaktive Weg:

Observable.from(getSupportFragmentManager().getFragments())
    .filter(fragment -> fragment.isVisible())
    .subscribe(fragment1 -> {
        // Do something with it
    }, throwable1 -> {
        // 
    });
14
localhost

Meine Methode basiert auf try/catch wie folgt:

MyFragment viewer = null;
try {
    viewer = (MyFragment) getFragmentManager().findFragmentByTag(MY_TAG_FRAGMENT);
} catch (ClassCastException e) {
    // not that fragment
}

Aber es kann einen besseren Weg geben ...

10
Thordax

Es ist etwas spät, aber für alle, die Interesse haben: Wenn Sie den Index des gewünschten Fragments in FragmentManager kennen, rufen Sie einfach einen Verweis darauf auf und überprüfen Sie die Funktion isMenuVisible ()! Hier :

getSupportFragmentManager().getFragments().get(0).isMenuVisible()

Wenn true ist es sichtbar für Benutzer und so weiter!

7
MohammadReza

Nun, diese Frage bekam viele Ansichten und Aufmerksamkeit, enthielt aber nicht die einfachste Lösung von mir - getFragments () zu verwenden.

            List fragments = getSupportFragmentManager().getFragments();
            mCurrentFragment = fragments.get(fragments.size() - 1);
7
Nativ

1)

ft.replace(R.id.content_frame, fragment, **tag**).commit();

2)

FragmentManager fragmentManager = getSupportFragmentManager();
Fragment currentFragment = fragmentManager.findFragmentById(R.id.content_frame);

3)

if (currentFragment.getTag().equals(**"Fragment_Main"**))
{
 //Do something
}
else
if (currentFragment.getTag().equals(**"Fragment_DM"**))
{
//Do something
}
6
Nam Ngo Thanh

Es gibt eine Methode namens findFragmentById() in SupportFragmentManager. Ich verwende es im Aktivitätscontainer wie: 

public Fragment currentFragment(){
    return getSupportFragmentManager().findFragmentById(R.id.activity_newsfeed_frame);
}

So erhalten Sie Ihre aktuelle Fragment. Wenn Sie benutzerdefinierte Fragment haben und überprüfen müssen, was Fragment ist, verwende ich normalerweise instanceof:

if (currentFragment() instanceof MyFrag){
    // Do something here
}
5
Kevin Murvie

Inspiriert durch die Antwort von Tainy, hier sind meine zwei Cents. Von den meisten anderen Implementierungen etwas geändert.

private Fragment getCurrentFragment() {
    FragmentManager fragmentManager = myActivity.getSupportFragmentManager();
    int stackCount = fragmentManager.getBackStackEntryCount();
    if( fragmentManager.getFragments() != null ) return fragmentManager.getFragments().get( stackCount > 0 ? stackCount-1 : stackCount );
    else return null;
}

Ersetzen Sie "myActivity" durch "this", wenn es sich um Ihre aktuelle Aktivität handelt, oder verwenden Sie einen Verweis auf Ihre Aktivität.

5
Nashe

Sevs Antwort funktioniert, wenn Sie die Zurück-Taste drücken oder auf andere Weise den Hintergrund wechseln.

Ich habe aber etwas anders gemacht. Ich habe ein Backstack-Änderungslistener-Setup auf einem Basisfragment und den abgeleiteten Fragmenten. Dieser Code befindet sich im Listener:

Fragment f = getActivity().getSupportFragmentManager().findFragmentById(R.id.container);

if (f.getClass().equals(getClass())) {
    // On back button, or popBackStack(),
    // the fragment that's becoming visible executes here,
    // but not the one being popped, or others on the back stack

    // So, for my case, I can change action bar bg color per fragment
}
4
MCLLC

Dies ist eine einfache Möglichkeit, ein aktuelles Fragment zu erhalten.

getFragmentManager().addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {
  @Override public void onBackStackChanged() {
    currentFragment = fragmentManager.findFragmentById(R.id.content);
    if (currentFragment !=  null && (currentFragment instanceof LoginScreenFragment)) {
      logout.setVisibility(View.GONE);
    } else {
      logout.setVisibility(View.VISIBLE);
    }
  }
});
4
lallu Sukendh

Sie können abfragen, welches Fragment in Ihren Aktivitäten-Inhaltsrahmen geladen wird, und die Fragmentklasse oder den "einfachen Namen" des Fragments (als String) abrufen.

public String getCurrentFragment(){
     return activity.getSupportFragmentManager().findFragmentById(R.id.content_frame).getClass().getSimpleName();
}

Verwendungszweck: 

Log.d(TAG, getCurrentFragment());

Ausgänge:

D/MainActivity: FragOne
4
Mr L

Das ist Arbeit für mich. Ich hoffe das hilft jemandem.

FragmentManager fragmentManager = this.getSupportFragmentManager();  
        String tag = fragmentManager
                    .getBackStackEntryAt(
                    fragmentManager
                    .getBackStackEntryCount() - 1)
                    .getName();
              Log.d("This is your Top Fragment name: ", ""+tag);
3
Cüneyt

Wenn Sie hier sind und Sie Kotlin verwenden:

var fragment = supportFragmentManager.findFragmentById(R.id.fragment_container)

R.id.fragment_container ist die id, bei der die fragment auf ihrer activity präsentiert wird.

Oder wenn Sie eine schönere Lösung wünschen:

supportFragmentManager.findFragmentById(R.id.content_main)?.let {
    // the fragment exists

    if (it is FooFragment) {
        // The presented fragment is FooFragment type
    }
}
3
pableiros

Wenn Sie die aktuelle Instanz von Fragment aus der übergeordneten Aktivität abrufen, können Sie dies einfach tun

findFragmentByID(R.id.container);

Dies ist eigentlich die aktuelle Instanz von fragment, die in der Ansicht aufgefüllt wird. Ich hatte das gleiche Problem. Ich musste das gleiche Fragment zweimal laden und ein Backstack aufbewahren. 

Die folgende Methode funktioniert nicht. Es bekommt nur ein Fragment mit dem Tag. Verschwenden Sie keine Zeit mit dieser Methode. Ich bin sicher, es hat seine Verwendung, aber die neueste Version desselben Fragments zu erhalten, gehört nicht dazu.

findFragmentByTag()
3
Yasin Yaqoobi
final FragmentManager fm=this.getSupportFragmentManager();
final Fragment fragment=fm.findFragmentByTag("MY_FRAGMENT");

if(fragment != null && fragment.isVisible()){
      Log.i("TAG","my fragment is visible");
}
else{
      Log.i("TAG","my fragment is not visible");
}
2
KeranMarinov

Überprüfen Sie diese Lösung. Es hat für mich funktioniert, das aktuelle Fragment zu bekommen. 

if(getSupportFragmentManager().getBackStackEntryCount() > 0){
        Android.support.v4.app.Fragment f = 
         getSupportFragmentManager().findFragmentById(R.id.fragment_container);
        if(f instanceof ProfileFragment){
            Log.d(TAG, "Profile Fragment");
        }else if(f instanceof SavedLocationsFragment){
            Log.d(TAG, "SavedLocations Fragment");
        }else if(f instanceof AddLocationFragment){
            Log.d(TAG, "Add Locations Fragment");
        }
2
Haroon khan

Ich hatte ein ähnliches Problem, bei dem ich wissen wollte, welches Fragment zuletzt angezeigt wurde, als die Zurück-Taste gedrückt wurde. Ich habe eine sehr einfache Lösung verwendet, die für mich funktioniert hat. Bei jedem Öffnen eines Fragments in der onCreate () -Methode setze ich eine Variable in meinem Singleton (ersetzen Sie "myFragment" durch den Namen Ihres Fragments)

MySingleton.currentFragment = myFragment.class;

Die Variable wird im Singleton als deklariert 

public static Class currentFragment = null; 

Dann überprüfe ich in der onBackPressed ()

    if (MySingleton.currentFragment == myFragment.class){
        // do something
        return;
    }
    super.onBackPressed();

Stellen Sie sicher, dass Sie super.onBackPressed () aufrufen. nach dem "return", sonst verarbeitet die App den Zurückschlüssel, was in meinem Fall dazu geführt hat, dass die App beendet wurde.

1
Zvi

Im Falle von gescrollten Fragmenten können Sie, wenn Sie die ViewPager-Klasse verwenden, mVeiwPager annehmen, mViewPager.getCurrentItem () aufrufen, um die aktuelle Fragment-Int-Nummer abzurufen.

in MainLayout.xml

<?xml version="1.0" encoding="utf-8"?>
<Android.support.design.widget.CoordinatorLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto"
    xmlns:tools="http://schemas.Android.com/tools"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:fitsSystemWindows="true"
    Android:orientation="vertical"
    tools:context="unidesign.photo360.MainActivity">

    <Android.support.design.widget.AppBarLayout
        Android:id="@+id/appbar"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:fitsSystemWindows="false"
        Android:theme="@style/AppTheme.AppBarOverlay"
        app:expanded="false">

        <Android.support.v7.widget.Toolbar
            Android:id="@+id/main_activity_toolbar"
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content"
            Android:layout_weight="1"
            app:popupTheme="@style/AppTheme.PopupOverlay"
            app:title="@string/app_name">

        </Android.support.v7.widget.Toolbar>

    </Android.support.design.widget.AppBarLayout>


    <Android.support.v4.view.ViewPager
        Android:id="@+id/view_pager"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content">

    </Android.support.v4.view.ViewPager>
    
</Android.support.design.widget.CoordinatorLayout>

in MainActivity.kt

class MainActivity : AppCompatActivity() {
    
        lateinit var mViewPager: ViewPager
        lateinit var pageAdapter: PageAdapter
        
//      ...
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
            
            pageAdapter = PageAdapter(supportFragmentManager)
            mViewPager = findViewById(R.id.view_pager)
//          ...
            }
            
        override fun onResume() {
          super.onResume()
          var currentFragment = pageAdapter.getItem(mViewPager.currentItem)
//         ...
          }

1
getSupportFragmentManager().findFragmentById(R.id.content_frame).getClass().getSimpleName();

Nun, ich denke, dies ist die direkteste Antwort auf diese Frage. Ich hoffe das hilft.

1
Abhishek Raj

Kotlin Weg;

val currentFragment = supportFragmentManager.fragments.last()
1

In der Hauptaktivität wird die Methode onAttachFragment (Fragment fragment) aufgerufen, wenn ein neues Fragment an die Aktivität angehängt wird. In dieser Methode können Sie die Instanz des aktuellen Fragments abrufen. Die onAttachFragment-Methode wird jedoch nicht aufgerufen, wenn ein Fragment aus dem Backstack gezogen wird, dh wenn die Zurück-Schaltfläche gedrückt wird, um das oberste Fragment auf den Stapel zu bekommen. Ich suche immer noch nach einer Callback-Methode, die in der Hauptaktivität ausgelöst wird, wenn ein Fragment in der Aktivität sichtbar wird.

1
ufdeveloper

Ich bin auch bei diesem Punkt geblieben. Was ich schließlich getan habe, hat nur eine Reihe von Fragmenten deklariert:

private static PlaceholderFragment[] arrFrg;

(in meinem Fall ist es PlaceholderFragment) und packte alle Fragemnts in dieses Array, ohne zu markieren :)

        public static PlaceholderFragment newInstance(int sectionNumber) {
            final PlaceholderFragment fragment = new PlaceholderFragment();
            Bundle args = new Bundle();
            args.putInt(ARG_SECTION_NUMBER, sectionNumber);
            fragment.setArguments(args);
            arrFrg[sectionNumber] = fragment;

            return fragment;
}

Dann können Sie einfach auf das aktuell angezeigte Fragment zugreifen:

arrFrg[mViewPager.getCurrentItem()];

Ich verstehe, das ist wahrscheinlich nicht die beste Lösung, aber es funktioniert perfekt für mich :)

0
MTU
public Fragment getVisibleFragment() {
    FragmentManager fragmentManager = getSupportFragmentManager();
    List<Fragment> fragments = fragmentManager.getFragments();
    if(fragments != null) {
        for (Fragment fragment : fragments) {
            if (fragment != null && fragment.isVisible())
                return fragment;
        }
    }
    return null;
}

Das funktioniert für mich. Sie müssen eine Nullprüfung durchführen, bevor Sie die Fragmentliste durchlaufen. Es kann vorkommen, dass keine Fragmente in den Stapel geladen werden.

Das zurückkehrende Fragment kann mit dem Fragment verglichen werden, das Sie auf den Stapel legen möchten.

0
caesiium

Sie können das aktuelle Fragment erhalten, indem Sie folgenden Code verwenden

FragmentClass f = (FragmentClass)viewPager.getAdapter().instantiateItem(viewPager, viewPager.getCurrentItem());
0

Falls Sie verschachtelte Fragmente haben, wie z. B. Viewpager in Viewpagern usw., und Sie alle verschachtelten Fragmente erhalten möchten.

Vielen Dank und mit freundlicher Genehmigung von Matt Mombrea Antwort eine kleine überarbeitete Version.

private List<Fragment> getVisibleFragments(List<Fragment> searchFragments, List<Fragment> visibleFragments) {
    if (searchFragments != null && searchFragments.size() > 0) {
        for (Fragment fragment : searchFragments) {
            List<Fragment> nestedFragments = new ArrayList<>();
            List<Fragment> childFMFragments = fragment.getChildFragmentManager().getFragments();
            List<Fragment> fmFragments = fragment.getFragmentManager().getFragments();
            fmFragments.retainAll(childFMFragments);
            nestedFragments.addAll(childFMFragments);
            nestedFragments.addAll(fmFragments);
            getVisibleFragments(nestedFragments, visibleFragments);
            if (fragment != null && fragment.isVisible()) {
                visibleFragments.add(fragment);
            }
        }
    }
    return visibleFragments;
}

Und hier ist die Verwendung:

List<Fragment> allVisibleFragments = getVisibleFragments(searchFragments, visibleFragments);

Zum Beispiel:

List<Fragment> visibleFragments = new ArrayList<>();
List<Fragment> searchFragments = MainActivity.this.getSupportFragmentManager().getFragments();
Toast.makeText(this, ""+getVisibleFragments(searchFragments, visibleFragments), Toast.LENGTH_LONG).show();
0
10101101

Wenn Sie die Support-Bibliothek v13 verwenden, ist dieses Problem behoben, und Sie sollten einfach überschreiben:

@Override
public void setUserVisibleHint(boolean isVisibleToUser)
{
    // TODO Auto-generated method stub
    super.setUserVisibleHint(isVisibleToUser);
}

Das Problem ist, dass Sie die beiden nicht kombinieren können, da das Fragment nicht mit der Fragment-Klasse der Version 4 kompatibel ist.

Wenn Sie nicht die V4-Unterstützungsbibliothek verwenden, überschreiben Sie die Methode setPrimaryItem in Ihrem FragmentStatePagerAdapter.

Ich habe dies verwendet, um den Actionbat-Titel in großen Listen zu aktualisieren.

0
Mashiah

Ein bisschen seltsam, aber ich habe mir FragmentManager $ FragmentManagerImpl angesehen und folgendes funktioniert für mich:

public static Fragment getActiveFragment(Activity activity, int index)
{
    Bundle bundle = new Bundle();
    String key = "i";
    bundle.putInt(key,index);
    Fragment fragment=null;
    try
    {
        fragment = activity.getFragmentManager().getFragment(bundle, key);
    } catch(Exception e){}
    return fragment;
}

um das erste aktive Fragment zu erhalten, verwenden Sie 0 als Index

0
Hans

Die Verwendung eines Ereignisbusses (wie Otto , EventBus oder eines RxJava Bus ) ist in diesen Situationen besonders praktisch.

Während dieser Ansatz Sie nicht unbedingt das aktuell sichtbare Fragment als Objekt weitergibt (obwohl dies auch möglich ist, aber zu einer längeren Aufrufkette führt), können Sie Aktionen für das aktuell sichtbare Fragment ausführen (was Sie normalerweise tun das aktuell sichtbare Fragment wissen wollen).

  1. stellen Sie sicher, dass Sie den Fragment-Lebenszyklus einhalten, und registrieren Sie den Event-Bus zu den entsprechenden Zeitpunkten
  2. an dem Punkt, an dem Sie das aktuell sichtbare Fragment kennen und eine Reihe von Aktionen ausführen müssen. schießen Sie ein Event mit dem Eventbus aus.

alle sichtbaren Fragmente, die sich beim Bus registriert haben, führen die erforderliche Aktion aus.

0
Kaushik Gopal

Hallo, ich weiß, dass dies ein sehr altes Problem ist, aber ich möchte meine eigene Lösung mitteilen.

Um die Liste der durchsuchten Fragmente durch den Benutzer abzurufen, habe ich eine Hilfsklasse erstellt:

public class MyHelperClass{

    private static ArrayList<Fragment> listFragment = new ArrayList<>();

    public static void addFragment(Fragment f){
        if(!existFragment(f)) {
            listFragment.add(f);
        }
    }
    public static void removeFragment(){
        if(listFragment.size()>0)
            listFragment.remove(listFragment.size()-1);
    }
    public static Fragment getCurrentFragment(){
        return listFragment.get(listFragment.size()-1);
    }
    public static int sizeFragments(){
        return listFragment.size();
    }
    private static Boolean existFragment(Fragment f){
        Boolean ret = false;
        for(Fragment fragment : listFragment){
            if (fragment.getClass() == f.getClass()){
                ret = true;
            }
        }
        return ret;
    }

Und in der Hauptaktivität überschreibe ich die onAttachFragment-Methode

@Override
public void onAttachFragment(Fragment f) {
    super.onAttachFragment(f);

    MyHelperClass.addFragment(f);
}

und auch ich überschreibe onBackPressed Method:

@Override
public void onBackPressed() {
        General.removeFragment();
        if(General.sizeFragments()>0){
            Fragment fragment = null;
            Class fragmentClass = General.getCurrentFragment().getClass();

            try {
                fragment = (Fragment) fragmentClass.newInstance();
                fragment.setArguments(General.getCurrentFragment().getArguments());
            } catch (Exception e) {
                e.printStackTrace();
            }

            fragmentManager.beginTransaction().replace(R.id.flContent, fragment).commit();
        }else{
            super.onBackPressed();
        }
}

auf diese Weise können Sie jederzeit das aktive Fragment mit MyHelperClass.getCurrentFragment () abrufen.

Ich hoffe, dass dies für alle hilfreich ist

grüße

0
Ruben Flores

Sie können eine Klassenvariable selectedFragment hinzufügen und jedes Mal, wenn Sie das Fragment ändern, aktualisieren Sie die Variable.

public Fragment selectedFragment;
public void changeFragment(Fragment newFragment){
    FragmentManager fragMgr = getSupportFragmentManager();
    FragmentTransaction fragTrans = fragMgr.beginTransaction();
    fragTrans.replace(Android.R.id.content, newFragment);
    fragTrans.addToBackStack(null);
    fragTrans.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
    fragTrans.commit();
    //here you update the variable
    selectedFragment = newFragment;
}

dann können Sie selectedFragment verwenden, wo immer Sie möchten

0
whd.nsr

Der einfachste Weg ist vielleicht:

public MyFragment getVisibleFragment(){
    FragmentManager fragmentManager = MainActivity.this.getSupportFragmentManager();
    List<Fragment> fragments = fragmentManager.getFragments();
    for(Fragment fragment : fragments){
        if(fragment != null && fragment.getUserVisibleHint())
            return (MyFragment)fragment;
    }
    return null;
}

Es hat für mich funktioniert

0
madx

Ich musste das erst kürzlich tun und keine der Antworten hier passte wirklich zu diesem Szenario.

Wenn Sie sicher sind, dass nur ein Fragment sichtbar ist (Vollbild), möchten Sie wirklich herausfinden, was sich oben im Backstack befindet. Zum Beispiel als Kotlin für Fragment:

import androidx.fragment.app.Fragment

fun Fragment.setVisibilityChangeListener(clazz: Class<out Fragment>, listener: (Boolean) -> Unit) {
    fragmentManager?.run {
        addOnBackStackChangedListener {
            val topFragmentTag = getBackStackEntryAt(backStackEntryCount - 1).name
            val topFragment = findFragmentByTag(topFragmentTag)
            listener(topFragment != null && topFragment::class.Java == clazz)
        }
    }
}

Und benutze es wie folgt:

class MyFragment: Fragment {
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        setVisibilityChangeListener(this::class.Java) { visible -> 
            // Do stuff
        }
    }
}
0
Mikel Pascual

Ich fand findFragmentByTag nicht so bequem. Wenn Sie String currentFragmentTag in Ihrer Activity oder übergeordneten Fragment haben, müssen Sie sie in onSaveInstanceState speichern und in onCreate wiederherstellen. Selbst wenn Sie dies tun, wird Activity vor dem Aufruf von onAttachFragment vor onCreate aufgerufen, sodass Sie currentFragmentTag nicht in onAttachFragment verwenden können (z. B. einige Ansichten basierend auf currentFragmentTag aktualisieren), da sie möglicherweise noch nicht wiederhergestellt wird.

Ich verwende den folgenden Code:

Fragment getCurrentFragment() {
    List<Fragment> fragments = getSupportFragmentManager().getFragments();
    if(fragments.isEmpty()) {
        return null;
    }
    return fragments.get(fragments.size()-1);
}

Das Dokument von FragmentManager sagt das aus

Die Reihenfolge der Fragmente in der Liste ist die Reihenfolge, in der sie hinzugefügt oder angehängt wurden.

Wenn Sie Dinge basierend auf dem aktuellen Fragmenttyp durchführen müssen, verwenden Sie einfach getCurrentFragment() instance of MyFragment anstelle von currentFragmentTag.equals("my_fragment_tag").

Beachten Sie, dass getCurrentFragment() in onAttachFragment nicht die anhängende Fragment erhält, sondern die zuvor angefügte.

0
Jeffrey Chen

das ist der beste Weg:

       Android.app.Fragment currentFragment=getFragmentManager().findFragmentById(R.id.main_container);
            if(currentFragment!=null)
            {
                String[] currentFragmentName = currentFragment.toString().split("\\{");
                if (currentFragmentName[0].toString().equalsIgnoreCase("HomeSubjectFragment"))
                {
                    fragment = new HomeStagesFragment();
                    tx = getSupportFragmentManager().beginTransaction();
                    tx.replace(R.id.main_container, fragment);
                    tx.addToBackStack(null);
                    tx.commit();
                }
                else if(currentFragmentName[0].toString().equalsIgnoreCase("HomeStagesFragment"))
                {
                    new AlertDialog.Builder(this)
                            .setMessage("Are you sure you want to exit?")
                            .setCancelable(false)
                            .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog, int id) {
                                    finish();
                                }
                            })
                            .setNegativeButton("No", null)
                            .show();
                }

            }

vergiss nicht, dies im Header zu definieren:

private Fragment fragment;
FragmentTransaction tx;
0
Osama Ibrahim

Bitte probieren Sie diese Methode aus ..... 

private Fragment getCurrentFragment(){
    FragmentManager fragmentManager = getSupportFragmentManager();
    String fragmentTag = fragmentManager.getBackStackEntryAt(fragmentManager.getBackStackEntryCount() - 1).getName();
    Fragment currentFragment = getSupportFragmentManager()
.findFragmentByTag(fragmentTag);
    return currentFragment;
}
0
Manmohan Soni

wenn getFragmentManager () nicht funktioniert, versuchen Sie es mit getSupportFragmentManager () und fügen Sie beim Laden des Fragments ein Tag hinzu.

public void onBackPressed(){

    Fragment fragment=getSupportFragmentManager().findFragmentByTag(/*enter your tag*/);


    if(fragment!=null && fragment.isVisible())
    {
        //do your code here
    }
    else
    {
       //do your code here
    }

}
0
Projit Roy

nun, ich denke, du willst sehen, in welchem ​​Fragment du bist. Ich glaube, es gibt eine Lösung. Ich glaube nicht, dass es das Beste ist, aber es funktioniert. Zuerst einmal.


sie sollten Ihr übergeordnetes Fragment so erstellen, dass es Fragment erweitert


public class Fragment2 extends Fragment {
    private static position;
    public static int getPosition() {
        return position;
    }

    public static void setPosition(int position) {
        FragmentSecondParent.position = position;
    }
}

Zweite

sie sollten es in jedem Fragment erweitern und in jedem in onCreateView schreiben

setPosition(//your fragmentposition here)

Dritter


wo Sie das aktuelle Fragment erhalten möchten, sollten Sie


schreib Dies

Fragment2 fragment= (Fragment2) getSupportFragmentManager()
    .findFragmentById(R.id.fragment_status);

int position = fragment.getPosition();
if(//position condition)
{
    //your code here
}
0
Farido mastr