获取当前的片段对象

在我的 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 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开发。

如果我们已经使用 fragmentTransaction.replacefragmentTransaction.add设置了片段,那么 findFragmentById()findFragmentByTag()将工作,但是如果我们已经在 xml 处设置了对象(就像我在 main.xml中所做的那样) ,那么 return null将工作。我想我在 XML 文件中遗漏了一些东西。

344818 次浏览

现在,在某个时间点,我需要确定哪个对象当前在那里

调用 FragmentManager上的 findFragmentById()并确定哪个片段在 R.id.frameTitle容器中。

如果你正在使用 Fragmentandroidx版本ーー正如你在现代应用程序中应该使用的ーー在你的 FragmentActivity/AppCompatActivity上使用 getSupportFragmentManager()而不是 getFragmentManager()

我认为你应该这样做:

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

原因是您将标记“ ragmentTag”设置为您添加的最后一个片段(当您调用 place 时)。

我想你可以利用 附件碎片事件来捕捉哪个片段是活动的。

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


}

如果您在活动的 XML 布局中定义片段,那么在 Activity中,请确保在调用 findFragmentById()之前调用 setContentView()

这可能有点晚了,但我希望它能帮到其他人,而且@CommonsWare 已经发布了正确的答案。

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

您可以获取片段列表并查看最后一个。

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

但有时(当您返回时)列表大小保持不变,但最后的一些元素为空。因此,在列表中,我迭代到最后一个非空片段并使用它。

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

我知道已经有一段时间了,但我会在这里,以防它帮助有人。

到目前为止,答对了(和选中的那个)是来自 CommonsWare 的。我也有同样的问题,如下所示

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

在 xml 文件中,我犯了一个很愚蠢的错误:

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

错误在于我用的是 机器人: 标签而不是 机器人: id

也许最简单的方法是:

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

这招对我很管用

如果你正在使用 BackStack... 而且只有在你正在使用 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;
}

试试这个,

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

这将给出当前的片段,然后您可以将其与片段类进行比较,并完成您的工作。

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

您可以在父活动类中创建字段:

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”字段是当前片段 Object

它还可以与 popBackStack ()一起工作

这对我来说是最简单的解决方案。

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


}

@ 汉默的反应对我很有用,我用它来控制一个浮动按钮

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

如果您是从 AbstractActivity 扩展的,那么您可以使用 getFragments ()方法:

for (Fragment f : getFragments()) {
if (f instanceof YourClass) {
// do stuff here
}
}

这将为您提供当前的片段类名—— >

String fr_name = getSupportFragmentManager().findFragmentById(R.id.fragment_container).getClass().getSimpleName();
  1. 在 onStart 方法中检查(活动容器中的哪个片段) ;

    @Override
    protected void onStart() {
    super.onStart();
    Fragment fragmentCurrent = getSupportFragmentManager.findFragmentById(R.id.constraintLayout___activity_main___container);
    }
    
  2. Some check:

    if (fragmentCurrent instanceof MenuFragment)
    

您可以检查当前加载的片段

        supportFragmentManager.addOnBackStackChangedListener {
val myFragment = supportFragmentManager.fragments.last()


if (null != myFragment && myFragment is HomeFragment) {
//HomeFragment is visible or currently loaded
} else {
//your code
}
}

我在 Kotlin 使用以下功能:

supportFragmentManager.fragments.run {
getOrNull(size - 1)?.let { currentFragment ->
...
}
}

最近,我参与了一个涉及多个片段的活动,因此,我认为应该分享我在这里使用的方法:

首先,我声明了一个函数 getCurrentFragment () ,它返回了我,是的,你猜对了,当前的片段 lol。

private fun getCurrentFragment(): Fragment? {
return supportFragmentManager.findFragmentById(R.id.fragmentContainerView)
}

然后我覆盖活动中的 onBackPress 函数,在片段中定义导航。假设,我想显示片段2,如果 user 在片段3中并按回,所以我做了类似的事情来实现这一点

override fun onBackPressed() {
if (getCurrentFragment() is Fragment3) {
showFragment2()
} else {
super.onBackPressed()
}
}

在 showFragment2()中,我做了这样的事情:

private fun showFragment2() {
val fragment = Fragment2.newInstance()
supportFragmentManager.commit {
replace(R.id.FragmentContainerView, fragment, "Add a tag here")
}
}

我认为这应该给人们更好的想法,看看如何通过一个活动的片段导航。