programing

현재 표시된 조각을 가져오려면 어떻게 해야 합니까?

javamemo 2023. 6. 4. 10:15
반응형

현재 표시된 조각을 가져오려면 어떻게 해야 합니까?

나는 안드로이드에서 fragment를 가지고 놀고 있습니다.

다음 코드를 사용하여 fragment를 변경할 수 있습니다.

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

제가 궁금한 것은 자바 파일에서 현재 표시된 Fragment 인스턴스를 어떻게 얻을 수 있을까요?

트랜잭션에 조각을 추가할 때 태그를 사용해야 합니다.

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

...나중에 조각이 표시되는지 확인하려는 경우:

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

http://developer.android.com/reference/android/app/Fragment.html 도 참조하십시오.

오래된 게시물인 건 알지만, 이전에도 문제가 있었습니다. 수찾을해다니았에서 .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();

    }

이것은 저에게 효과가 있었습니다. 눈에 보이는 모든 조각을 반복하고 싶지 않았기 때문입니다.

다음은 단편화가 낮은 시나리오에 유용한 솔루션입니다.

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

조각을 표시할 때마다 태그를 백스택에 넣어야 합니다.

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

코틀린웨이;

val currentFragment = supportFragmentManager.fragments.last()

현재 표시되는 fragment를 찾기 위해 사용하고 있는 것은 아래 코드입니다.그것은 간단하고 지금쯤은 저에게 효과가 있습니다.조각을 보관하는 활동에서 실행됩니다.

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

사후 대응 방식:

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

내 방법은 다음과 같은 시도/획득을 기반으로 합니다.

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

하지만 더 좋은 방법이 있을지도...

을 사용하는 AndroidX Navigation:

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

이 탐색 구성 요소에 대한 자세한 내용은 https://developer.android.com/guide/navigation/navigation-getting-started 을 참조하십시오.

글쎄요, 이 질문은 많은 견해와 관심을 얻었지만 여전히 getFragments()를 사용하는 가장 쉬운 해결책을 포함하지 않았습니다.

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

활동 내용 프레임에 로드되는 조각을 쿼리하고 조각 클래스 또는 조각 '단순 이름'(문자열)을 검색할 수 있습니다.

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

용도:

Log.d(TAG, getCurrentFragment());

출력:

D/MainActivity: FragOne

여기에 와서 Kotlin을 사용하는 경우:

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

R.id.fragment_container는 것은입니다.idfragment그들의 위에서 발표하는 것입니다.activity

또는 더 나은 솔루션을 원하는 경우:

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

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

조금 늦었지만, 관심 있는 사람이라면 누구나 : Fragment Manager에서 원하는 fragment의 인덱스를 알고 있다면 그것에 대한 참조를 얻어서 isMenuVisible() 함수를 확인하세요!여기:

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

한다면true사용자 등이 볼 수 있습니다!

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
}

라는 방법이 있습니다.findFragmentById()SupportFragmentManager는 :▁:▁like▁container다▁activity사니와 같은 활동 용기에 사용합니다.

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

그게 당신의 전류를 얻는 방법입니다.Fragment 지정이 Fragment그리고 무엇을 확인할 필요가 있습니다.Fragment네, 저는 주로 사용합니다.instanceof:

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

효과가 있을 겁니다

val visibleFragment = supportFragmentManager.fragments.findLast { fgm -> fgm.isVisible }
Timber.d("backStackIterator: visibleFragment: $visibleFragment")

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"현재 활동 또는 활동에 대한 참조를 사용하는 경우 "이것"으로 표시합니다.

이것은 현재 조각을 가져오는 간단한 방법입니다.

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

이 솔루션을 확인하십시오.현재의 프래그먼트를 얻는 것이 효과가 있었습니다.

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

그것은 매우 간단하고, 당신이 작성할 필요가 있는 코드는 그렇게 많지 않습니다.yourFragment.isAdded()또는yourFragment.isVisible();

추가됨()을 선호합니다. 둘 다 부울 값을 반환합니다. 둘 다 if 조건에서 사용하고 fragment를 onCreate()에서 초기화해야 합니다. 그렇지 않으면 null 포인트 예외가 발생합니다.

위의 30개의 답변 중 어느 것도 저에게 완전히 효과가 없었습니다.하지만 여기에 효과적인 답이 있습니다.

Navigation Component 사용 시 Kotlin 사용:

fun currentVisibleFragment(): Fragment? {
    return supportFragmentManager.fragments.first()?.getChildFragmentManager()?.getFragments()?.get(0)
}

Sev의 대답은 뒤로 버튼을 누르거나 뒤로 스택을 변경할 때 사용됩니다.

하지만 저는 약간 다른 것을 했습니다.기본 Fragment와 파생된 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
}

간편한 방법:

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

저는 아주 최근에 이것을 해야만 했습니다.

public Fragment getCurrentFragment() {
     return fragmentManager.findFragmentById(R.id.container);
}

그리고 마침내 나는 이 컨테이너의 마지막 조각을 얻었습니다.

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

부모 활동에서 현재 Fragment 인스턴스를 가져오는 경우 다음을 수행할 수 있습니다.

findFragmentByID(R.id.container);

이것은 실제로 뷰에 채워진 조각의 현재 인스턴스입니다.저도 같은 문제가 있었습니다.같은 조각을 백스택에 두 번 로드해야 했습니다.

다음 방법은 작동하지 않습니다.태그가 있는 조각을 얻을 뿐입니다.이 방법에 시간을 낭비하지 마세요.용도가 있다고 확신하지만 동일한 프래그먼트의 최신 버전을 얻는 것은 그 중 하나가 아닙니다.

findFragmentByTag()

코틀린은 여기서 노출되는 것보다 안전한 방법입니다.

supportFragmentManager.fragments.lastOrNull()?.let { currentFragment ->
               
      //Do something here
 }

이것은 나를 위한 일입니다.이것이 누군가에게 도움이 되기를 바랍니다.

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

찾았습니다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()onAttachFragment연결을 받지 않습니다.Fragment하지만 앞에 첨부된 것은.

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

저는 이것이 이 질문에 대한 가장 솔직한 대답이라고 생각합니다.이것이 도움이 되길 바랍니다.

언급URL : https://stackoverflow.com/questions/9294603/how-do-i-get-the-currently-displayed-fragment

반응형