从片段中完成当前活动

时间:2011-10-26 19:37:35

标签: android

我在活动中有一个片段,我将其用作导航抽屉。它包含单击时启动新活动的按钮(片段中的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。 (所以从新活动中退回会在技术上将它们放回发射器)

11 个答案:

答案 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)

try to use this

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