Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
372 views
in Technique[技术] by (71.8m points)

android - Get Fragment dynamically attached to <FrameLayout>?

Well, i got a simple <FrameLayout>:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/FragmentContainer"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" />

Then in my code, i added a Fragment to it:

FragClass aFrag = new FragClass();
getSupportFragmentManager().beginTransaction()
        .replace(R.id.FragmentContainer, aFrag).commit();

And somewhere else in my code, i want to get that FragClass (extends Fragment) object from the ID R.id.FragmentContainer.

i have tried

((ViewGroup) findViewById(R.id.FragmentContainer)).getChildAt(0)

or

((FrameLayout) findViewById(R.id.FragmentContainer)).getChildAt(0)

but they are returning the View, instead of the Fragment attached to it.

i know i can keep the variable aFrag somewhere, so i do not need to find it again. But i believe there should be a way to retieve it.

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

Let me wrap it up by a full answer :)

In this case, the dynamically added Fragment uses the ID of the container View (ViewGroup).

ref: http://developer.android.com/guide/components/fragments.html#Adding

Note: Each fragment requires a unique identifier that the system can use to restore the fragment if the activity is restarted (and which you can use to capture the fragment to perform transactions, such as remove it). There are three ways to provide an ID for a fragment:

  • Supply the android:id attribute with a unique ID.
  • Supply the android:tag attribute with a unique string.
  • If you provide neither of the previous two, the system uses the ID of the container view.

It is because it's a Fragment afterall. We have to use getSupportFragmentManager().findFragmentById() to retrieve it, which returns a Fragment, instead of findViewById() which returns a View.

So the answer to this problem would be:

((aFrag) getSupportFragmentManager().findFragmentById(R.id.FragmentContainer))

Thanks to @Luksprog.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...