【问题标题】:Call OnResume when Back Button Pressed when using Fragments使用片段时按下返回按钮时调用 OnResume
【发布时间】:2014-11-04 10:28:02
【问题描述】:

我像这样添加第一个片段

            FragmentManager fm = SliderActivity.this
                    .getSupportFragmentManager();
            FragmentTransaction ft = fm.beginTransaction();
            Fragment fragment = null;
            fragment = new HomeFragment();
            ft.add(R.id.content_fragment, fragment, "Home");
                ft.addToBackStack("Home");
                ft.commit();

第二个片段为

            FragmentManager fm = SliderActivity.this
                    .getSupportFragmentManager();
            FragmentTransaction ft = fm.beginTransaction();
            Fragment fragment = null;
            fragment = new HomeFragment();
            ft.add(R.id.content_fragment, fragment, "About");
            ft.addToBackStack("About");
            ft.commit();

我的问题是如果我从 AboutFragment (Second) 按下返回按钮,那么如何调用 HomeFragment (First) 的方法

            onResume() is not fired which is creating problem

【问题讨论】:

  • 请通过 add() 调用检查我的答案,这将对您有所帮助

标签: android fragment


【解决方案1】:

我发布迟到的答案,但我认为这对其他人有用

当我们将add() 与片段事务一起使用时,onResume() 不会在 Source 片段上调用。只有 Destination 片段会得到onResume() 回调

但是使用这种方式,我们可以实现onResume()回调到Source片段:

在Host Activity的onBackPressed()中添加这个

@Override
public void onBackPressed() {
    getSupportFragmentManager().getFragments()
                .get(getSupportFragmentManager().getBackStackEntryCount() - 1).onResume();
    super.onBackPressed();
}

注意:请确保您使用commit() 调用了addToBackStack()

这段代码将给onResume()回调到Source片段

谢谢

【讨论】:

  • getFragments() 不应从 com.android.support 包外部调用。否则这将是一个可以接受的解决方案。
  • 它在getSupportFragmentManager() 实例上调用...所以会一直工作
  • 我认为手动调用任何片段的生命周期回调不是一个好习惯
  • 同意,但是对于这个需求,我们可以这样模拟onResume
【解决方案2】:

不要为第二个片段调用“添加”,而是使用“替换”

即而不是

ft.add(R.id.content_fragment, fragment, "Home");

使用

ft.replace(R.id.content_fragment, fragment, "Home");

所以每当你按下返回按钮返回上一个片段时,第一个片段的生命周期将被再次回调。

如果不符合您的要求,您可以这样做:

private final static String TAG_FRAGMENT = "TAG_FRAGMENT";

private void showFragment() {
final Myfragment fragment = new MyFragment();
final FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.fragment, fragment, TAG_FRAGMENT);
transaction.addToBackStack(null);
transaction.commit();
}

@Override
public void onBackPressed() {
final Myfragment fragment = (Myfragment) getSupportFragmentManager().findFragmentByTag(TAG_FRAGMENT);

if (fragment.allowBackPressed()) { // and then you define a method allowBackPressed with the logic to allow back pressed or not
    super.onBackPressed();
}
}

【讨论】:

    【解决方案3】:

    我正在对我的所有片段 a 使用此方法

    // For the Fragment Replace And AddtobackStack
        void replaceFragment(Fragment fragment) {
            String backStateName = fragment.getClass().getName();
            String fragmentTag = backStateName;
    
            FragmentManager manager = this.getSupportFragmentManager();
            boolean fragmentPopped = manager
                    .popBackStackImmediate(backStateName, 0);
    
            if (!fragmentPopped && manager.findFragmentByTag(fragmentTag) == null) {
                // fragment not in back stack, create it.
                FragmentTransaction ft = manager.beginTransaction();
                ft.replace(R.id.container, fragment, fragmentTag);
                ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
    
                ft.addToBackStack(backStateName);
                ft.commit();
    
            }
        }
    

    【讨论】:

      【解决方案4】:

      如果要添加片段

      ft.add(R.id.content_fragment, fragment, "About");
      

      那么它不会在后按时调用第一个片段的任何方法。

      要调用第一个片段的方法,请将片段替换为:

      ft.replace(R.id.content_fragment, fragment, "About");
      

      但这会先调用onCreateView(),然后再调用其他方法。不可能在被背压的片段中调用onResume(),因为活动发生了

      【讨论】:

      • 不能使用替换,因为我想把以前的片段放在后面
      • 您想保留那个片段吗?检查我的答案,如果您不想使用替换,我还有另一个选择
      • 它将是。replace 不会从后台堆栈中删除片段,它确实从 onCreateView() 调用片段,并且 .add 只会在另一个片段上添加一个片段
      猜你喜欢
      • 2012-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-27
      相关资源
      最近更新 更多