获取当前的片段对象


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,则可以使用(就像我在my中所做的一样main.xml)。我认为我的XML文件中缺少某些内容。



@CommonsWare回答是否对您有所帮助,因为我仍然会得到null?
IntoTheDeep,2016年

Answers:


252

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

呼叫findFragmentById()FragmentManager并确定哪些片段是在你的R.id.frameTitle容器。


1
感谢您的答复。如果我们使用fragmentTransaction.replace 设置了片段,它将起作用,fragmentTransaction.add但是如果将其设置为xml,它将不会得到。查看我的编辑2
Labeeb Panampullan

9
@Labeeb P:您不能修改布局资源中声明的片段。
CommonsWare,

创建一个类来保存当前可见的标签/片段也可以,我只是试了一下。希望没有失败。
天网

findFragmentByTag如果使用ActionBarTab,@ CommonsWare 返回null 。在Activity扩展中,ActionBarActivity我首先添加标签ActionBar,然后找到它!
穆罕默德·巴巴尔

1
@MuhammadBabar:您可以尝试executePendingTransactions()FragmentManager打完电话后commit()上的事务,虽然我没有试过。或者您可以使用setContentView()带有<fragment>标签的布局文件。两者都是同步发生的,因此该片段将存在于onCreate()您使用executePendingTransaction()或的调用本身中setContentView()。否则,普通对象将FragmentTransaction被异步处理,并且在时间onCreate()结束之前它甚至都不会开始。
CommonsWare 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.