java类中的finish_如何让Fragment自行删除,即它相当于finish()?

回答(10)

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

我不明白的是,当按下“确定”以删除片段Df,Cf和Bf时,在Df中该怎么做?

步骤#1:让Df告诉D“哟!我们得到了OK点击!”通过调用方法,可以是活动本身,也可以是活动提供的接口实例 .

步骤#2:让D通过 FragmentManager 删除片段 .

托管活动(D)是知道活动中的其他片段(与其他活动相比)的活动 . 因此,可能会影响片段混合的片段内事件应传播到活动,这将使适当的编排移动 .

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

虽然它可能不是最好的方法,但我能想到的最接近的等价物是支持/兼容性库

getActivity().getSupportFragmentManager().beginTransaction().remove(this).commit();

要么

getActivity().getFragmentManager().beginTransaction().remove(this).commit();

除此以外 .

此外,您可以使用backstack并弹出它 . 但是请记住,片段可能不在backstack上(取决于在那里获得它的片段事务..)或者它可能不是最后一个进入堆栈,因此弹出堆栈可能会删除错误的...

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

你可以使用下面的方法,它工作正常:

getActivity().getSupportFragmentManager().popBackStack();

e15298c6a3b4591803e154ab0c3b3e2e.png

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

}

});

}

}

e15298c6a3b4591803e154ab0c3b3e2e.png

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

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

查看DialogFragment是否满足您的需求 . DialogFragment有一个dismiss()方法 . 在我看来更清洁 .

e15298c6a3b4591803e154ab0c3b3e2e.png

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

}

这很棒,玩得开心!

e15298c6a3b4591803e154ab0c3b3e2e.png

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

e15298c6a3b4591803e154ab0c3b3e2e.png

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中使用的标志 .

别客气 ;)

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

为什么不呢:

getActivity()结束();

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值