获取当前片段对象

在我的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(); 

它在不同的时间设置不同types的片段对象( 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文件中的东西。

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

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

尝试这个,

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

这将给你当前的片段,然后你可以比较它的片段类,做你的东西。

  if (currentFragment instanceof "NAME OF YOUR FRAGMENT CLASS") { Log.v(TAG, "find the current fragment"); } 

我认为你可以使用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(); } 

我认为你应该这样做:

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

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

可能会迟到,但我希望它可以帮助别人,@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(); 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; } } } 

这是最简单的解决scheme,为我工作。

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 } 

也许最简单的方法是:

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

它为我工作

我知道这是一段时间,但我会在这里,以防止他人帮忙。

到目前为止, 正确的答案是(和所选的)来自CommonsWare的。 我遇到了同样的问题,发布如下

 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:标签 INSTEAD的android:id

你可以在你父级的Activity Class中创build字段:

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

如果您正在使用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; } 

@Hammer响应为我工作,即时通讯使用控制浮动操作button

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

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