如何从Fragment中启动一个Activity?

56

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

经过一番搜索,我找到了几个关于一个名为startActivityFromFragment的方法的参考,但在搜索了一个小时左右后,我找不到任何解释或示例来说明如何使用它,或者是否应该使用这个方法。

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


1
发布代码和日志输出,以便查看应用程序强制关闭的原因。 - Squonk
1
FragmentActivity.startActivityFromFragment()Fragment.startActivityForResult() 调用以实现其行为,当此活动中的片段调用其 startActivity() 时,将调用 Activity.startActivityFromFragment()。我们不需要直接调用它们。 - naXa stands with Ukraine
5个回答

50

你应该使用 getActivity().startActivity(myIntent) 进行操作。


我只是凭直觉尝试了一下 - 在 onClickListener 中,我设置了一个 intent,然后调用 getActivity().startActivity(myIntent) - 我需要添加其他特定的内容来结束 fragment 或 activity 吗? - user1617134
7
这并非必要。FragmentstartActivity(Intent intent)方法可以有效地达到相同的效果。 - Squonk
那是肯定的,但我认为这可能是上下文范围的问题。 - geekkoz
1
无法工作,显示空白屏幕。activity onCreate() 方法正在调用,但只显示一个简单的空白屏幕。 - Abhijit Chakra
确保getActivity()不返回null,因为Fragment在其创建时未附加到Activity上。 - Vikram Bodicherla

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中,是否有解决方案?


现在它可以工作了,但我不明白它是如何工作的 :-( 为什么我不能直接使用onClick方法呢? - McLan
我该如何在这里使用后退栈? - Vasant Raval

13

从Fragment启动Activity和从Activity启动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);

如果我有一个FragmentActivity怎么办? - Euridice01
@Euridice01 因为FragmentActivity继承自Activity,所以您可以像在普通活动中一样使用this作为上下文。更多信息可以在此处找到:https://stackoverflow.com/a/39733562 - David Dostal
还有一个问题,BindingFragmentActivity怎么样?我在网上找不到相关信息。 - Euridice01
@Euridice01 如果你指的是来自androidbound库的BindingFragmentActivity,那么BindingFragmentActivity继承了FragmentActivity,而FragmentActivity又继承了Activity,就像上面提到的一样。 我从未使用过androidbound库,但从外观上看,BindingFragmentActivity似乎不再受支持(不要引用我说的话)。 - David Dostal

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);
        }
    });
    ...

1
使用包含片段的活动的基本上下文来启动意图。
Intent j = new Intent(fBaseCtx, NewactivityName.class);         
startActivity(j);

其中fBaseCtx是您当前活动的BaseContext。您可以使用fBaseCtx = getBaseContext();来获取它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接