获取当前片段对象
在我的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.replace
或fragmentTransaction.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()
。