2011-10-26 48 views
61

我在作为导航抽屉使用的活动中有一个片段。它包含按钮,单击时会启动新的活动(片段中的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没有实现完成()(就像它实现startActivity(...))。

我想活动backstack清除,当他们启动第二项活动。 (因此,从新活动中按回来将在技术上将它们放回发射器)

回答

199

当使用片段而不是使用this或引用上下文时,始终使用getActivity()。您应该致电

getActivity().finish(); 

要从片段完成您的活动。

+0

当使用片段而不是使用this或引用上下文时,总是使用getActivity();当使用片段 –

+6

'getActivity()'在某些情况下可以为'null'。我们应该怎么做? –

+3

@ user983956在这种情况下,活动已经被破坏,所以不要叫'finish'。 – Cristian

17

其实...

我不会有碎片尝试完成活动。在我看来,这给片段带来了太多的权威。相反,我会在这里使用指南:http://developer.android.com/training/basics/fragments/communicating.html

让Fragment定义了一个活动必须实现的接口。打电话给活动,然后让活动决定如何处理这些信息。如果活动希望完成自己,那么它可以。

+1

这是一个好点,因为单个活动可以有多个片段存在。正如你所提到的,片段与其活动交流的首选方式是通过一个接口。 – Sasquatch

4

正如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 
    } 
} 
1

每次我使用finish来关闭片段时,整个活动都会关闭。根据文件,只要父母活动仍然存在,片段应该保留。我发现我可以使用以下语句将视图更改回父活动: setContentView(R.layout.activity_main);

这会让我回到父活动。

我希望这可以帮助别人谁可能正在寻找这个。

0

try to use this

Fragment.class没有实现finish()

当碎片的工作,而不是使用这个或指的情况下,始终使用getActivity()。你应该叫

+5

告诉我你的答案和上面第一个答案的区别(by @ coder_For_Life22)... –

1

很简单...

1只是getActivity()在片段

2-抢活动,然后调用finish();

所以才getActivity().finish();将完成父活动。

1

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

getActivity().finish();