현재 조각 개체를 가져옵니다


175

내에서 main.xml내가 가진

  <FrameLayout
        android:id="@+id/frameTitle"
        android:padding="5dp"
        android:layout_height="wrap_content"
        android:layout_width="fill_parent"
        android:background="@drawable/title_bg">
            <fragment
              android:name="com.fragment.TitleFragment"
              android:id="@+id/fragmentTag"
              android:layout_width="fill_parent"
              android:layout_height="wrap_content" />

  </FrameLayout>

그리고 저는 이와 같이 조각 객체를 설정하고 있습니다

FragmentManager fragmentManager = activity.getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
Fragment newFragment = new FragmentType1();
fragmentTransaction.replace(R.id.frameTitle, casinodetailFragment, "fragmentTag");

// fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();

FragmentType2,FragmentType3,...다른 시간에 다른 유형의 Fragment 객체 ( )를 설정하고 있습니다. 이제 어느 시점에서 현재 어떤 객체가 있는지 식별해야합니다.

에서 짧은 나는 같은 것을 할 필요가 :

Fragment currentFragment = //what is the way to get current fragment object in FrameLayout R.id.frameTitle

나는 다음을 시도했다

TitleFragment titleFragmentById = (TitleFragment) fragmentManager.findFragmentById(R.id.frameTitle);

    TitleFragment titleFragmentByTag = (TitleFragment) fragmentManager.findFragmentByTag("fragmentTag");

그러나 객체 (titleFragmentById 및 titleFragmentByTag)는 둘 다null
무엇입니까?
에 대해 사용 Compatibility Package, r3하고 개발 중입니다 API level 7.

findFragmentById()그리고 findFragmentByTag()우리가 사용하는 조각을 설정 한 경우 작동 fragmentTransaction.replace또는 fragmentTransaction.add것이지만 return null우리가 XML에서 (I 내에서 한 일을 같은 객체를 설정 한 경우 main.xml). XML 파일에 뭔가 빠진 것 같습니다.



여전히 null이 발생하기 때문에 @CommonsWare가 도움을 줍니까?
IntoTheDeep

답변:


253

이제 어느 시점에서 현재 어떤 객체가 있는지 식별해야합니다

전화 findFragmentById()FragmentManager당신에있는 조각을 결정 R.id.frameTitle컨테이너입니다.


1
답변 주셔서 감사합니다. fragmentTransaction.replace를 사용하여 조각을 설정하면 작동 fragmentTransaction.add하지만 xml에서 설정하면 작동하지 않습니다. 내 편집 2
Labeeb Panampullan

9
@Labeeb P : 레이아웃 리소스에 선언 된 조각을 수정할 수 없습니다.
CommonsWare

현재 보이는 탭 / 조각을 보유하는 클래스를 만드는 것도 효과가 있습니다. 실패가 없기를 바랍니다.
Skynet

탭의 findFragmentByTag경우 @CommonsWare가 null을 반환 ActionBar합니다. 내 Activity확장 중 ActionBarActivity먼저 탭을 추가 ActionBar한 다음 찾아야합니다!
Muhammad Babar

1
@ MuhammadBabar : 시도 하지는 않았지만 거래 executePendingTransactions()FragmentManager한 후에 시도 할 수 있습니다 commit(). 또는 태그가 setContentView()있는 레이아웃 파일을 사용하는 데 사용할 수 있습니다 <fragment>. 어느 사람들의 동기 일이, 그래서 조각은 내 존재하는 것입니다 onCreate()당신이 사용하는 전화 자체 executePendingTransaction()setContentView(). 그렇지 않으면 일반 FragmentTransaction은 비동기 적으로 처리되며 시간이 onCreate()끝날 때까지 시작되지 않습니다 .
CommonsWare

110

이 시도,

Fragment currentFragment = getActivity().getFragmentManager().findFragmentById(R.id.fragment_container);

