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

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



답변

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

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


답변

나는 그것이 오래된 게시물이라는 것을 알고 있지만 이전에도 문제가있었습니다. 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);
}


답변

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

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


답변

코 틀린 방식;

val currentFragment = supportFragmentManager.fragments.last()


답변

반응 방법 :

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