【问题标题】:How to move from "android.app.Fragment" to "android.support.v4.app.Fragment"如何从“android.app.Fragment”移动到“android.support.v4.app.Fragment”
【发布时间】:2016-11-08 19:58:53
【问题描述】:

我正在为我的应用程序进行 Facebook 集成。根据客户要求,我目前在我的应用程序中使用的所有片段都是 android.app.Fragment。现在,我们为 Facebook 创建的 Fragment 是 android.support.v4.app.Fragment。如果我们将其转换为android.app.Fragment,功能loginButton.setFragment(this); 会显示错误。

我的问题是,我怎样才能从 android.app.Fragment 移动到 android.support.v4.app.Fragment 因为这段代码出错了:

getActivity().getFragmentManager()
    .beginTransaction()
    .replace(R.id.content_frame,new MainFragment())
    .addToBackStack(null)
    .commit();

它显示的错误是:

第二个参数类型错误。成立: 'com.nicklodean.nicklodean.fragment.MainFragment',必需: 'android.app.Fragment'

请建议我该如何解决这个问题。

【问题讨论】:

    标签: android android-fragments


    【解决方案1】:

    首先,您需要在 Gradle 中的依赖项

    compile 'com.android.support:appcompat-v7:XX.Y.Z'
    

    对于您拥有的相应 SDK XX.Y 版本。

    (确实只需要 v4 库,但 v7 应该没问题)


    我无法为您提供loginButton.setFragment(this) 的帮助,因为我不知道这是在做什么...但是,您当然需要更改loginButton 类的类参数/导入。

    假设您使用的是AppCompatActivityFragmentActivity,则需要使用getActivity().getSupportFragmentManager()

    个人意见:你应该从 Fragment 回调 Activity 来管理 FragmentManager (as shown here),而不是使用getActivity()直接从 Fragment 类中拉出来

    【讨论】:

    • 要使用 getActivity().getSupportFragmentManager(),我需要将我的 app.fragment 更改为 android.support.v4.app.Fragment,我不能这样做,因为它超出了要求跨度>
    • 那么您的要求与您的代码冲突。你问如何使用 v4 Fragments,你就是这样做的
    【解决方案2】:

    只需添加这些依赖项

    dependencies {
        compile 'com.android.support:support-v4:18.0.0'
        compile "com.android.support:appcompat-v7:18.0.+"
    }
    

    【讨论】:

    • 为什么是版本 18?而v7 包括v4,所以只需要第二个
    【解决方案3】:

    希望对你有帮助

    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
        Fragment oldFragment = getSupportFragmentManager().findFragmentByTag(YOUR_FRAGMENT_TAG);
        if (oldFragment == null) {
            ft.add(yourfragment,YOUR_FRAGMENT_TAG);
            ft.commitAllowingStateLoss();
        } else if (!oldFragment.isAdded()) {
            ft.remove(oldFragment);
            ft.add(yourfragment,YOUR_FRAGMENT_TAG);
            ft.commitAllowingStateLoss();
        }
    

    【讨论】:

    • 没有帮助,因为我必须有“import android.support.v4.app.Fragment”才能使用“getSupportFragmentManager()”。我不能这样做,因为我必须在这里使用“android.app.Fragment”。
    • 尝试在声明片段之前放置android.support.v4.app:android.support.v4.app.Fragment = getSupportFragmentManager().findFragmentByTag(YOUR_FRAGMENT_TAG);
    • 也在 FragmentTransaction 之前但 android.support.v4.app : android.support.v4.app.FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    【解决方案4】:

    您只需必须android.support.v4.app.FragmentManager 与任何android.support.v4.app.Fragment 一起使用,并将android.app.FragmentManager 与任何android.app.Fragment 一起使用。没有办法解决这个问题。

    如果您需要同时使用Fragment 类的两个版本(在一个Activity 中),则必须分别管理每个FragmentManager 中的片段。请查看this answer 了解如何操作。

    【讨论】:

      猜你喜欢
      • 2012-02-18
      • 1970-01-01
      • 2015-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多