현재 표시된 조각을 어떻게 얻습니까?


445

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 인스턴스를 어떻게 얻을 수 있습니까?



1
가능한 복제 현재 조각 개체
가져 오기

답변:


454

트랜잭션에 프래그먼트를 추가 할 때는 태그를 사용해야합니다.

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 ()와 같은 방법 "그들을 얻을",하지만 확실히 안드로이드 등의 방법이있다
Leem.fin

2
나는 이것이 왜 당신에게 문제인지 모르겠다 ... 당신은 보통 활동에 단편이 거의 없으며 실제로 눈에 보이는지 여부를 확인하는 것은 문제가되지 않는다.
ramdroid

12
왜이 답변을지지 하는가? 물론, 그것은 약간의 코드이지만 태그별로 특정 조각을 얻는 질문에 대답하지 않습니다. 그러나 Asker는 현재 표시된 조각을 원합니다. 즉, 어떤 조각이 표시되는지 알지 못합니다. 예, 조각이 여러 개있을 수 있지만 질문을 읽으면 UI에 조각 1 개만 표시되는 것으로 추론됩니다. 질문 컨텍스트에 응답하지 않으므로 다운 투트해야했습니다.
angryITguy 2016 년

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
Navigation Drawer를 사용하여 화면 회전 후 onBackPressed ()를 처리 할 때 찾고 있던 것입니다. 이 소식을 공유해 주셔서 감사합니다.
ShortFuse

1
findFragmentById가 모든 조각을 내부적으로 반복하지 않습니까? :)
Andrew Senner

46
경우에 .getFragmentManager호환되지 않는 유형을보고 내 경우처럼 나는를 사용했기 때문에, 그것은이다 android.support.app.v4.Fragment사용에 대한 권리 방법 인 경우에,getSupportFragmentManager
Razvan 보낸 Barbu

3
또는 태그를 추가 할 때 조각화 할 태그를 제공 한 경우 findFragmentByTag()대신 사용할 수 있습니다findFragmentByIdfragmentManager.beginTransaction() .add(containerID, frag, fragmentTag) .addToBackStack(fragmentTag) .commit();
DeltaCap019

@AndrewSenner, 그는 그가 명시 적으로하고 싶지 않다는 것을 의미합니다 :)
Farid

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

8
하나의 조각 만 보이는 것이 가능하기 때문에 방법이 불완전하다
letroll

조각이 보이지 않으면 fragmentManager.getFragments ()는 NULL을 리턴하여 NPE가 "NULL. 따라서 for 루프는 간단한 검사로 둘러싸여 야합니다. if (fragments! = null)
Pranav Mahajan

둘 이상의 조각이 보이는 경우 어떻게합니까?
Shivaraj Patil

5
기술적으로 이것은 질문을 기반으로 답변으로 표시되어야합니다. Asker는 현재 표시된 조각을 알고 싶어하며 조각이 무엇인지 모릅니다. 다른 답변은 태그로 조각을 점점 계속
angryITguy

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와 함께 사용되는 Fragments에는이 기술이 작동하지 않을 것이라고 확신합니다. 그냥 저기 던져.
loeschg

3
이것은 호출 할 때만 작동하는 것처럼 보이지만 addToBackStack(tag)백 스택에 조각을 추가하지 않으려면 어떻게해야합니까?
cprcrack

1
태그가 백 스택 이름과 동일한 경우에만 작동하며, 이는 비정상적인 것처럼 보입니다.

동일한 트랜잭션에 5 개의 조각을 추가하면 어떻게됩니까?
Kevin Lam

이름이 필요없는 일부 Fragment에 대해 addToBackStack (null)을 호출하면 getName () 메소드가 널을 리턴하고 NPE를 얻을 수 있습니다. @ dpk, docu의 말 :이 항목을 만들 때 FragmentTransaction.addToBackStack (String)에 제공된 이름을 가져옵니다. 또한 EntryCount가 0이고 최상위 항목을 받으려고하면 null 검사를 추가하십시오.
JacksOnF1re

23

현재 표시 조각을 찾는 데 사용하는 것은 아래 코드에 있습니다. 그것은 간단하고 지금까지 나를 위해 작동합니다. 조각을 보유하는 활동에서 실행됩니다.

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

