嵌套片段的转换问题:android.support.v4.app.Fragment VS android.app.Fragment

时间:2015-02-24 19:16:18

标签: android fragment android-appcompat

我遇到了跨API问题。我的方案如下:

  1. 我正在开发一个使用 support-v4-AppCompat 的应用程序,使用 android.support.v4.app.Fragment ;
  2. 我正在使用 getChildFragmentManager 来检索嵌套的片段。这是需要的,因为我有一个 PageView 来滚动几个片段,其中一个使用 com.google.android.gms.maps.SupportMapFragment 作为嵌套片段;
  3. 我还需要使用ShinobiCharts,因为我们正在开发解决方案。 ChartFragment android.app.Fragment 的子类。
  4. 当我尝试使用这样的嵌套片段时出现问题:

    <fragment
        class="com.shinobicontrols.charts.ChartFragment"
        android:id="@+id/chart"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
    

    从另一个片段中检索对它的引用,如下所示:

    public class TCPSpeedFragment extends android.support.v4.app.Fragment {
    
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            FragmentManager fragMan = getChildFragmentManager();
            // BELLOW LINE GIVES ERROR OF TYPE CONVERSION
            android.app.Fragment frag = fragMan.findFragmentById(R.id.chart);
    
    }
    

    正如我们所看到的,给定的错误是类型不匹配:无法从android.support.v4.app.Fragment转换为android.app.Fragment 。但是当试图转换它们时,它变得非常痛苦,我还没有找到解决方案。

    有没有人有想法解决此兼容性/转换问题?

2 个答案:

答案 0 :(得分:1)

首先,我不相信您可以获得对XML中定义的嵌套Fragment的引用。这本身就是错误的:嵌套Fragment只能添加&amp;以编程方式删除,我很惊讶你没有想到这是一个潜在的问题。您在XML中定义Fragment然后通过调用findViewById()尝试获取对它的引用的方式是不正确的。

现在回答你的主要问题,不幸的是,没有方式将android.support.v4.app.Fragment投射到android.app.Fragment。您有以下选择:

  • 查看该库是否具有可与v4支持库一起使用的Fragment
  • 如果该库是开源的,请尝试对其进行修改,使其使用android.support.v4.app.Fragment代替android.app.Fragment
  • 如果它不是开源的,您可以停止使用该库并尝试查找另一个库,或者您可以放弃对项目中android.support.v4.app.Fragment的支持,而是在任何地方使用android.app.Fragment在你的应用程序中。

希望这很有用。

答案 1 :(得分:0)

嗯..我认为我找到了一个解决方案,就像我一直在寻找的那样。我使用以下几行:

Fragment frag = getChildFragmentManager().findFragmentById(R.id.chart);
SupportChartFragment supportFrag = (SupportChartFragment)frag;
ShinobiChart shinobiChart = supportFrag.getShinobiChart();

有了这个,我现在可以编译我的项目而没有错误。