이것은 당신에게 현재 조각을 줄 것이고, 당신은 그것을 조각 클래스와 비교하고 물건을 할 수 있습니다.

    if (currentFragment instanceof NameOfYourFragmentClass) {
     Log.v(TAG, "find the current fragment");
  }

이 줄을 어디에 둘까?
Anand Savjani

9
때때로 getSupportFragmentManager()대신 대신 사용해야 하고, support부분 없이 널을 가져옵니다
Muz

"NAME OF YOUR FRAGMENT CLASS"주위의 따옴표를 제거하십시오.
Alan Nelson

37

onAttachFragment 이벤트를 사용 하여 활성화 된 조각을 포착하는 데 유용 할 수 있다고 생각합니다 .

@Override
public void onAttachFragment(Fragment fragment) {
    // TODO Auto-generated method stub
    super.onAttachFragment(fragment);

    Toast.makeText(getApplicationContext(), String.valueOf(fragment.getId()), Toast.LENGTH_SHORT).show();

}

3
내가 첨부 된 조각을 얻을 수 있습니다. 내 dought은 방향을 변경할 때 다른보기가 아닌 동일한보기를 표시해야 하므로이 작업을 수행하는 방법입니다.
Androi 개발자 1

7
되돌아 갈 때 활성 조각을 업데이트하지 않기 때문에 작동하지 않습니다.
저스틴

1
@Justin 우리는 onDetach를 약한 참조 목록과 함께 사용해야합니다
letroll

12

나는 당신이해야한다고 생각합니다 :

Fragment currentFragment = fragmentManager.findFragmentByTag("fragmentTag");

그 이유는 "fragmentTag"태그를 추가 한 마지막 조각 (바꾸기라고 함)으로 설정했기 때문입니다.


감사합니다. 수정했습니다. 이 질문을 쓰는 동안 오타 실수입니다. fragmentTransaction.replace를 사용하여 조각을 설정하면 작동 fragmentTransaction.add하지만 xml에서 설정하면 작동하지 않습니다. 내 편집 2 참조
Labeeb Panampullan

정말 고맙습니다! 내 문제를 해결했습니다!
Jonas Gröger

2
이 솔루션이 여러 조각에 동일한 태그를 넣어야한다는 것을 의미하지 않습니까? 그렇지 않으면 fragmentTag현재 조각의 태그가 어떻게 알 수 있습니까?
Thupten

12

조각 목록을 가져 와서 마지막 조각을 볼 수 있습니다.

    FragmentManager fm = getSupportFragmentManager();
    List<Fragment> fragments = fm.getFragments();
    Fragment lastFragment = fragments.get(fragments.size() - 1);

그러나 때로는 (뒤로 탐색 할 때) 목록 크기가 동일하지만 마지막 요소 중 일부가 null입니다. 그래서 목록에서 마지막 null이 아닌 조각으로 반복하여 사용했습니다.

    FragmentManager fm = getSupportFragmentManager();
    if (fm != null) {
        List<Fragment> fragments = fm.getFragments();
        if (fragments != null) {
            for(int i = fragments.size() - 1; i >= 0; i--){
                Fragment fragment = fragments.get(i);
                if(fragment != null) {
                    // found the current fragment

                    // if you want to check for specific fragment class
                    if(fragment instanceof YourFragmentClass) {
                        // do something
                    }
                    break;
                }
            }
        }
    }

3
getFragments()방법을 사용하지 마십시오 . @hide지원 라이브러리 jar 로 표시 되어 있으며 포함되어서는 안됩니다. 내 보낸 API의 일부로 간주해서는 안됩니다.
James Wald

그렇다면 그들은 getFragments()종종 당신이 그것을 필요로하기 때문에 정확히 무엇을 할 수있는 방법을 만들었을 것입니다 . 실제로는 공개적으로 사용할 수 있다고 생각합니다.
EpicPandaForce 2016 년

10

이것은 가장 간단한 해결책이며 나를 위해 일합니다.

1.) 조각을 추가합니다

