使用碎片时按下后退按钮时调用OnResume

时间:2014-11-04 10:28:03

标签: android fragment

我像这样添加第一个片段

            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(第二个)按钮,然后如何调用HomeFragment方法(第一个)

            onResume() is not fired which is creating problem

4 个答案:

答案 0 :(得分:5)

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

虽然我们将add()与片段交易一起使用,但来源片段不会调用onResume()。只有目标片段才能获得onResume()回调

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

在Host Activity的onBackPressed()

中添加此内容
@Override
public void onBackPressed() {
    getSupportFragmentManager().getFragments()
                .get(getSupportFragmentManager().getBackStackEntryCount() - 1).onResume();
    super.onBackPressed();
}

注意:请务必使用addToBackStack()

致电commit()

此代码会将onResume()回调给来源片段

谢谢

答案 1 :(得分:0)

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

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

        }
    }

答案 2 :(得分:0)

而不是为第二个片段调用“add”而不是“替换”

即。而不是

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 :(得分:0)

如果要添加片段

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

然后它不会在背压时调用任何第一个片段的方法。

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

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

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