現在表示されているフラグメントを取得するにはどうすればよいですか?


444

Androidでフラグメントを操作しています。

次のコードを使用してフラグメントを変更できることを知っています。

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

私の質問は、Javaファイルで、現在表示されているFragmentインスタンスを取得するにはどうすればよいですか?



回答:


453

トランザクションにフラグメントを追加するときは、タグを使用する必要があります。

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

...後でフラグメントが表示されているかどうかを確認する場合:

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

http://developer.android.com/reference/android/app/Fragment.htmlも参照してください


74
わかりましたが、現在表示されているFragmentインスタンスをすぐに取得する方法が必要です。すべてのフラグメントを繰り返し確認してから、画面に表示されているフラグメントを判断する方法は必要ありません。私はあなたの答えが私のフラグメントのそれぞれを繰り返しチェックし、目に見えるものを見つけるために私のコードが必要だと思います...
Leem.fin

33
はい。ただし、一度に複数のフラグメントが表示される可能性があります。だから、「唯一の活性な断片」のようなものは何も....ありません
ramdroid

6
わかりました、いくつかのフラグメントが表示されている場合でも、それらを取得する方法が必要です...そして、各フラグメントを繰り返しチェックするよりも良い方法です。getDisplayedFragment()のようなメソッドを「取得」することに懸念がありますが、Androidにそのようなメソッドがあるかどうかは
わかり

2
これがなぜあなたにとって問題であるのかわかりません...通常、アクティビティにはフラグメントがほとんどないので、それらが表示されているかどうかを確認しても問題にはなりません。
ramdroid

12
なぜ誰もがこの答えに賛成しているのですか?確かに、これはいいコードですが、タグで特定のフラグメントを取得するための質問には答えません。しかし、Askerは現在表示されているフラグメントを必要としています。はい、複数のフラグメントが存在する可能性がありますが、質問を読むと、UIに表示されるフラグメントは1つだけであると推測されます。
angryITguy

410

私はそれが古い記事であることを知っていますが、以前にも問題がありました。onBackStackChanged()リスニング機能でこれを行うための解決策を見つけました

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

    }

目に見えるものを見つけるために必要なすべてのフラグメントを繰り返し処理したくなかったので、これは私にとってはうまくいきました。それが他の誰かにも役立つことを願っています。


13
ナビゲーションドロワーで画面を回転した後、onBackPressed()を処理するときに私が探していたものとまったく同じです。これを共有するために戻ってきてくれてありがとう。
ShortFuse 2014

1
findFragmentByIdはすべてのフラグメントを内部的に反復しませんか?:)
Andrew Senner、2015年

46
場合には.getFragmentManager、それは私の場合で行ったように私が使っていたので、それは、互換性のない型を報告しandroid.support.app.v4.Fragment使用する権利方法がある場合には、getSupportFragmentManager
はRazvan Barbuの

3
またはに追加するときにフラグメント化するタグを提供した場合findFragmentByTag()、の代わりに使用できますfindFragmentByIdfragmentManager.beginTransaction() .add(containerID, frag, fragmentTag) .addToBackStack(fragmentTag) .commit();
DeltaCap019

@AndrewSenner、彼は彼が明示的にそれをしたくなかったということを意味します:)
ファリッド

161

これは、フラグメントの少ないシナリオに便利な私の解決策です

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

13
fragmentバックスタックをポップするときなど、特定のシナリオではnullになることがあります。だからより良い使用if (fragment != null && fragment.isVisible())
cprcrack 14

8
フラグメントが1つしか表示されていない可能性があるため、メソッドは不完全
letroll

フラグメントが表示されていない場合、fragmentManager.getFragments()はNULLを返し、NPEは「NULLオブジェクト参照でインターフェースメソッド 'java.util.Iterator java.util.List.iterator()'を呼び出そうとしました」と表示します。したがって、forループは単純なチェックで囲む必要があります
。if

複数のフラグメントが表示されている場合はどうなりますか?
Shivaraj Patil 2016

5
技術的には、これは質問に基づく回答としてマークする必要があります。アスカーは、現在表示されているフラグメントが必要ですが、それがどのフラグメントであるかを知りません。その他の回答はタグでフラグメントを取得し続けます
angryITguy 2017年

76

フラグメントを表示するたびに、タグをバックスタックに配置する必要があります。

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

そして、現在のフラグメントを取得する必要がある場合は、このメソッドを使用できます。

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

4
タグで追加されていないため、この手法はViewPagerで使用されるフラグメントには機能しないとかなり確信しています。そこに投げるだけです。
loeschg 2014年

