【问题标题】:InflateException when opening View with injected Fragment使用注入的 Fragment 打开 View 时出现 InflateException
【发布时间】:2015-01-11 23:14:39
【问题描述】:

我的应用有一种用于 Youtube 视频的点唱机。我使用YouTubePlayerFragment,我的布局如下所示:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:orientation="vertical">

    <ListView
        android:id="@+id/lv_songs"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

    <fragment
        android:id="@+id/youtube_fragment"
        android:name="com.google.android.youtube.player.YouTubePlayerFragment"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

</LinearLayout>

这是我的代码:

void init() {
     youtubePlayer = (YouTubePlayerFragment) getActivity().getFragmentManager().findFragmentById(R.id.youtube_fragment);
     youtubePlayer.initialize(AppUtils.API_KEY, this);
}

@Override
public void onInitializationSuccess(YouTubePlayer.Provider provider, YouTubePlayer ytplayer,

        boolean wasRestored) {
           player = ytplayer;
        }

        @Override
        public void onInitializationFailure(final YouTubePlayer.Provider provider, final YouTubeInitializationResult youTubeInitializationResult) {
        }

        @Override
        public void onResume() {
            super.onResume();
            ((HomeActivity_) getActivity()).getSupportActionBar().setTitle(getString(R.string.jukebox));
        }
}

当我第一次打开这个视图时,没有问题。我可以从我的ListView 中选择一个视频并播放它。但是当我再次回到这个视图时,我得到了一个InflateException

Caused by: java.lang.IllegalArgumentException: Binary XML file line #12: Duplicate id 0x7f09004a, tag null, or parent id 0xffffffff with another fragment for com.google.android.youtube.player.YouTubePlayerFragment

所以我猜我的片段的YouTubePlayerFragment 没有被回收onPause。即使我打电话

getActivity().getSupportFragmentManager().beginTransaction().remove(getActivity().getSupportFragmentManager().findFragmentById(R.id.youtube_fragment)).commit();

onPause 中,仍然有同样的错误。如何避免此Fragment 再次膨胀,或每次离开此视图时删除膨胀的Fragment

【问题讨论】:

    标签: android android-fragments inflate-exception


    【解决方案1】:

    由于您使用的是 SupportFragmentManager,因此您还应该使用支持 youtube 片段:

    <fragment
        android:id="@+id/youtube_fragment"
        android:name="com.google.android.youtube.player.YouTubePlayerSupportFragment"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
    

    【讨论】:

    • 当我将其更改为 com.google.android.youtube.player.YouTubePlayerSupportFragment 时,我在第一次尝试打开视图时遇到 NPE...
    • @JensJensen 不清楚您使用的是什么。在 1 个地方,您拨打 getFragmentManager 在其他 getSupportFragmentManager。根据您的minSdk 坚持其中之一。
    • 我将所有内容都更改为“SupportFragmentManager”。但正如我所说,当我尝试调用 youtubePlayer.initialize() 时,我得到了一个 NPW。但我绝对称 youtubePlayer = (YouTubePlayerSupportFragment) getActivity().getSupportFragmentManager().findFragmentById(R.id.youtube_fragment);之前。
    【解决方案2】:

    我有同样的问题。出于某种原因,YouTubePlayerFragment 在第二次打开它时不断使我的活动崩溃 - 也带有“InflateException”错误消息。 就我而言,YouTubePlayerFragment 位于另一个片段内。 最初,我习惯在 XML 文件中对其进行 decalre。

    我没有在 XML 文件中声明 YouTubePlayerFragment,而是转而在我的 Java 代码中对其进行实例化和扩展。这样就解决了问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-28
      • 1970-01-01
      • 2017-06-03
      • 1970-01-01
      • 2017-11-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多