问题场景:我有三个片段:FragA,FragB,FragC。有一个包含这三个片段的基本活动。所以,现在我不是替换,而是使用片段事务添加片段。序列如下:从FragA移动到FragB再到FragC,然后从FragC返回到FragB。 现在,我怀疑的是,从FragC回到FragB时,没有调用FragB生命周期中的任何方法,我甚至通过调试FragB生命周期中存在的所有方法来验证它。相反,当我们使用片段事务的替换方法时,会调用fragB的onCreateView()。
如果对问题的理解存在任何混淆,那么如果问题的定义没有得到很好的解释,请告诉我并道歉。
答案 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();
}
}´