web-dev-qa-db-ja.com

現在表示されているフラグメントを取得する方法

私はAndroidでフラグメントで遊んでいます。

次のコードを使用してフラグメントを変更できることを知っています。

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

私の質問は、Javaファイルで、現在表示されているFragmentインスタンスをどのように取得することができるのですか?

383
Leem.fin

トランザクションにフラグメントを追加するときは、タグを使用する必要があります。

fragTrans.replace(Android.R.id.content, myFragment, "MY_FRAGMENT");

...そして、後でフラグメントが表示されているかどうかを確認したい場合は、

MyFragment myFragment = (MyFragment)getFragmentManager().findFragmentByTag("MY_FRAGMENT");
if (myFragment != null && myFragment.isVisible()) {
   // add your code here
}

http://developer.Android.com/reference/Android/app/Fragment.htmlも参照してください

419
ramdroid

私はそれが古い投稿であることを知っていますが、以前もそれに問題がありました。リスニング関数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();

    }

目に見えるものを見つける必要があるすべてのフラグメントを繰り返し処理することはしたくなかったので、これは私にとって役に立ちました。それが他の誰かにも役立つことを願っています。

360
Sev

これは私が低フラグメントのシナリオに便利だと思う私の解決策です。

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;
}
137
Matt Mombrea

フラグメントを表示するたびに、そのタグをバックスタックに配置する必要があります。

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

現在表示されているフラグメントを見つけるために使用しているのは、以下のコードです。それは簡単です、そしてそれは今では私のために働きます。それは断片を保持する活動で走ります

    FragmentManager fragManager = this.getSupportFragmentManager();
    int count = this.getSupportFragmentManager().getBackStackEntryCount();
    Fragment frag = fragManager.getFragments().get(count>0?count-1:count);
21
tainy

反応性 方法:

Observable.from(getSupportFragmentManager().getFragments())
    .filter(fragment -> fragment.isVisible())
    .subscribe(fragment1 -> {
        // Do something with it
    }, throwable1 -> {
        // 
    });
14
localhost

私の方法は、このようにtry/catchに基づいています。

MyFragment viewer = null;
    if(getFragmentManager().findFragmentByTag(MY_TAG_FRAGMENT) instanceOf MyFragment){
    viewer = (MyFragment) getFragmentManager().findFragmentByTag(MY_TAG_FRAGMENT);
}

しかし、もっと良い方法があるかもしれません...

11
Thordax

さて、この質問は多くの見解と注目を集めましたが、それでも私の最後からの最も簡単な解決策を含んでいませんでした - getFragments()を使うこと。

            List fragments = getSupportFragmentManager().getFragments();
            mCurrentFragment = fragments.get(fragments.size() - 1);
8
Nativ

少し遅れていますが、興味のある人なら誰でも:FragmentManagerで目的のフラグメントのインデックスがわかっている場合は、それを参照してisMenuVisible()関数を確認してください。ここに :

getSupportFragmentManager().getFragments().get(0).isMenuVisible()

trueの場合ユーザーに表示されるなどです。

7
MohammadReza

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
}
7
Nam Ngo Thanh

SupportFragmentManagerにはfindFragmentById()というメソッドがあります。以下のようにアクティビティコンテナで使用します。

public Fragment currentFragment(){
    return getSupportFragmentManager().findFragmentById(R.id.activity_newsfeed_frame);
}

これが現在のFragmentを取得する方法です。あなたがカスタムのFragmentを持っていて、それがFragmentであることをチェックする必要があるならば、私は通常instanceofを使います:

if (currentFragment() instanceof MyFrag){
    // Do something here
}
5
Kevin Murvie

コトリンウェイ。

val currentFragment = supportFragmentManager.fragments.last()
5

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"を "this"に置き換えます。

5
Nashe

Sevの答え あなたが戻るボタンを押すか、そうでなければバックスタックを変更するときのために働きます。

しかし、私は少し違うことをしました。基本フラグメントとその派生フラグメントに対するバックスタック変更リスナーの設定があります。このコードはリスナーにあります。

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
}
4
MCLLC

これは現在のフラグメントを取得する簡単な方法です。

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);
    }
  }
});
4
lallu Sukendh

