현재 표시된 조각을 가져오려면 어떻게 해야 합니까?
나는 안드로이드에서 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
는 것은입니다.id
fragment
그들의 위에서 발표하는 것입니다.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
사할수없다니습용다니없을 사용할 수 .currentFragmentTag
onAttachFragment
(으)로 를 업데이트합니다.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
'programing' 카테고리의 다른 글
'sudogem install' 또는 'sudogem install' 및 gem 위치 (0) | 2023.06.04 |
---|---|
루비 패스는 레퍼런스입니까, 아니면 값입니까? (0) | 2023.06.04 |
RichTextBox(WPF)에 "Text" 문자열 속성이 없습니다. (0) | 2023.06.04 |
처음 사용한 후에도 할당된(재) 변수(글로벌이어야 함)를 사용하려고 하는 UnboundLocalError (0) | 2023.06.04 |
사용자가 목록 항목을 마우스로 가리킬 때 커서를 손으로 바꾸는 방법은 무엇입니까? (0) | 2023.06.04 |