从片段中完成当前活动

NPi*_*ike 83 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();
    } 
}
Run Code Online (Sandbox Code Playgroud)

但似乎Fragment.class没有实现finish()(就像它实现了startActivity(...)).

我希望在他们启动第二项活动时清除活动后台.(所以从新活动中退回会在技术上将它们放回发射器)

cod*_*e22 250

使用片段this时,请始终使用,而不是使用或引用上下文getActivity().你应该打电话

getActivity().finish();
Run Code Online (Sandbox Code Playgroud)

从片段完成你的活动.

  • 在某些情况下,`getActivity()`可以是`null`.那我们该怎么办? (9认同)
  • Activity 应该是控制器/负责人而不是片段,您应该通过回调接口回调 Activity,并让 Activity 决定是否应该自行完成。 (4认同)
  • @ user983956在这种情况下,活动已被破坏,所以不要调用`finish`. (3认同)
  • 提示:如果您在膨胀视图之前尝试使用 getActivity 可以为 null (2认同)

Jon*_*ock 24

实际上...

我不会让Fragment尝试完成Activity.在我看来,这对片段放置了太多的权威.相反,我会在这里使用指南:http://developer.android.com/training/basics/fragments/communicating.html

让Fragment定义Activity必须实现的接口.调用Activity,然后让Activity决定如何处理这些信息.如果活动希望自己完成,那么它可以.

  • 这是一个很好的观点,因为单个活动可以存在多个片段。正如您所提到的,片段与其活动进行通信的首选方式是通过接口。 (2认同)

Sas*_*tch 8

正如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();
    }
}
Run Code Online (Sandbox Code Playgroud)

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
   }
}
Run Code Online (Sandbox Code Playgroud)


rah*_*hat 6

这不需要断言,android JetPack 中片段的最新更新

requireActivity().finish();
Run Code Online (Sandbox Code Playgroud)


Mad*_*ama 5

您应该使用 getActivity() 方法来完成片段中的活动。

getActivity().finish();
Run Code Online (Sandbox Code Playgroud)