3
これはを呼び出したときにのみ機能するようaddToBackStack(tag)ですが、フラグメントをバックスタックに追加したくない場合はどうなりますか?
cprcrack 14

1
これは、タグが偶然バックスタック名と同じである場合にのみ機能します。

同じトランザクションで5つのフラグメントを追加するとどうなりますか?
Kevin Lam

名前を必要としないFragmentに対してaddToBackStack(null)を呼び出すと、メソッドgetName()がnullを返し、NPEを取得できると言ってもいいでしょう。@ dpk、docuによると:このエントリの作成時にFragmentTransaction.addToBackStack(String)に指定された名前を取得します。また、EntryCountが0で、最上位のエントリを受信しようとした場合は、nullチェックを追加します。
JacksOnF1re 2014

23

現在表示されているフラグメントを見つけるために使用しているのは、以下のコードです。それはシンプルで、今ではうまくいきます。フラグメントを保持するアクティビティで実行されます

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

3
get(count-1)がIndexOutofBoundsExceptionをスローしないように、count> 0であることを確認してください
kehers

@tainyこれは、置き換えられたがバックスタックに追加されなかったフラグメントを与えません。はいの場合、タグ引数を使用して取得できますか?
cafebabe1991

getFragmentsを呼び出しても、popBackStack(null、FragmentManager.POP_BACK_STACK_INCLUSIVE)を呼び出してフラグメントを追加した後、フラグメントに追加された順序は表示されません。
LEHO 2016

アクティビティに複数のフラグメントが表示されている場合、あなたのやり方は間違っています。例:フラグメントを含むViewPager。getBackStackEntryCount()はフラグメントの数ではなくトランザクションの数を返します
HungNM2

それらは必ずしも等しいとは限らないので、fragManager.getFragments().size()代わりにチェックするgetBackStackEntryCount()必要があります(これは私の場合です)。そうしないと、IndexOutOfBoundsExceptionでクラッシュする可能性があります
RustamG

19

コトリンウェイ;

val currentFragment = supportFragmentManager.fragments.last()

API 26以降でのみ機能
ibit

1
@ibit API 26以上でのみ動作するということはどういう意味ですか?私はエミュレーターAPI 19がうまく機能することを試しました。
HendraWD

@HendraWD正解です!私はフレームワークgetFragments()関数の関数を参照していました。API26以上です。
ibit

2
気を付けて。前にフラグメントスタックがない場合は、空の例外が発生する可能性があります。
Jetwiz、

これは機能しませんか?java.lang.ClassCastException:androidx.navigation.fragment.NavHostFragmentをFragmentにキャストできない
coolcool1994

13

反応方法:

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

7
その反応はどうですか?オブザーバブルを使用するが、それは1度だけ放出する
Tim

6
そしてそれはただのやり過ぎです。単純な強化されたforloopも同じように実行され、おそらくさらに高速になります。
Peterstev Uremgba

ただ、ストリームAPIの反応ストリームを使用して、実際に彼らはそれはあなたがストリームとしてリストを扱い、フィルターAPIを適用したい場合は、蒸気Java8 APIを使用してやり過ぎであるスマート言ったようにということではありません
AndroidLover

13

私の方法は、次のようなtry / catchに基づいています。

MyFragment viewer = null;
    if(getFragmentManager().findFragmentByTag(MY_TAG_FRAGMENT) instanceOf MyFragment){
    viewer = (MyFragment) getFragmentManager().findFragmentByTag(MY_TAG_FRAGMENT);
}

しかし、もっと良い方法があるかもしれません...


1
私の質問は、現在表示されているフラグメントを取得する方法です。つまり、フラグメントが多数存在する可能性があります。現在表示されているフラグメントのインスタンスのみを取得したいのですが、(MyFragment)を使用する理由は何ですか?画面上の任意のフラグメント表示である可能性があることを意味します...そして現在表示されているものを取得したいと思います。
Leem.fin

MY_TAG_FRAGMENTは、次のように、置換を使用する前に作成したフラグメントのタグです。fragmentTransaction.replace(R.id.FL_MyFragment、MyFragment、MY_TAG_FRAGMENT);
Thordax

複数のフラグメントがある場合、.replace(...)を呼び出すときにすべてのフラグメントに1つのタグを使用できますか?
Leem.fin

はい、問題ありません。次のコードを使用してください:fragmentTransaction.replace(R.id.FL_MyFragment、MyFragment、MY_TAG_FRAGMENT); うまくいくかもしれません。
Thordax

1
まあ、私は本当にあなたのポイントを理解していません。つまり、現在表示されているFragmentインスタンスをすぐに取得する方法が必要です。すべてのフラグメントを繰り返しチェックしてから、どのフラグメントが画面に表示されているかを判断する必要はありません。
Leem.fin