どのフラグメントがアクティビティのコンテンツフレームにロードされているかを照会して、フラグメントクラス、またはフラグメントの「単純名」(文字列として)を取得できます。

public String getCurrentFragment(){
     return activity.getSupportFragmentManager().findFragmentById(R.id.content_frame).getClass().getSimpleName();
}

使用法:

Log.d(TAG, getCurrentFragment());

出力:

D/MainActivity: FragOne
4
Mr L

ここに来て、あなたが 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
    }
}
4
pableiros

この解決策をチェックしてください。現在のフラグメントを取得するのに役立ちました。

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");
        }
3
Haroon khan

これは私の仕事です。これが誰かの助けになることを願っています。

FragmentManager fragmentManager = this.getSupportFragmentManager();  
        String tag = fragmentManager
                    .getBackStackEntryAt(
                    fragmentManager
                    .getBackStackEntryCount() - 1)
                    .getName();
              Log.d("This is your Top Fragment name: ", ""+tag);
3
Cüneyt

あなたが親アクティビティからFragmentの現在のインスタンスを取得しているなら、あなたはただすることができます

findFragmentByID(R.id.container);

これは実際にはビューに取り込まれているフラグメントの現在のインスタンスです。私は同じ問題を抱えていました。同じフラグメントをバックスタックにしたまま2回ロードする必要がありました。

次の方法はうまくいきません。それはただタグを持つFragmentを取得するだけです。この方法で時間を無駄にしないでください。私はそれがそれを使用していると確信していますが、同じフラグメントの最新バージョンを入手することはそれらの1つではありません。

findFragmentByTag()
3
Yasin Yaqoobi
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");
}
2
KeranMarinov

私は同様の問題に遭遇しました、そこで、私は何のフラグメントがbackキーが押されたときに最後に表示されたかについて知りたかったです。私は私のために働いた非常に単純な解決策を使いました。 onCreate()メソッドでフラグメントを開くたびに、シングルトンに変数を設定します( "myFragment"をあなたのフラグメントの名前に置き換えます)。

MySingleton.currentFragment = myFragment.class;

変数はシングルトンで次のように宣言されています。

public static Class currentFragment = null; 

それからonBackPressed()でチェックします

    if (MySingleton.currentFragment == myFragment.class){
        // do something
        return;
    }
    super.onBackPressed();

Super.onBackPressed()を必ず呼び出してください。 "return"の後、そうでなければアプリは戻るキーを処理します。私の場合はそれがアプリを終了させました。

1
Zvi

スクロールフラグメントの場合、ViewPagerクラスのインスタンスを使用するときにmVeiwPagerを使用すると、mViewPager.getCurrentItem()を呼び出して現在のフラグメントint番号を取得できます。

mainLayout.xml内

<?xml version="1.0" encoding="utf-8"?>
<Android.support.design.widget.CoordinatorLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto"
    xmlns:tools="http://schemas.Android.com/tools"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:fitsSystemWindows="true"
    Android:orientation="vertical"
    tools:context="unidesign.photo360.MainActivity">

    <Android.support.design.widget.AppBarLayout
        Android:id="@+id/appbar"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:fitsSystemWindows="false"
        Android:theme="@style/AppTheme.AppBarOverlay"
        app:expanded="false">

        <Android.support.v7.widget.Toolbar
            Android:id="@+id/main_activity_toolbar"
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content"
            Android:layout_weight="1"
            app:popupTheme="@style/AppTheme.PopupOverlay"
            app:title="@string/app_name">

        </Android.support.v7.widget.Toolbar>

    </Android.support.design.widget.AppBarLayout>


    <Android.support.v4.view.ViewPager
        Android:id="@+id/view_pager"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content">

    </Android.support.v4.view.ViewPager>
    
</Android.support.design.widget.CoordinatorLayout>

mainActivity.kt内

class MainActivity : AppCompatActivity() {
    
        lateinit var mViewPager: ViewPager
        lateinit var pageAdapter: PageAdapter
        
//      ...
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
            
            pageAdapter = PageAdapter(supportFragmentManager)
            mViewPager = findViewById(R.id.view_pager)
//          ...
            }
            
        override fun onResume() {
          super.onResume()
          var currentFragment = pageAdapter.getItem(mViewPager.currentItem)
//         ...
          }
1
getSupportFragmentManager().findFragmentById(R.id.content_frame).getClass().getSimpleName();

