片段,添加fragmentTransaction的片段,

时间:2017-10-09 06:24:19

标签: android android-fragments

问题场景:我有三个片段:FragA,FragB,FragC。有一个包含这三个片段的基本活动。所以,现在我不是替换,而是使用片段事务添加片段。序列如下:从FragA移动到FragB再到FragC,然后从FragC返回到FragB。     现在,我怀疑的是,从FragC回到FragB时,没有调用FragB生命周期中的任何方法,我甚至通过调试FragB生命周期中存在的所有方法来验证它。相反,当我们使用片段事务的替换方法时,会调用fragB的onCreateView()。

如果对问题的理解存在任何混淆,那么如果问题的定义没有得到很好的解释,请告诉我并道歉。

5 个答案:

答案 0 :(得分:0)

如果 ADD 片段,当它从片段C返回到B时,页面不会刷新。因此,您放入片段B的服务不会再次调用。 例如,将书籍放在另一本书上并制作一个书架。

如果 REPLACE 片段,则堆栈中的片段将被覆盖。

例如:将一本书放在一张桌子上。只有一本书可以留在桌子上。所以每次都应该换成另一本书。

FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.add(R.id.container, fragment,back_stack_name); //replace
transaction.addToBackStack(back_stack_name);//need to add in backstack or not. if not set as null
fragmentManager.addOnBackStackChangedListener(this);
transaction.commit();

答案 1 :(得分:0)

您可以检查片段的可见性。

覆盖片段中的setMenuVisibility:

var selCatId = null;
var pageLength = 3;

// Filters.
$('div.filter').on('click','a',function(e) {

    e.preventDefault();

    // Get the category id from the href attribute.
    selCatId = $(this).attr('href').substring(1);

    // Create pagination.
    var nPages = Math.ceil($('div#item-wrapper ul.items li.'+selCatId).length / pageLength),
        pages = [];

    // Create and show page numbers.
    for (var i=1; i<=nPages; i++)
        pages.push('<a href="#">'+i+'</a>');
    $('div.ctrl-nav').html(pages.join(''));

    // Activate page number selection.
    $('div.ctrl-nav a').click(function(e) {

        e.preventDefault();

        var pageInit = (parseInt($(this).text())-1)*pageLength;

        $('div#item-wrapper ul.items li').hide()
                                         .filter('.'+selCatId)
                                         .slice(pageInit,pageInit+pageLength)
                                         .show();

        // Mark the active page.
        $('div.ctrl-nav a').removeClass('selected').filter(this).addClass('selected');
    });

    // Show first page of the selected category.
    $('div.ctrl-nav a:first').trigger('click');
});

// Show 'Category 1' when page loads.
$('div.filter a:first').trigger('click');

答案 2 :(得分:0)

替换:这将删除现有片段并添加一个新片段,即删除片段B并在进行事务时添加片段C. 此外,当您按下后退按钮时,将创建被替换的frag B,并调用其onCreateView。

片段的生命周期事件onPause,onResume,onCreateView将在此处调用。

添加:这会保留现有的片段并添加一个新片段,即在进行交易时不会删除frag B并添加frag C. 这里前一个片段即frag B将处于活动状态,它们不会处于“暂停”状态,因此当按下后退按钮onCreateView时不会调用fragB。

片段的生命周期事件onPause,onResume,onCreateView不会在这里调用。

答案 3 :(得分:0)

就片段的生命周期事件onPause而言,onResume,onCreateView和其他生命周期事件将在替换的情况下被调用,但是在添加的情况下不会调用它们强>

答案 4 :(得分:0)

我正在使用一个Activity,它使用3个片段,其目的是登录和注册,所以每次想要添加片段并获得每个片段的生命周期,你应该替换当前片段,依此类推。您可以在onClick调用上使用下一个方法,并将参数传递给newInstance Fragment

private void setFragment(Fragment fr) {
    // create Fragment transaction
    android.support.v4.app.FragmentTransaction fTransaction = getSupportFragmentManager().beginTransaction();
    // Adding to back stack that will allow you use onBackPressed
    fTransaction.addToBackStack(null);
    // Replacing fragment_container which will made lifecycle works 
    fTransaction.replace(R.id.initio, fr, fr.getTag());
    // Commit so inflates the new fragment
    fTransaction.commit();
}

此外,如果您想使用onBackPressed在片段之间取回,您应该覆盖下一个方法:

@Override
public void onBackPressed() {
    int count = getFragmentManager().getBackStackEntryCount();

    if (count == 0) {
        super.onBackPressed();

    } else {
        getFragmentManager().popBackStack();
    }
}´