11

さて、この質問は多くの意見と注目を集めましたが、それでも私の最後からの最も簡単な解決策は含まれていませんでした-getFragments()を使用することです。

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

1
残念ながら、これは常に正しいとは限りません。これgetSupportFragmentManager().getFragments() によりリストが返されますが、最新のフラグメントがバックスタックからポップされたばかりの場合は、null値を保持できます。Eq:onBackStackChanged()メソッド内で方法を確認し、popBackStack()どこかを呼び出すと、はにmCurrentFragmentなりますnull
Stumi

@Stumiこの情報をありがとう。はい、Androidのライフサイクルに関する多くの奇妙な問題の1つに聞こえます。
Nativ

9

アクティビティコンテンツフレームにロードされているフラグメントを照会し、フラグメントクラスまたはフラグメントの「単純名」を(文字列として)取得できます。

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

使用法:

Log.d(TAG, getCurrentFragment());

出力:

D/MainActivity: FragOne

8

少し遅いですが、興味のある人のために:FragmentManagerで目的のフラグメントのインデックスがわかっている場合は、それへの参照を取得してisMenuVisible()関数を確認してください!ここに :

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

もしtrueその目に見えるユーザーにというように!


1
不思議なことに、これはここでリストされた私にとって有効な唯一の解決策でした。同時に、複数のフラグメントを持つことができisVisible() == truegetView() != null。さらに、私のコードでgetBackStackEntryCountは常にゼロです。私はメニューを使用していませんisMenuVisible()が、これまでのところ、現在「アクティブ」なフラグメントを確実に指していると思われる唯一の判別式です。ty
parvus 2015年

7

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

ここに来てKotlinを使用している場合

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

R.id.fragment_containerあるid場所fragmentその上で提示していますactivity

または、より良いソリューションが必要な場合:

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

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

5

Tainyの答えに触発されて、ここに私の2セントがあります。他のほとんどの実装からほとんど変更されていません。

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

"myActivity"現在のアクティビティの場合は「this」に置き換えるか、アクティビティへの参照を使用してください。


5

というメソッドがあります findFragmentById()ではSupportFragmentManager。私はそれをアクティビティコンテナで使用します:

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

それはあなたの現在を取得する方法Fragmentです。カスタムがあり、それがFragment何であるかを確認する必要がある場合Fragment、私は通常以下を使用しますinstanceof

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

5

を使用している場合AndroidX Navigation

val currentFragment = findNavController(R.id.your_navhost).?currentDestination

このナビゲーションコンポーネントの詳細:https : //developer.android.com/guide/navigation/navigation-getting-started


これはコンパイルされません
IgorGanapolsky

1
AndroidXナビゲーションを適切に設定し、何らかの方法でnavHostを呼び出した場合にのみコンパイルされますyour_navhost
Cory Roy

4

これは、現在のフラグメントを取得する簡単な方法です。

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

セブの答えは、戻るボタンを押すか、バックスタックを変更したときに機能します。

でも、少し違うことをしました。ベースFragmentとその派生フラグメントにバックスタック変更リスナーを設定しており、このコードはリスナーにあります。

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
}

3

これは私の仕事です。これが誰かを助けてくれることを願っています。

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

3

親アクティビティからFragmentの現在のインスタンスを取得している場合は、

findFragmentByID(R.id.container);

これは実際には、ビューに入力されているフラグメントの現在のインスタンスです。同じ問題がありました。同じフラグメントを2回ロードして、1つをバックスタックに保持する必要がありました。

次の方法は機能しません。タグの付いたフラグメントを取得するだけです。この方法で時間を無駄にしないでください。私はそれが用途を持っていると確信していますが、同じフラグメントの最新バージョンを取得することはそれらの1つではありません。

findFragmentByTag()

3

このソリューションを確認してください。現在のフラグメントを取得するのに役立ちました。

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

これはJetpackで動作しますか?
IgorGanapolsky

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

さて、これはこの質問に対する最も簡単な答えだと思います。これがお役に立てば幸いです。


2

Kotlinソリューションは次のとおりです。

if ( this.getSupportFragmentManager().getBackStackEntryCount()>0 ) {
    var fgmt = this.getSupportFragmentManager().fragments[this.getSupportFragmentManager().getBackStackEntryCount()-1]
    if( fgmt is FgmtClassName ) {
        (fgmt as FgmtClassName).doSth()
    }
}

簡略化された方法:

with ( this.getSupportFragmentManager() ) {
    if ( getBackStackEntryCount()>0 ) {
        var fgmt = fragments[getBackStackEntryCount()-1]
        if ( fgmt is FgmtClassName ) {
            (fgmt as FgmtClassName).doSth()
        }
    }
}