ft.replace(R.id.container_layout, fragment_name, "fragment_tag").commit();

2.)

FragmentManager fragmentManager = getSupportFragmentManager();

Fragment currentFragment = fragmentManager.findFragmentById(R.id.container_layout);

if(currentFragment.getTag().equals("fragment_tag"))

{

 //Do something

}

else

{

//Do something

}

9

늦었을 수도 있지만 다른 사람을 돕기를 바랍니다. 또한 @CommonsWare가 정답을 게시했습니다.

FragmentManager fm = getSupportFragmentManager();
Fragment fragment_byID = fm.findFragmentById(R.id.fragment_id);
//OR
Fragment fragment_byTag = fm.findFragmentByTag("fragment_tag");

9
ID 또는 태그를 반드시 알 필요는 없으므로 활성 조각을 가져올 수 없습니다.
저스틴

7

아마도 가장 간단한 방법은 다음과 같습니다.

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

그것은 나를 위해 일했다


6

부모 활동 클래스에서 필드를 만들 수 있습니다.

public class MainActivity extends AppCompatActivity {

    public Fragment fr;

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

}

그런 다음 각 조각 클래스 내부에서

public class SomeFragment extends Fragment {

@Override
    public View onCreateView(LayoutInflater inflater,
                             ViewGroup container, Bundle savedInstanceState) {

        ((MainActivity) getActivity()).fr = this;
}

'fr'필드는 현재 조각 객체입니다.

popBackStack ()에서도 작동합니다.


4

나는 그것이 오래되었다는 것을 알고 있지만 누군가를 도울 수 있도록 여기에 있습니다.

정답 훨씬이다 (그리고 선택한 일) CommonsWare의 하나. 게시 된 것과 동일한 문제가 발생했습니다. 다음

MyFragmentClass fragmentList = 
            (MyFragmentClass) getSupportFragmentManager().findFragmentById(R.id.fragementID);

null을 계속 반환했습니다. 내 실수는 내 XML 파일에서 정말 어리석은 것이었다.

<fragment
    android:tag="@+id/fragementID"
    android:name="com.sf.lidgit_android.content.MyFragmentClass"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
/>

실수는 android : tag INSTEAD OF android : id라는 것 입니다.


2

@ 해머 응답은 플로팅 액션 버튼을 제어하는 ​​데 사용했습니다.

final FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(final View view) {
            android.app.Fragment currentFragment = getFragmentManager().findFragmentById(R.id.content_frame);
            Log.d("VIE",String.valueOf(currentFragment));
            if (currentFragment instanceof PerfilFragment) {
                PerfilEdit(view, fab);
            }
        }
});


1

액티비티의 XML 파일에서 프래그먼트를 정의하는 경우을 Activity호출 setContentView()하기 전에 호출 해야합니다 findFragmentById().


1

BackStack을 사용하는 경우 ... 그리고 백 스택을 사용하는 경우에만 다음을 시도하십시오.

rivate Fragment returnToPreviousFragment() {

    FragmentManager fm = getSupportFragmentManager();

    Fragment topFrag = null;

    int idx = fm.getBackStackEntryCount();
    if (idx > 1) {
        BackStackEntry entry = fm.getBackStackEntryAt(idx - 2);
        topFrag = fm.findFragmentByTag(entry.getName());
    }

    fm.popBackStack();

    return topFrag;
}

0

이것은 당신에게 현재 조각 클래스 이름을 줄 것입니다->

String fr_name = getSupportFragmentManager().findFragmentById(R.id.fragment_container).getClass().getSimpleName();

0
  1. onStart 메소드에서 점검 (활동 컨테이너의 조각)을 수행하십시오.

    @Override
    protected void onStart() {
    super.onStart();
    Fragment fragmentCurrent = getSupportFragmentManager.findFragmentById(R.id.constraintLayout___activity_main___container);
    }
  2. 몇 가지 확인 :

    if (fragmentCurrent instanceof MenuFragment) 
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.