まあ、これはこの質問に対する最も簡単な答えだと思います。これがお役に立てば幸いです。

1
Abhishek Raj

メインアクティビティでは、onAttachFragment(Fragment fragment)メソッドは、新しいフラグメントがアクティビティに添付されたときに呼び出されます。このメソッドでは、現在のフラグメントのインスタンスを取得できます。ただし、onAttachFragmentメソッドは、フラグメントがバックスタックからポップされたとき、つまりスタックの最上部に最上部のフラグメントを取得するためにbackボタンが押されたときには呼び出されません。フラグメントがアクティビティ内に表示されるようになったときにメインアクティビティ内でトリガされるコールバックメソッドをまだ探しています。

1
ufdeveloper

私もこの点に固執しました。私が最後にしたことは、フラグメントの配列を宣言したところです。

private static PlaceholderFragment[] arrFrg;

(私の場合はPlaceholderFragmentです)そしてこれらのFragemntsをタグなしでこの配列に詰め込みました:)

        public static PlaceholderFragment newInstance(int sectionNumber) {
            final PlaceholderFragment fragment = new PlaceholderFragment();
            Bundle args = new Bundle();
            args.putInt(ARG_SECTION_NUMBER, sectionNumber);
            fragment.setArguments(args);
            arrFrg[sectionNumber] = fragment;

            return fragment;
}

そうすれば、現在表示されているフラグメントに簡単にアクセスできます。

arrFrg[mViewPager.getCurrentItem()];

私は理解している、これはおそらく最良の解決策ではないが、それは私のために完璧に動作します:)

0
MTU
public Fragment getVisibleFragment() {
    FragmentManager fragmentManager = getSupportFragmentManager();
    List<Fragment> fragments = fragmentManager.getFragments();
    if(fragments != null) {
        for (Fragment fragment : fragments) {
            if (fragment != null && fragment.isVisible())
                return fragment;
        }
    }
    return null;
}

これは私のために働きます。フラグメントリストを繰り返す前に、nullチェックを実行する必要があります。フラグメントがスタックにロードされないというシナリオがあるかもしれません。

返されるフラグメントは、スタックに置きたいフラグメントと比較できます。

0
caesiium

次のコードを使って現在のフラグメントを取得できます

FragmentClass f = (FragmentClass)viewPager.getAdapter().instantiateItem(viewPager, viewPager.getCurrentItem());
0

Viewpagerなどの中のviewpagerのようにネストしたフラグメントがあり、すべてのネストしたフラグメントを取得したい場合。

Matt Mombrea answer 少し調整されたバージョンのおかげでそしてありがとう。

private List<Fragment> getVisibleFragments(List<Fragment> searchFragments, List<Fragment> visibleFragments) {
    if (searchFragments != null && searchFragments.size() > 0) {
        for (Fragment fragment : searchFragments) {
            List<Fragment> nestedFragments = new ArrayList<>();
            List<Fragment> childFMFragments = fragment.getChildFragmentManager().getFragments();
            List<Fragment> fmFragments = fragment.getFragmentManager().getFragments();
            fmFragments.retainAll(childFMFragments);
            nestedFragments.addAll(childFMFragments);
            nestedFragments.addAll(fmFragments);
            getVisibleFragments(nestedFragments, visibleFragments);
            if (fragment != null && fragment.isVisible()) {
                visibleFragments.add(fragment);
            }
        }
    }
    return visibleFragments;
}

そしてここに使い方があります:

List<Fragment> allVisibleFragments = getVisibleFragments(searchFragments, visibleFragments);

例えば:

List<Fragment> visibleFragments = new ArrayList<>();
List<Fragment> searchFragments = MainActivity.this.getSupportFragmentManager().getFragments();
Toast.makeText(this, ""+getVisibleFragments(searchFragments, visibleFragments), Toast.LENGTH_LONG).show();
0
10101101

サポートライブラリv13を使用している場合、この問題は修正されているため、単に上書きする必要があります。

@Override
public void setUserVisibleHint(boolean isVisibleToUser)
{
    // TODO Auto-generated method stub
    super.setUserVisibleHint(isVisibleToUser);
}

問題は、フラグメントがバージョン4ののフラグメントクラスと互換性がないため、2つを混在させることはできないということです。

