56

我在 a 中有一组选项卡FragmentActivity,每个选项卡都有自己的片段。当我尝试通过一个从该片段中启动一个新活动onClickListener并使用该startActivity(myIntent)方法时,我的应用程序强制关闭。

环顾了一会后,我找到了一个或两个对名为 的方法的引用startActivityFromFragment,但是在搜索了一个小时左右之后,我找不到任何关于如何使用它或者这是否是我应该使用的解释或示例.

我想我要问的是从活动启动新活动与从片段启动新活动之间是否有任何区别,如果是,我需要实现什么?

4

5 回答 5

50

你应该这样做getActivity().startActivity(myIntent)

于 2012-08-22T13:52:49.507 回答
45

我做到了,下面的代码对我有用....

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.hello_world, container, false);

        Button newPage = (Button)v.findViewById(R.id.click);
        newPage.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                Intent intent = new Intent(getActivity(), HomeActivity.class);
                startActivity(intent);
            }
        });
        return v;
    }

请确保您的目标活动应在 Manifest.xml 文件中注册,

但在我的情况下,所有选项卡都没有显示在 HomeActivity 中,有什么解决方案吗?

于 2013-05-20T08:00:04.937 回答
13

从 Fragment 启动 Activity 和从 Activity 启动 Activity 的区别在于如何获取上下文,因为在这两种情况下它都必须是 Activity。

来自活动: 上下文是当前活动 ( this)

Intent intent = new Intent(this, NewActivity.class);
startActivity(intent);

来自片段: 上下文是父活动 ( getActivity())。请注意,片段本身可以通过 启动活动startActivity(),这不是必须从活动中完成的。

Intent intent = new Intent(getActivity(), NewActivity.class);
startActivity(intent);
于 2016-10-09T10:44:35.480 回答
6

我这样做是为了从出现在多个活动中的(自定义)菜单片段启动 SendFreeTextActivity:

在 MenuFragment 类中:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_menu, container, false);

    final Button sendFreeTextButton = (Button) view.findViewById(R.id.sendFreeTextButton);
    sendFreeTextButton.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            Log.d(TAG, "sendFreeTextButton clicked");
            Intent intent = new Intent(getActivity(), SendFreeTextActivity.class);
            MenuFragment.this.startActivity(intent);
        }
    });
    ...
于 2013-01-25T12:17:43.957 回答
1

使用 Fragment 所在的 Activity 的基本上下文来启动 Intent。

Intent j = new Intent(fBaseCtx, NewactivityName.class);         
startActivity(j);

fBaseCtx您当前的活动在哪里BaseContext。你可以得到它fBaseCtx = getBaseContext();

于 2013-11-21T19:55:07.283 回答