有没有办法从堆栈顶部获取片段?

Dra*_*ior 41 android android-fragments

我的MainActivity中有一个ListFragment.这是我设置片段对象的方法.

FragmentManager fragmentManager = activity.getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
Fragment newFragment = new MyFragment();
fragmentTransaction.replace(R.id.framecontainer, newFragment, "tag");
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
Run Code Online (Sandbox Code Playgroud)

问题是当用户按下后退按钮时,我必须至少通过调用来更改操作栏和菜单

getActionBar().setTitle(title);
getActionBar().setDisplayHomeAsUpEnabled(isEnabled);
invalidateOptionsMenu();
Run Code Online (Sandbox Code Playgroud)

我必须知道当前显示的是哪种片段,以便我知道如何设置操作栏.我将设置选项存储在fragment中作为参数.

String title = fragment.getArguments().getString("KEY_TITLE");
boolean isEnabled = fragment.getArguments().getBoolean("KEY_ISENABLED");
Run Code Online (Sandbox Code Playgroud)

我确实搜索了相关的问题,我意识到我可以通过调用来获取片段

MyFragment fragment = (MyFragment) getSupportFragmentManager()
        .findFragmentByTag("tag");
Run Code Online (Sandbox Code Playgroud)

但是,我必须将所有标记存储在自定义堆栈中,并在每次用户按下后退按钮时调用pop()onBackPressed().

所以,我的问题是,有没有办法让我直接从堆栈中获取当前可见的片段?

注意:请记住片段类型不同,而不仅仅是MyFragment.

pet*_*tey 68

这样的事情应该有助于你的活动在背压上解决这个问题:

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

@Override
public void onBackPressed() {
    Fragment fragmentBeforeBackPress = getCurrentFragment();
    // Perform the usual back action
    super.onBackPressed();
    Fragment fragmentAfterBackPress = getCurrentFragment();
}
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.

  • 似乎如果我以你的方式做,我必须设置**fragmentTransaction.addToBackStack(tag)**; 否则,我会得到一个NullPointerException.所以**fragmentManager.getBackStackEntryAt(fragmentManager.getBackStackEntryCount() - 1).getName();**不引用标签名称 (9认同)

ash*_*rov 32

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=", f.getClass().getSimpleName());
            }
        }
    });
Run Code Online (Sandbox Code Playgroud)

编辑:现在2018年有getFragments方法FragmentManager返回List<Fragment>.来自docs : The order of the fragments in the list is the order in which they were added or attached. 所以看起来我们可以从该列表中获取最后一个片段:

     List<Fragment> list = fragmentManager.getFragments();
     //get last one 
     Fragment topFragment = list.get(list.size() - 1);
Run Code Online (Sandbox Code Playgroud)