回答(10)
2 years ago
我不明白的是,当按下“确定”以删除片段Df,Cf和Bf时,在Df中该怎么做?
步骤#1:让Df告诉D“哟!我们得到了OK点击!”通过调用方法,可以是活动本身,也可以是活动提供的接口实例 .
步骤#2:让D通过 FragmentManager 删除片段 .
托管活动(D)是知道活动中的其他片段(与其他活动相比)的活动 . 因此,可能会影响片段混合的片段内事件应传播到活动,这将使适当的编排移动 .
2 years ago
虽然它可能不是最好的方法,但我能想到的最接近的等价物是支持/兼容性库
getActivity().getSupportFragmentManager().beginTransaction().remove(this).commit();
要么
getActivity().getFragmentManager().beginTransaction().remove(this).commit();
除此以外 .
此外,您可以使用backstack并弹出它 . 但是请记住,片段可能不在backstack上(取决于在那里获得它的片段事务..)或者它可能不是最后一个进入堆栈,因此弹出堆栈可能会删除错误的...
2 years ago
你可以使用下面的方法,它工作正常:
getActivity().getSupportFragmentManager().popBackStack();
2 years ago
你应该让Activity处理添加和删除片段,正如CommonsWare所说,使用一个监听器 . 这是一个例子:
public class MyActivity extends FragmentActivity implements SuicidalFragmentListener {
// onCreate etc
@Override
public void onFragmentSuicide(String tag) {
// Check tag if you do this with more than one fragmen, then:
getSupportFragmentManager().popBackStack();
}
}
public interface SuicidalFragmentListener {
void onFragmentSuicide(String tag);
}
public class MyFragment extends Fragment {
// onCreateView etc
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
suicideListener = (SuicidalFragmentListener) activity;
} catch (ClassCastException e) {
throw new RuntimeException(getActivity().getClass().getSimpleName() + " must implement the suicide listener to use this fragment", e);
}
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
// Attach the close listener to whatever action on the fragment you want
addSuicideTouchListener();
}
private void addSuicideTouchListener() {
getView().setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
suicideListener.onFragmentSuicide(getTag());
}
});
}
}
2 years ago
在Activity / AppCompatActivity中:
@Override
public void onBackPressed() {
if (mDrawerLayout.isDrawerOpen(GravityCompat.START)) {
// if you want to handle DrawerLayout
mDrawerLayout.closeDrawer(GravityCompat.START);
} else {
if (getFragmentManager().getBackStackEntryCount() == 0) {
super.onBackPressed();
} else {
getFragmentManager().popBackStack();
}
}
}
然后调用片段:
getActivity().onBackPressed();
或者在其他答案中说明,请在片段中调用:
getActivity().getSupportFragmentManager().beginTransaction().remove(this).commit();
2 years ago
查看DialogFragment是否满足您的需求 . DialogFragment有一个dismiss()方法 . 在我看来更清洁 .
2 years ago
我为此创建了简单的方法
popBackStack(getSupportFragmentManager());
然后将它放在我的ActivityUtils类中
public static void popBackStack(FragmentManager manager){
FragmentManager.BackStackEntry first = manager.getBackStackEntryAt(0);
manager.popBackStack(first.getId(), FragmentManager.POP_BACK_STACK_INCLUSIVE);
}
这很棒,玩得开心!
2 years ago
在OnCreate:
//Add comment fragment
container = FindViewById(Resource.Id.frmAttachPicture);
mPictureFragment = new fmtAttachPicture();
var trans = SupportFragmentManager.BeginTransaction();
trans.Add(container.Id, mPictureFragment, "fmtPicture");
trans.Show(mPictureFragment); trans.Commit();
这就是我在点击事件1中隐藏片段的方法
//Close fragment
var trans = SupportFragmentManager.BeginTransaction();
trans.Hide(mPictureFragment);
trans.AddToBackStack(null);
trans.Commit();
然后将其显示回事件2
var trans = SupportFragmentManager.BeginTransaction();
trans.Show(mPictureFragment); trans.Commit();
2 years ago
如果您需要从Backstack历史记录中的第四个片段弹回到第一个片段,请使用标签!
当你添加第一个片段时,你应该使用这样的东西:
getFragmentManager.beginTransaction.addToBackStack("A").add(R.id.container, FragmentA).commit()
要么
getFragmentManager.beginTransaction.addToBackStack("A").replace(R.id.container, FragmentA).commit()
当你想要显示片段B,C和D时,你可以使用:
getFragmentManager.beginTransaction.addToBackStack("B").replace(R.id.container, FragmentB, "B").commit()
和其他信件....
要返回 Fragment A,只需调用 popBackStack(0, "A") ,是,使用添加时指定的标志,并注意它必须与命令 addToBackStack() 中的标志相同,而不是命令replace或add中使用的标志 .
别客气 ;)
2 years ago
为什么不呢:
getActivity()结束();