Lee*_*fin 97 android android-fragments back-stack
如何在backstack中添加最新的片段实例(如果我不知道片段标签和id)?
FragmentManager fragManager = activity.getSupportFragmentManager();
FragmentTransaction fragTransacion = fragMgr.beginTransaction();
/****After add , replace fragments
(some of the fragments are add to backstack , some are not)***/
//HERE, How can I get the latest added fragment from backstack ??
Run Code Online (Sandbox Code Playgroud)
Dee*_*oel 149
您可以使用API级别14中引入的getName()方法FragmentManager.BackStackEntry.此方法将返回一个标记,该标记是您将Fragment添加到Backstack时使用的标记addTobackStack(tag).
int index = getActivity().getFragmentManager().getBackStackEntryCount() - 1
FragmentManager.BackStackEntry backEntry = getFragmentManager().getBackStackEntryAt(index);
String tag = backEntry.getName();
Fragment fragment = getFragmentManager().findFragmentByTag(tag);
Run Code Online (Sandbox Code Playgroud)
您需要确保将片段添加到backstack,如下所示:
fragmentTransaction.addToBackStack(tag);
Run Code Online (Sandbox Code Playgroud)
ash*_*rov 48
FragmentManager.findFragmentById(fragmentsContainerId)
Run Code Online (Sandbox Code Playgroud)
function返回Fragmentbackstack中的top链接.用法示例:
fragmentManager.addOnBackStackChangedListener(new OnBackStackChangedListener() {
@Override
public void onBackStackChanged() {
Fragment fr = fragmentManager.findFragmentById(R.id.fragmentsContainer);
if(fr!=null){
Log.e("fragment=", fr.getClass().getSimpleName());
}
}
});
Run Code Online (Sandbox Code Playgroud)
pti*_*nou 40
我个人尝试了很多这样的解决方案,最终得到了这个有效的解决方案:
添加此实用程序方法,将在下面多次使用以获取backstack中的片段数:
protected int getFragmentCount() {
return getSupportFragmentManager().getBackStackEntryCount();
}
Run Code Online (Sandbox Code Playgroud)
然后,当您使用FragmentTransaction方法添加/替换片段时,为片段生成唯一标记(例如:通过使用堆栈中的片段数量):
getSupportFragmentManager().beginTransaction().add(yourContainerId, yourFragment, Integer.toString(getFragmentCount()));
Run Code Online (Sandbox Code Playgroud)
最后,您可以使用此方法在Backstack中找到任何片段:
private Fragment getFragmentAt(int index) {
return getFragmentCount() > 0 ? getSupportFragmentManager().findFragmentByTag(Integer.toString(index)) : null;
}
Run Code Online (Sandbox Code Playgroud)
因此,通过调用以下方法可以轻松地获取backstack中的顶部片段:
protected Fragment getCurrentFragment() {
return getFragmentAt(getFragmentCount() - 1);
}
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助!
此帮助程序方法从堆栈顶部获取片段:
public Fragment getTopFragment() {
if (getSupportFragmentManager().getBackStackEntryCount() == 0) {
return null;
}
String fragmentTag = getSupportFragmentManager().getBackStackEntryAt(getSupportFragmentManager().getBackStackEntryCount() - 1).getName();
return getSupportFragmentManager().findFragmentByTag(fragmentTag);
}
Run Code Online (Sandbox Code Playgroud)
Ere*_*ez 6
fragmentMananger中有一个片段列表.请注意,删除片段不会使列表大小减小(片段条目只是变为null).因此,有效的解决方案是:
public Fragment getTopFragment() {
List<Fragment> fragentList = fragmentManager.getFragments();
Fragment top = null;
for (int i = fragentList.size() -1; i>=0 ; i--) {
top = (Fragment) fragentList.get(i);
if (top != null) {
return top;
}
}
return top;
}
Run Code Online (Sandbox Code Playgroud)
Deepak Goel给出的答案对我不起作用,因为我总是从中得到空值entry.getName()。
我要做的是通过以下方式将Tag设置为片段:
ft.add(R.id.fragment_container, fragmentIn, FRAGMENT_TAG);
Run Code Online (Sandbox Code Playgroud)
ft是我的片段交易,FRAGMENT_TAG是标签。然后,我使用以下代码来获取片段:
Fragment prev_fragment = fragmentManager.findFragmentByTag(FRAGMENT_TAG);
Run Code Online (Sandbox Code Playgroud)
刚刚接受了@roghayeh hosseini(正确)的答案,并在 Kotlin 中为 2017 年的人提供了答案:)
fun getTopFragment(): Fragment? {
supportFragmentManager.run {
return when (backStackEntryCount) {
0 -> null
else -> findFragmentByTag(getBackStackEntryAt(backStackEntryCount - 1).name)
}
}
}
Run Code Online (Sandbox Code Playgroud)
*这应该从活动内部调用。
享受 :)
科特林
activity.supportFragmentManager.fragments.last()
Run Code Online (Sandbox Code Playgroud)
您可以使用getBackStackEntryAt()。为了了解活动在后台堆栈中保存了多少条目,您可以使用getBackStackEntryCount()
int lastFragmentCount = getBackStackEntryCount() - 1;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
110938 次 |
| 最近记录: |