2

それを行う簡単な方法:

Fragment fr=getSupportFragmentManager().findFragmentById(R.id.fragment_container);
String fragmentName = fr.getClass().getSimpleName();

1

メインアクティビティでは、新しいフラグメントがアクティビティにアタッチされると、onAttachFragment(Fragment fragment)メソッドが呼び出されます。このメソッドでは、現在のフラグメントのインスタンスを取得できます。ただし、フラグメントがバックスタックからポップされたとき、つまり、戻るボタンが押されてスタックの一番上のフラグメントが取得されたとき、onAttachFragmentメソッドは呼び出されません。アクティビティ内でフラグメントが表示されたときにメインアクティビティでトリガーされるコールバックメソッドをまだ探しています。


とても近い!:-)
Blundell

Jetpackナビゲーションライブラリ
IgorGanapolsky

1

スクロールされたフラグメントの場合、ViewPagerクラスのインスタンスを使用するときにmVeiwPagerを想定すると、mViewPager.getCurrentItem()を呼び出して現在のフラグメントのint番号を取得できます。

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>

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

findFragmentByTagはそれほど便利ではないことがわかりました。あなたが持っている場合はString currentFragmentTag、あなたの中Activityや親Fragment、あなたはそれを保存する必要があるonSaveInstanceStateとそれを復元しますonCreate。あなたがそうする場合であっても、ときActivityに再作成、onAttachFragment前に呼び出されますonCreate、あなたが使用することはできませんので、currentFragmentTagonAttachFragment(例えば基づいて、いくつかのビューを更新currentFragmentTag)、それのかもしれないが、まだ回復していないので。

次のコードを使用します。

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

そのFragmentManager状態の文書

リスト内のフラグメントの順序は、フラグメントが追加または添付された順序です。

現在のフラグメントタイプに基づいて処理を行う必要がある場合は、のgetCurrentFragment() instance of MyFragment代わりに使用してくださいcurrentFragmentTag.equals("my_fragment_tag")

でアタッチが取得されないことgetCurrentFragment()に注意してください。onAttachFragmentFragment


1

私は最近これを行わなければならず、ここでの答えはどれもこのシナリオに本当に適していませんでした。

1つのフラグメントのみが表示される(全画面)確信している場合は、バックスタックの最上部にあるものを本当に見つけたいと考えています。たとえば、次のようKotlinFragment

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

そしてそれを次のように使用します:

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

        setVisibilityChangeListener(this::class.java) { visible -> 
            // Do stuff
        }
    }
}

1

現在のフラグメントソースコードのソースコードにリダイレクトするlogcatのURLを使用しても、非常に簡単に行うことができます。まず、次のようなホストアクティビティにOnBackStackChangedListenerを追加する必要があります-

activity.getChildFragmentManager().addOnBackStackChangedListener(backStackListener);

そして、OnBackStackChangedListener実装は-

    public FragmentManager.OnBackStackChangedListener backStackListener = () -> {

    String simpleName = "";
    String stackName = getStackTopName().trim();

    if (Validator.isValid(stackName) && stackName.length() > 0) {

      simpleName = stackName.substring(Objects.requireNonNull(stackName).lastIndexOf('.') + 1).trim();

      List<Fragment >
       fragmentList = getChildFragmentManager().getFragments();
      Fragment myCurrentFragment;

      for (int i = 0; i < fragmentList.size(); i++) {
       myCurrentFragment= fragmentList.get(i);
       if (myCurrentFragment.getClass().getSimpleName().equals(simpleName)) {
        //Now you get the current displaying fragment assigned in myCurrentFragment.
        break;
       }
       myFragment = null;
      }
     }


     //The code below is for the source code redirectable logcat which would be optional for you.
     StackTraceElement stackTraceElement = new StackTraceElement(simpleName, "", simpleName + ".java", 50);
     String fileName = stackTraceElement.getFileName();
     if (fileName == null) fileName = "";
     final String info = "Current Fragment is:" + "(" + fileName + ":" +
     stackTraceElement.getLineNumber() + ")";
     Log.d("now", info + "\n\n");
    };

そしてgetStackTopName() メソッドは-

public String getStackTopName() {
    FragmentManager.BackStackEntry backEntry = null;
    FragmentManager fragmentManager = getChildFragmentManager();
    if (fragmentManager != null) {
        if (getChildFragmentManager().getBackStackEntryCount() > 0)
            backEntry = getChildFragmentManager().getBackStackEntryAt(
                    getChildFragmentManager().getBackStackEntryCount() - 1
            );
    }
    return backEntry != null ? backEntry.getName() : null;
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.