【问题标题】:How do I start an activity from within a Fragment? [duplicate]如何从片段中开始活动? [复制]
【发布时间】:2012-08-17 23:08:29
【问题描述】:

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

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

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

【问题讨论】:

  • 发布应用强制关闭时的代码和 logcat 输出
  • FragmentActivity.startActivityFromFragment()Fragment.startActivityForResult() 调用以实现其行为,而Activity.startActivityFromFragment() 在此活动中的Fragment 调用其startActivity() 时被调用。我们不需要直接打电话给他们。

标签: android android-activity fragment


【解决方案1】:

你应该用getActivity().startActivity(myIntent)来做

【讨论】:

  • 我实际上只是凭直觉尝试过 - 在 onClickListener 中我设置了一个意图,然后我调用 getActivity().startActivity(myIntent) - 我是否必须特别添加任何其他内容结束片段或活动?
  • @EkKoZ :这不是必需的。 FragmentstartActivity(Intent intent) 方法实际上做了同样的事情。
  • 这是肯定的,但我认为这可能是上下文的范围问题
  • 无法显示空白屏幕。活动 onCreate() 方法正在从其显示一个简单的空白屏幕中调用。
  • 确保 getActivity() 不会返回 null,因为 Fragment 在其诞生时并未附加到 Activity
【解决方案2】:

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

@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 方法?..
  • 我如何在这里使用 backstack
【解决方案3】:

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

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

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

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

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

【讨论】:

  • 如果我有一个fragmentactivity怎么办?
  • @Euridice01 因为FragmentActivity 扩展了Activity,您可以使用this 作为上下文,就像在正常活动中一样。更多信息可以在这里找到:stackoverflow.com/a/39733562
  • 还有一件事,BindingFragmentActivity 呢?我在网上找不到任何东西。
  • @Euridice01 如果您的意思是来自androidbound 库的BindingFragmentActivity,那么BindingFragmentActivity 扩展了FragmentActivity,正如上面提到的扩展Activity。我从未使用过 androidbound 库,但从它的外观来看,BindingFragmentActivity 不再受支持(不要引用我的话)。
【解决方案4】:

我这样做是为了从出现在多个活动中的(自定义)菜单片段启动 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);
        }
    });
    ...

【讨论】:

    【解决方案5】:

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

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

    其中fBaseCtx 是您当前活动的BaseContext。 你可以得到它fBaseCtx = getBaseContext();

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-06
      • 1970-01-01
      • 1970-01-01
      • 2021-10-26
      相关资源
      最近更新 更多