現在のフラグメントオブジェクトを取得する


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

異なるタイプのFragmentオブジェクト(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ます。

findFragmentById()そしてfindFragmentByTag()私たちが使用してフラグメントを設定している場合は動作しますfragmentTransaction.replacefragmentTransaction.add、しますがreturn null、我々は、XMLで(私は私の中でやっているようなオブジェクトを設定している場合main.xml)。XMLファイルに何か欠けていると思います。



まだnullになるので、@ CommonsWareの回答は役に立ちますか?
IntoTheDeep

回答:


253

ある時点で、現在どのオブジェクトが存在しているかを特定する必要があります

呼び出しfindFragmentById()FragmentManagerR.id.frameTitleコンテナにあるフラグメントを特定します。


1
御返答いただき有難うございます。fragmentTransaction.replace を使用してフラグメントをfragmentTransaction.add設定した場合は機能しますが、xmlで設定した場合は機能しません。私の編集2を参照してください
Labeeb Panampullan

9
@Labeeb P:レイアウトリソースで宣言されたフラグメントは変更できません。
CommonsWare 2011

現在表示されているタブ/フラグメントを保持するクラスを作成することもできます。私はちょうどそれを試しました。障害がないことを願っています。
Skynet、

タブのfindFragmentByTag場合、@ CommonsWareはnullを返しますActionBar。私Activityが拡張しているActionBarActivity私では、最初にタブを追加してからActionBarそれを見つけています!
ムハンマドババール

1
@MuhammadBabar:私はこれを試していませんが、トランザクションを呼び出しexecutePendingTransactions()FragmentManager後、試すことができcommit()ます。またはsetContentView()<fragment>タグ付きのレイアウトファイルを使用することもできます。これらのいずれかが同期的に発生するため、フラグメントは、またはonCreate()を使用した呼び出し自体の中に存在します。それ以外の場合、通常は非同期で処理され、時間の終わりまでには開始されません。executePendingTransaction()setContentView()FragmentTransactiononCreate()
CommonsWare、2014年

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パートなしではnullになります
Muz

「フラグメントクラスの名前」の前後の引用符を削除します。
アランネルソン

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
アタッチされているフラグメントを取得できます。私の考えは、方向を変更したときに、別のビューではなく同じビューを表示する必要があるためです。
Androi開発者2013

7
戻るときにアクティブなフラグメントを更新しないため、これは機能しません。
ジャスティン

1
@Justinなので、弱い参照リストでもonDetachを使用する必要があるだけです
letroll

12

私はあなたがすべきだと思います:

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

その理由は、タグ「fragmentTag」を最後に追加したフラグメントに設定したためです(replaceを呼び出したとき)。


ありがとうございます。修正しました。この質問を書いている間、それはタイプミスです。fragmentTransaction.replace を使用してフラグメントをfragmentTransaction.add設定した場合は機能しますが、xmlで設定した場合は機能しません。私の編集2を参照してください
Labeeb Panampullan

どうもありがとうございます!私の問題を解決しました!
JonasGröger、2012年

2
このソリューションは、複数のフラグメントに同じタグを付ける必要があることを意味しませんか?それ以外の場合fragmentTag、現在のフラグメントのタグはどのようにしてわかりますか?
トゥッテン

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

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

久しぶりですが、誰かを助けるためにここに書きます。

正しい答えを抜いては(と選択1)CommonsWareから1。私は投稿されたのと同じ問題を抱えていました、次の

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

@Hammer応答は私のために機能しました、私はフローティングアクションボタンを制御するために使用しています

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 layourでフラグメントを定義する場合は、Activityを呼び出すsetContentView()前にを呼び出すことを確認してくださいfindFragmentById()


1

バックスタックを使用している場合...そしてバックスタックを使用している場合のみ、これを試してください:

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.