【问题标题】:v4 getFragmentManager with Activity - Incompatible typesv4 getFragmentManager 与 Activity - 不兼容的类型
【发布时间】:2014-10-08 21:10:40
【问题描述】:

我有一个按预期运行的简单活动。

import android.app.Activity;
import android.app.FragmentManager;
// import android.support.v4.app.FragmentManager;
import android.os.Bundle;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // FragmentManager fm = getSupportFragmentManager(); // ActionBarActivity
        FragmentManager fm = getFragmentManager(); // Activity
    }
}

然后我换了

import android.app.FragmentManager;

import android.support.v4.app.FragmentManager;

所以我可以支持我的旧设备。但是,这会报告错误:

Incompatible types.

    Required: android.support.v4.app.FragmentManager

    Found: android.app.FragmentManager

我在这里做错了什么?

我发现的流行解决方案是改用 getSupportFragmentManager(),但这仅适用于 ActionBarActivites [编辑 - 查看答案] 和 FragmentActivities。

cannot convert from android.app.FragmentManager to android.support.v4.app.FragmentManager

其他相关解决方案指向使用 FragmentActivity,但这似乎有相同的遗留问题。

The method getFragmentManager() is undefined for the type MyActivity

import android.support.v4.app.FragmentManager;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;

    public class MainActivity extends FragmentActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //setContentView(R.layout.activity_main);
        // FragmentManager fm = getSupportFragmentManager(); // ActionBarActivity
        FragmentManager fm = getFragmentManager();
    }
}

我很确定这个问题的解决方案已经在 SE 上,但(对我而言)并不容易找到。最小的例子也应该帮助其他人理解它。

  • 我对 Android 还很陌生。

【问题讨论】:

    标签: android android-activity fragment


    【解决方案1】:

    在第一种情况下,如果您使用 getSupportFragmentManager(),则需要扩展 FragmentActivity 或扩展 ActionBarActivity(扩展 FragmentActivity),因为 FragmentActivity 是基于支持的片段的基类。

    在第二种情况下,您需要使用getSupportFragmentManager() 而不是getFragmentManager()

    在蜂窝中引入了碎片。要支持蜂窝以下的片段,您需要使用支持库中的片段,在这种情况下,您需要扩展 FragmentActivity 并使用 getSupportFragmentManager()

    【讨论】:

    • 这不是最初的问题,因为现在已经找到了解决方案,但为什么我不能使用标准活动?当然,v4 支持应该允许活动以与新 API 相同的方式运行。其次,现在我必须使用 FragmentActivity 而不是 Activity,我的代码是否可能有任何其他连锁反应?
    • @David 如果使用 v4,则使用 FragmentActivity。不用担心使用来自支持库的所有导入。如果您再次阅读该帖子,我回答了这两种情况。不兼容的类型是因为您需要使用来自支持库的导入
    • 感谢您和罗德的帮助。我还发现了这个 - stackoverflow.com/questions/10477997/… - 这可能对那些感兴趣的人有用。
    • @David 阅读 developer.android.com/reference/android/support/v7/app/…。看到这个↳ android.app.Activity ↳ android.support.v4.app.FragmentActivity ↳ android.support.v7.app.ActionBarActivity
    【解决方案2】:
    use getSupportFragmentManager() instead, but this only works for ActionBarActivites.
    

    错了,它应该在您的FragmentActivity 中工作,FragmentActivity 在您的支持包中,当您支持旧设备时,您从activityfragmentfragment managers 等的所有导入必须有@ 987654326@ 指定您正在使用支持包。不使用so会导致incompatible compile time error.

    What am I doing wrong here?
    

    正如我上面所说,您正在将支持包与非支持包结合起来,结果为incompatible compile time error

    【讨论】:

    • 对不起,你是对的。它也适用于 FragmentActivity。
    • @David 只是确保当您使用支持时,您必须使用支持包,如上所述。 :))
    【解决方案3】:

    对于 Kotlin guyz,你不必更改为非 v4

    只要它的父活动,就使用下面来获取活动

    (activity as MainDrawerActivity)
    

    ((YourActivityName)getActivity());
    

    【讨论】:

      【解决方案4】:

      用于 Java 对话框:

       - import android.app.FragmentManager;
       - FragmentManager fragmentManager;
      

      对于 Kotlin:

       - (activity as? YourActivity)?.fragmentManager
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-10-04
        • 2013-05-02
        • 2020-06-30
        • 2022-01-22
        相关资源
        最近更新 更多