そうでなく、V4サポートライブラリを使用している場合は、setPrimaryItemメソッドをFragmentStatePagerAdapterにオーバーライドします。

私はこれを使って大きなリストのActionbatのタイトルを更新しました。

0
Mashiah

ちょっと変ですが、私はFragmentManager $ FragmentManagerImplを見ました、そして、以下は私のために働きます:

public static Fragment getActiveFragment(Activity activity, int index)
{
    Bundle bundle = new Bundle();
    String key = "i";
    bundle.putInt(key,index);
    Fragment fragment=null;
    try
    {
        fragment = activity.getFragmentManager().getFragment(bundle, key);
    } catch(Exception e){}
    return fragment;
}

最初のアクティブなフラグメントを取得するには、インデックスとして0を使用します。

0
Hans

イベントバス( OttoEventBus 、または RxJavaバス など)を使用すると、これらの状況で特に便利です。

この方法では、現在表示されているフラグメントを必ずしもオブジェクトとして渡す必要はありませんが(それも可能ですが、呼び出しチェーンが長くなります)、現在表示されているフラグメントに対してアクションを実行できます現在表示されているフラグメントを知りたい.

  1. フラグメントのライフサイクルを尊重し、適切な時期にイベントバスを登録/登録解除してください。
  2. 現在表示されているフラグメントを知り、一連のアクションを実行する必要がある時点で。イベントバスでイベントを起こしましょう。

バスに登録されているすべての可視フラグメントは必要なアクションを実行します。

0
Kaushik Gopal

こんにちは私はこれが非常に古い問題であることを知っています、しかし私は私自身の解決策を共有したいと思います..

ユーザーが閲覧したフラグメントリストを取得するために、私はヘルパークラスを作成しました:

public class MyHelperClass{

    private static ArrayList<Fragment> listFragment = new ArrayList<>();

    public static void addFragment(Fragment f){
        if(!existFragment(f)) {
            listFragment.add(f);
        }
    }
    public static void removeFragment(){
        if(listFragment.size()>0)
            listFragment.remove(listFragment.size()-1);
    }
    public static Fragment getCurrentFragment(){
        return listFragment.get(listFragment.size()-1);
    }
    public static int sizeFragments(){
        return listFragment.size();
    }
    private static Boolean existFragment(Fragment f){
        Boolean ret = false;
        for(Fragment fragment : listFragment){
            if (fragment.getClass() == f.getClass()){
                ret = true;
            }
        }
        return ret;
    }

そしてメインのActivityに、私はonAttachFragmentメソッドをオーバーライドします

@Override
public void onAttachFragment(Fragment f) {
    super.onAttachFragment(f);

    MyHelperClass.addFragment(f);
}

また、onBackPressedメソッドをオーバーライドします。

@Override
public void onBackPressed() {
        General.removeFragment();
        if(General.sizeFragments()>0){
            Fragment fragment = null;
            Class fragmentClass = General.getCurrentFragment().getClass();

            try {
                fragment = (Fragment) fragmentClass.newInstance();
                fragment.setArguments(General.getCurrentFragment().getArguments());
            } catch (Exception e) {
                e.printStackTrace();
            }

            fragmentManager.beginTransaction().replace(R.id.flContent, fragment).commit();
        }else{
            super.onBackPressed();
        }
}

だからこの方法であなたはいつでもMyHelperClass.getCurrentFragment()でアクティブなフラグメントを取得することができます

私はこれが誰にとっても役立つことを願っています

よろしく

0
Ruben Flores

クラス変数selectedFragmentを追加して、フラグメントを変更するたびに変数を更新できます。

public Fragment selectedFragment;
public void changeFragment(Fragment newFragment){
    FragmentManager fragMgr = getSupportFragmentManager();
    FragmentTransaction fragTrans = fragMgr.beginTransaction();
    fragTrans.replace(Android.R.id.content, newFragment);
    fragTrans.addToBackStack(null);
    fragTrans.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
    fragTrans.commit();
    //here you update the variable
    selectedFragment = newFragment;
}

あなたが望むところならどこでもselectedFragmentを使うことができます

0
whd.nsr

おそらく最も簡単な方法は次のとおりです。

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

それは私のために働いた

0
madx

私はごく最近にこれをしなければなりませんでした、そして、ここでの答えのどれも本当にこのシナリオに合いませんでした。

1つのフラグメントだけが表示される (フルスクリーン)と確信している場合は、実際にバックスタックの一番上にあるものを見つけたいと思います。例えば、KotlinFragmentとして:

import androidx.fragment.app.Fragment

fun Fragment.setVisibilityChangeListener(clazz: Class<out Fragment>, listener: (Boolean) -> Unit) {
    fragmentManager?.run {
        addOnBackStackChangedListener {
            val topFragmentTag = getBackStackEntryAt(backStackEntryCount - 1).name
            val topFragment = findFragmentByTag(topFragmentTag)
            listener(topFragment != null && topFragment::class.Java == clazz)
        }
    }
}

そしてそれを次のように使います。

class MyFragment: Fragment {
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        setVisibilityChangeListener(this::class.Java) { visible -> 
            // Do stuff
        }
    }
}
0
Mikel Pascual