3
그 GET은 (카운트 1) IndexOutOfBoundsException가 throw하지 않습니다 있도록해야합니다 수> 0으로 확인해야합니다
kehers

@tainy 이것은 교체되었지만 백 스택에 추가되지 않은 조각을 제공하지 않습니다. 그렇다면 태그 인수를 사용하여 얻을 수 있습니까?
cafebabe1991

getFragments 호출은 popBackStack (null, FragmentManager.POP_BACK_STACK_INCLUSIVE)을 호출 한 후 프래그먼트가 추가 된 순서를 제공하지 않으며 프래그먼트를 더 추가합니다.
LEHO

활동에 둘 이상의 조각이 표시되면 길은 잘못된 것입니다. 예를 들어 Fragments가 포함 된 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()API 26 이상인 프레임 워크 함수 의 함수를 언급 하고있었습니다.
ibit April

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
그 반응은 어떻습니까? Observable을 사용하지만 한 번만 방출됩니다
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 (...)를 호출 할 때 모든 조각에 하나의 태그를 사용할 수 있습니까?
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 값을 보유 할 수 있습니다. 식 : 당신은 안쪽에 당신의 방법을 선택하면 onBackStackChanged()방법 당신이 전화를 popBackStack()어딘가에, 다음이 mCurrentFragment될 것입니다 null.
Stumi

@Stumi이 정보에 감사드립니다. 그렇습니다 .Android의 많은 이상한 수명주기 문제 중 하나처럼 들립니다.
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() == true, 를 가질 수 있습니다 getView() != null. 또한 내 코드 getBackStackEntryCount에서 항상 0입니다. 메뉴를 사용하지 않더라도 isMenuVisible()현재 '활성'단편을 안정적으로 가리키는 유일한 판별자가 있습니다. ty
parvus

7

1)

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

2)

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

삼)

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장소는fragmentactivity

또는 더 나은 솔루션을 원한다면 :

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"와 함께 "이"당신의 현재 활동 또는 활동에 사용 기준이됩니다.


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
}


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

Sev의 대답 은 뒤로 버튼을 누르거나 백 스택을 변경하면 작동합니다.

그래도 약간 다른 것을했습니다. 기본 조각과 파생 조각에 백 스택 변경 리스너 설정이 있으며이 코드는 리스너에 있습니다.

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

실제로 뷰에 채워진 조각의 현재 인스턴스를 가져옵니다. 나는 같은 문제가 있었다. 백 스택에 하나를 유지하면서 동일한 조각을 두 번로드해야했습니다.

다음 방법이 작동하지 않습니다. 태그가있는 조각 만 가져옵니다. 이 방법에 시간을 낭비하지 마십시오. 나는 그것이 그것을 사용하고 있다고 확신하지만 동일한 조각의 최신 버전을 얻는 것은 그중 하나가 아닙니다.

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 Navigation 라이브러리
IgorGanapolsky

1

스크롤 된 조각의 경우 ViewPager 클래스의 인스턴스를 사용할 때 mVeiwPager가 있다고 가정하면 현재 조각 int 번호를 얻기 위해 mViewPager.getCurrentItem ()을 호출 할 수 있습니다.

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있는 경우 저장 하거나 복원해야합니다 . 그렇게해도 재생성 될 때 이전 에 호출 되므로 아직 복원되지 않았기 때문에 에서 사용할 수 없습니다 (예 :에 따라 일부보기 업데이트 ).ActivityFragmentonSaveInstanceStateonCreateActivityonAttachFragmentonCreatecurrentFragmentTagonAttachFragmentcurrentFragmentTag

다음 코드를 사용합니다.

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()onAttachFragment부착을받지 않습니다 Fragment만, 이전에 부착 한.


1

최근에이 작업을 수행해야했으며 여기에 대한 답변은이 시나리오에 실제로 맞지 않습니다.

하나의 조각 만 볼 수 있다고 확신하는 경우 (전체 화면) 실제로 백 스택의 맨 위에있는 것을 찾고 싶습니다. 예를 들어, 등 Kotlin을위한 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)
        }
    }
}

그리고 그것을 다음과 같이 사용하십시오 :

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

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

1

logcat의 URL을 사용하면 현재 조각 소스 코드의 소스 코드로 리디렉션하는 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.