我在活动中有一个片段,我将其用作导航抽屉。它包含单击时启动新活动的按钮(片段中的startActivity仅调用当前活动的startActivity)。
对于我的生活,我似乎无法弄清楚如何在开始新活动后完成当前的活动。
我希望在片段中实现类似的功能:
@Override
public void onClick(View view) {
// TODO Auto-generated method stub
if (view == mButtonShows) {
Intent intent = new Intent(view.getContext(), MyNewActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
finish();
}
}
但似乎Fragment.class没有实现finish()(就像它实现了startActivity(...))。
我希望在启动第二个活动时清除活动backstack。 (所以从新活动中退回会在技术上将它们放回发射器)
答案 0 :(得分:237)
使用片段时,请始终使用this
,而不是使用getActivity()
或引用上下文。你应该打电话给
getActivity().finish();
从片段完成您的活动。
答案 1 :(得分:23)
实际上......
我不会让片段尝试完成活动。在我看来,这对片段放置了太多的权威。相反,我会在这里使用指南:http://developer.android.com/training/basics/fragments/communicating.html
让Fragment定义Activity必须实现的接口。调用Activity,然后让Activity决定如何处理这些信息。如果活动希望自己完成,那么就可以。
答案 2 :(得分:6)
正如Jon F Hancock所提到的,这就是片段如何关闭'建议活动结束的活动。这使得片段便携,因为它们是原因。如果您在其他活动中使用它,则可能不想关闭活动。
下面的代码是来自活动和片段的片段,其中包含一个保存和取消按钮。
PlayerActivity
public class PlayerActivity extends Activity
implements PlayerInfo.PlayerAddListener {
public void onPlayerCancel() {
// Decide if its suitable to close the activity,
//e.g. is an edit being done in one of the other fragments?
finish();
}
}
PlayerInfoFragment,包含调用活动需要实现的接口。
public class PlayerInfoFragment extends Fragment {
private PlayerAddListener callback; // implemented in the Activity
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
callback= (PlayerAddListener) activity;
}
public interface PlayerAddListener {
public void onPlayerSave(Player p); // not shown in impl above
public void onPlayerCancel();
}
public void btnCancel(View v) {
callback.onPlayerCancel(); // the activity's implementation
}
}
答案 3 :(得分:2)
很简单......
1-只是在片段
中抓取getActivity()
的活动
2-然后拨打finish();
所以只需getActivity().finish();
即可完成父活动。
答案 4 :(得分:1)
每次使用完成来关闭片段时,整个活动都会关闭。根据文档,只要父活动仍然存在,片段就应该保留。
相反,我发现我可以使用以下语句将视图更改回父活动: 的setContentView(R.layout.activity_main);
这会让我回到父活动。
我希望这有助于其他可能正在寻找此事的人。
答案 5 :(得分:1)
您应该使用getActivity()方法来完成片段中的活动。
getActivity().finish();
答案 6 :(得分:0)
是Fragment.class
未实现finish()
使用片段时,请始终使用getActivity()
,而不是使用此片段或引用上下文。你应该打电话给
答案 7 :(得分:0)
在片段中,使用getActivity.finishAffinity()
getActivity().finishAffinity();
它还将与Activity一起从堆栈中删除当前活动推入的所有片段...
答案 8 :(得分:0)
尝试一下。不应有任何警告...
Activity thisActivity = getActivity();
if (thisActivity != null) {
startActivity(new Intent(thisActivity, yourActivity.class)); // if needed
thisActivity.finish();
}
答案 9 :(得分:0)
2020年6月15日-更新的答案。
对于Java和Kotlin,您有两个选择。但是,两种方法的逻辑是相同的。您应该在调用 finish()方法之后调用活动。
科特林的答案 ,
如果您的活动不能为空,请使用 Answer_1 。但是,如果您的活动可以为空,请使用 Answer_2 。
Answer_1: activity!!.finish()
Answer_2: activity?.finish()
Java答案
getActivity().finish();
@canerkaseler
答案 10 :(得分:0)
这不需要断言,Android JetPack中片段的最新更新
requireActivity().finish();