findFragmentByTagはそれほど便利ではないことがわかりました。 Activityまたは親のFragmentString currentFragmentTagがある場合は、それをonSaveInstanceStateに保存してonCreateに復元する必要があります。たとえそうしても、Activityが再作成されると、onAttachFragmentonCreateの前に呼び出されるので、currentFragmentTagonAttachFragmentを使用することはできません(例えば、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")を使用してください。

onAttachFragmentgetCurrentFragment()は添付のFragmentを取得するのではなく、前の添付のものを取得します。

0
Jeffrey Chen

これが最良の方法です。

       Android.app.Fragment currentFragment=getFragmentManager().findFragmentById(R.id.main_container);
            if(currentFragment!=null)
            {
                String[] currentFragmentName = currentFragment.toString().split("\\{");
                if (currentFragmentName[0].toString().equalsIgnoreCase("HomeSubjectFragment"))
                {
                    fragment = new HomeStagesFragment();
                    tx = getSupportFragmentManager().beginTransaction();
                    tx.replace(R.id.main_container, fragment);
                    tx.addToBackStack(null);
                    tx.commit();
                }
                else if(currentFragmentName[0].toString().equalsIgnoreCase("HomeStagesFragment"))
                {
                    new AlertDialog.Builder(this)
                            .setMessage("Are you sure you want to exit?")
                            .setCancelable(false)
                            .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog, int id) {
                                    finish();
                                }
                            })
                            .setNegativeButton("No", null)
                            .show();
                }

            }

これをヘッダーで定義することを忘れないでください:

private Fragment fragment;
FragmentTransaction tx;
0
Osama Ibrahim

この方法を試してください.....

private Fragment getCurrentFragment(){
    FragmentManager fragmentManager = getSupportFragmentManager();
    String fragmentTag = fragmentManager.getBackStackEntryAt(fragmentManager.getBackStackEntryCount() - 1).getName();
    Fragment currentFragment = getSupportFragmentManager()
.findFragmentByTag(fragmentTag);
    return currentFragment;
}
0
Manmohan Soni

getFragmentManager()が機能しない場合は、getSupportFragmentManager()を試して、フラグメントのロード時にタグを追加します。

public void onBackPressed(){

    Fragment fragment=getSupportFragmentManager().findFragmentByTag(/*enter your tag*/);


    if(fragment!=null && fragment.isVisible())
    {
        //do your code here
    }
    else
    {
       //do your code here
    }

}
0
Projit Roy

よく私はあなたがどのフラグメントにいるのか見たいと思うと思います私はそれが最善だとは思わない解決策があると思いますが - それはうまくいきます まず最初に


fragmentを継承した親フラグメントを作成する必要があります


public class Fragment2 extends Fragment {
    private static position;
    public static int getPosition() {
        return position;
    }

    public static void setPosition(int position) {
        FragmentSecondParent.position = position;
    }
}

2番目

あなたはそれをすべてのフラグメントでそしてそれぞれの書き込みでonCreateViewで拡張するべきです

setPosition(//your fragmentposition here)

三番


現在のフラグメントを取得したい場所


これを書く

Fragment2 fragment= (Fragment2) getSupportFragmentManager()
    .findFragmentById(R.id.fragment_status);

int position = fragment.getPosition();
if(//position condition)
{
    //your code here
}
0
Farido mastr