クラスフラグメントの拡張エラー


161

エラーが出る

Unable to start activity ComponentInfo{de.androidbuch.activiti/de.androidbuch.activiti.task.Activity}: android.view.InflateException: Binary XML file line #11: Error inflating class fragment

ポートレートモードとランドスケープモードを切り替えると、フラグメントを使用しています。私のxmlは:

 <LinearLayout android:id="@+id/mainLayout"
               android:orientation="horizontal"
               android:layout_width="fill_parent"
               android:layout_height="wrap_content" >

    <ListView android:id="@+id/android:list"
              android:layout_height="wrap_content"
              android:layout_width="fill_parent"/> 

    <fragment android:id="@+id/fragmentDetails"
              android:layout_height="fill_parent"
              android:layout_width="fill_parent"
              class="de.androidbuch.activiti.task.TaskDetailsFragment"/> 
</LinearLayout>

横モードと縦モードで切り替えると、すべてが正常に動作します。しかし、フラグメントをクリックして(フラグメントを表示できます)、他のモードに切り替えると、エラーが発生します。どのように私はそれを解決することができますか?ここにいくつかの答えが見つかりましたが、どれも私を助けませんでした...

06-21 14:55:05.600: ERROR/AndroidRuntime(7636): FATAL EXCEPTION: main
06-21 14:55:05.600: ERROR/AndroidRuntime(7636): java.lang.RuntimeException: Unable to start activity         
ComponentInfo{de.androidbuch.activiti/de.androidbuch.activiti.task.Activity}:   android.view.InflateException: Binary XML file line #11: Error inflating class fragment
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1736)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1752)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3097)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at android.app.ActivityThread.access$1600(ActivityThread.java:123)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:997)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at android.os.Handler.dispatchMessage(Handler.java:99)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at android.os.Looper.loop(Looper.java:126)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at android.app.ActivityThread.main(ActivityThread.java:3998)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at java.lang.reflect.Method.invokeNative(Native Method)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at java.lang.reflect.Method.invoke(Method.java:491)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at dalvik.system.NativeStart.main(Native Method)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636): Caused by: android.view.InflateException: Binary XML file line #11: Error inflating class fragment
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:688)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at android.view.LayoutInflater.rInflate(LayoutInflater.java:724)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at android.view.LayoutInflater.rInflate(LayoutInflater.java:727)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at android.view.LayoutInflater.inflate(LayoutInflater.java:479)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at android.view.LayoutInflater.inflate(LayoutInflater.java:391)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at android.view.LayoutInflater.inflate(LayoutInflater.java:347)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:227)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at android.app.Activity.setContentView(Activity.java:1771)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at de.androidbuch.activiti.task.TaskActivity.onCreate(TaskActivity.java:83)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1048)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1700)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     ... 12 more

レイアウトとレイアウトランドフォルダーに別々のレイアウトファイルを保持していますか?
Nathan Fig

「アクティビティを開始できません...」のの行を含む完全なエラーログを提供できますか
Dave

@Nathan図:はい私は..しかし..エラーが出る
TSYNC

@デイブ:あなたはここに行く..任意のアイデア?
tsync

横長のレイアウトコードが必要です。また、setContentViewへの呼び出しと、縦長モードでアクティビティを開始する方法も役立ちます。現在、十分な情報がないようです。APIデモでFragmentLayoutの例を見ると、同じようなことをしているように聞こえるため、役立つ場合があります。
PJL 2011年

回答:


131

hdemirchianが言ったように、必ず使用してください:

import android.support.v4.app.Fragment;

また、フラグメントを使用しているアクティビティFragmentActivityが、通常のの代わりに拡張されていることを確認してくださいActivity

import android.support.v4.app.FragmentActivity;

FragmentActivityクラスを取得します。


12
これは多くの賛成を得ましたが、私にとってはアプリの再開時にクラッシュし、私はすでにv4 Fragmentとv4 FrsgmentActivityを使用しています-より正確にはAppCompatActivityです。
ジョセフ2015年

4
これは解決策ではありません。android.support.v4.app.Fragmentをインポートします。何も変更しません。実際には未使用で不要なインポートです。
f470071 2015年

7
ありがたいことに、AppCompatActivityはFragmentActivityの子孫であるということです。
abedfar 2016

しかし、私は短剣フラグメントを使用しており、短剣フラグメントは常にフラグメントアクティビティではなくフラグメントを拡張します
user3475052

96

呼び出される前にフラグメント内でandroid.view.InflateException: Binary XML file line: #... Error inflating class fragment操作すると、例外が発生する可能性がgetActivity()ありますonActivityCreated()。そのような場合、間違ったアクティビティ参照を受け取り、それに依存することはできません。

たとえば、次のパターンは間違っています:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
        Bundle savedInstanceState) 
{
    final View view = inflater.inflate(R.layout..., container, false);

    Button button = getActivity().findViewById(R.id...);
    button.setOnClickListener(...); - another problem: button is null

    return view;
}

正しいパターン#1

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
        Bundle savedInstanceState) 
{
    final View view = inflater.inflate(R.layout..., container, false);

    Button button = view.findViewById(R.id...);
    button.setOnClickListener(...);

    return view;
}

正しいパターン#2

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);

    Button button = getActivity().findViewById(R.id...);
    button.setOnClickListener(...);
}

@MaximKorobov getActivity()内部onActivityCreated()または後続のライフサイクルメソッドで呼び出すことができますが、その前に呼び出すことができますonDestroyView()
Grigori A.

どうもありがとう、これは非常に役に立ちました!
Shotgun Ninja

おかげで:-)これは多くの時間を節約してくれました:)
user1007522 '16

これについてもっと知りたいのですが、散発的なクラッシュが発生していて、これが問題であると思います。ほとんどの場合、コードは正常に機能するため、理解するのは困難ですが
Daniel Wilson

パターン2で解決できた可能性があります。成功を祈っている。それをありがとう。
ジョセフ2015年

53

36

同じエラーが発生しました。私は一日中掘り進んでいましたが、この問題に対して25程度の解決策を試したと思います。午前2時にアプリマニフェストxmlでこの行が欠落していることが判明するまで、何も機能しませんでした。

<meta-data android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />

その行は<application>タグの中にありました。これが誰かの役に立つことを心から願っています。GL。


3
私のヒーロー。あなたのような人はとても素晴らしいです!
capdragon 2014年

5
何が起こっているのか説明してください。このラインの利点は何ですか?
Mansour Fahad 2014年

2
ありがとう、私の日を保存してください。AndroidでGoogleマップを使用する各サンプルの動作は異なりますが、標準があるのでしょうか。
user2812866 14年

22

私も同じ問題を抱えていました。私のための解決策は、FragmentActivity内のsuper.onCreateとsetContentViewの順序でした

次の順序は正常に機能します。

    super.onCreate(savedInstanceState);
    setContentView(R.layout.fc_activity_list_profiles);

3
なぜこれはそれを修正するのですか?
スペンサー

1
JAVAメソッドでsuperは、常にメソッドの先頭で呼び出す必要があります。
ステファンBruckert

11
@StéphaneBruckertでは、常にsuper.method()最初に呼び出す必要があるとは限りません。スーパークラスのメソッドが何をするかによります。その場合、正しく動作FragmentActivityさせるために必要な初期化が行われsetContentViewます。ただし、別のメソッド(たとえばonKeyUp)では、条件付きでアクションを処理super.onKeyUpしたい場合がありますが、その場合はフォールバックしsuper.onKeyUp、関数の最後で呼び出します。
CoatedMoose 2013年

super()(スーパークラスのコンストラクター)が子クラスのコンストラクターで最初に呼び出される関数でなければならないことにも注意する必要がありますが、呼び出しは必ずしも必須ではありません(拡張されるクラスに完全に依存します)。
CoatedMoose 2013年

17

フラグメントはXMLにネストできません

これを難しい方法で学びました。XMLレイアウトベースの<fragment>タグを(潜在的に)動的に読み込まれたフラグメント内にネストするFragmentManagerと、奇妙なエラーが発生し始め、フラグメントxmlを膨らませようとします。

これはサポートされていないことがわかりました-純粋なFragmentManagerアプローチでこれを行うとうまくいきます。

<DrawerLayout>from xml 内にフラグメントをロードしようとしたため、この問題が発生しました。これによりonCreateView()、バックスタックをポップしたときにメソッドでクラッシュが発生しました。


これはまだサポートされていませんか?現在appcompat-v7:23.3.0
thanassis 2016年

はい、フラグメントをxml内にネストしています。調べてみます。
KDeogharkar

しかし、問題の解決策/ハックが存在します。stackoverflow.com/ a / 14695397/860488
Morten Holmgaard

2
確認のため、このセクションの最後にある注意を参照してください:developer.android.com/about/versions/...
フィリップ・

なぜソリューションがとてもシンプルなのかわかりません。私にとっては、ちょうど交換<fragment><frameLayout>働いていました。私はまだそれを理解しています。- stackoverflow.com/a/19167009/5477548
ワットyoad

16

私はあなたが直面しているのと同じ問題を抱えていました。上のヒントのどれも私を助けませんでした。後で、私はしなければならないすべてがからの私のインポートを修正することであることがわかりました

import android.app.Fragment;

に:

import android.support.v4.app.Fragment;

おかげで、この解決策は私にとってもうまくいきました。私はこの問題に2日間苦労していました。最後にあなたの解決策は私のために働きました。hdemirrchianに感謝します。–
Lakshmanan

あなたは素晴らしいです!私の問題は正反対でした-フラグメントウィザードはデフォルトでandroid.support.v4.app.Fragmentをインポートします。そして、私の主な活動はandroid.app.Activityを拡張します。
産業制御フリーク

12

やってみました:

 <fragment
            android:name="de.androidbuch.activiti.task.TaskDetailsFragment"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent" />

1
1つのxmlファイルを示しましたが、2つは/ layout /に、もう1つはlayout-land /にあるはずです
Blundell

12

フラグメントのonCreateViewメソッドで例外が発生していないことを確認してください。このメソッドで例外が発生した場合、logcatは例外の正確な詳細を表示せず、常に次のメッセージを表示します。

Caused by: java.lang.ClassNotFoundException: Didn't find class "android.view.fragment" 
on path: DexPathList[[zip file "/data/app/com.package/base.apk"],
nativeLibraryDirectories=[/data/app/com.package/lib/arm64, /vendor/lib64, /system/lib64]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)

Leiが言っていることを追加するために、oncreateview内にコードを配置して、実際の根本原因を見つけてください。レイありがとう!
Swaroop、2016

6

TaskDetailsFragment延長する場合は、でandroid.app.Fragment変更してください onCreateView()

あなた戻るビューあなたは断片で表示または使用してビューにあなたのレイアウトを変換したいLayoutInflaterをし、それを返します。

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View mainview = inflater.inflate(R.layout.main, null);
    return mainview;
}

これがうまくいくことを願っています。:)


6

クラスパスを確認してください。これは、ビューインフレータがxml class = "de.androidbuch.activiti.task.TaskDetailsFragment"で定義されているクラス定義を見つけられなかった可能性があるため、上記のパスが間違っている可能性があります。


6

さまざまな理由でこのエラーを受け取りました。

再現する手順:

〜>私の問題は、まったく新しい空のアプリケーションを作成したことです。

〜>次に、ファイルからカスタムフラグメントを生成しました〜>新しいファイルメニュー。

〜>レイアウトやボタンなどを追加して、フラグメントをカスタマイズします。

〜>アプリケーションの作成時に自動生成されたactivity_my.xmlで新しいカスタムフラグメントを参照しました。これにより、XMLがオブジェクトを生成できるようになりました。

ヒアは、File〜> New File Menuを介してカスタムフラグメントを生成するときに、インターフェイス関数スタブを自動生成してフラグメントクラスファイルの下部に配置する際の問題です。

つまり、MyActivityクラスはこのインターフェイスを実装する必要があります。そうでない場合、上記のエラーは、xmlからフラグメントを参照する場合にのみ発生します。XML内のフラグメントの参照を完全に削除し、MyActivity.javaクラスファイルのコードを介してフラグメントを作成することにより、Logcatは問題を詳細に説明し、インターフェイスについて不平を言う、より簡潔なエラーを生成します。これは、プロジェクトテンプレートアクティビティ+フラグメントで示されています。ただし、<〜そのプロジェクトテンプレートはインターフェイススタブを生成しません。


5

私にとっては、スタックトレースをスクロールした後、android.permission.ACCESS_NETWORK_STATEの権限がないことがわかりました

この権限を追加した後、修正されました


1
自己ではない:「スタックトレース全体をスクロールします。ありがとう@ギル。– Batandwa 2014
22:41

4

縦向きモードと横向きモードに別々のレイアウトファイルがあり、アイテムをクリックした後に向きを変更するとインフレーションエラーが発生する場合は、レイアウトファイルに不一致がある可能性があります。

エラーが発生した場合、横向きモードまたは縦向きモードのみ、あるいはその両方でアイテムをクリックしたときだけですか?TaskDetailsFragmentアクティビティは、横長モードと縦長モードの間に矛盾がある可能性のあるレイアウトファイルを使用していますか?


回答ありがとうございます。まあ、横向きモードにのみフラグメントがあり、縦向きモードにはありません。横向きモードでのみクリックしてフラグメントを表示できます。そして、再び横長モードに切り替えた後、このエラーが発生します...
tsync

それはほぼ間違いなくそのときの問題です-あなたは横長モードでは見られない縦長モードのビューを持っています。フラグメントをランドスケープに追加すると問題が解決しますか?
ネイサンイチジク

1
両方のファイルに存在しないビューを含めることができます。これが、-landレイアウトと-portレイアウトを個別に持つことの要点です。ただし、IDを確認してください。ポートレートファイルにIDがないため、切り替え時にこのエラーが発生しました。
maxpolun 2012

4

Fragment静的に、つまりxmlで追加している場合は、クラスでの実装OnFragmentInteractionListenerに失敗している可能性がありますActivity。次に、インターフェースの実装により問題が解決されます。Fragment動的に、つまりJavaクラスで追加する場合、これは解決策ではありません。IDE自体では、必要なインターフェースを実装せずに先に進むことができないためです。


3

この場合の問題は、ライフサイクルの後半で呼び出されたメソッドの1つで、ダムnullポインター例外が発生するという単純なインスタンスでした。これにより、「クラスフラグメントの拡張エラー」例外が発生しました。つまり、考えられる原因について、例外スタックトレースのさらに下を確認してください。

nullポインター例外を解決すると、フラグメントが正常に読み込まれました。


3

上記の解決策のどれも私を助けませんでした。ログで、以下のように例外の詳細を見つけることができました。

06-19 16:20:37.885: E/AndroidRuntime(23973): Caused by: java.lang.RuntimeException: API key not found.  Check that /meta-data/ android:name="com.google.android.maps.v2.API_KEY" android:value="your API key"/ is in the application element of AndroidManifest.xml.

私はこれをしました、そして私のコードは働いていました!

<meta-data  android:name="com.google.android.maps.v2.API_KEY" android:value="AIzaSyCl1yGPZ3mpxxxxxxxAz2R-t7zcWVzrHUL9k"/>
</application>

3

何も変更したくない場合は、「fragment」タグを付けます

これを行う、

<fragment
 android:visibility="gone" (Visibility will not work, just helps in removing frag from xml viewer)(If you want the visibility to be gone make it in your fragment root element visibility=gone)
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:name="com.example.YOUR_FRAGMENT" (This is important)
 />

2

同じエラータイプで、logcatにまったく同じエラーメッセージが表示されました。の下にあるJavaビルドパスを変更する必要がありましたProject->Propertiesandroid-support-v4.jarおよびのようなGoogleマップ関連のライブラリを含めましたgoogle-play-services.jar。しかし私は、上でこれらを含め欠けていた'Build class path''Order and Export'オプションメニュー。エラーはここにあるのかもしれません。

ライブラリをビルドクラスパスに含めてみてください。

クラスが構築される順序もエラーの原因となる可能性があるため、構築パスの順序を再配置することもお勧めします。次の順序を使用すると、エラーが消えました'my_project_name/src'->'my_project_name/gen'->'Android Private Libraries'。最後のユニットには、前述のjarファイルが含まれています。


1

xmlファイルでは、タグの代わりにを使用します。インフレーターはandroid.app.Fragmentを作成しようとしますが、API <10では失敗します。そのため、異なるタイプのビューグループを作成する必要があります。



1

あなたがこれを使ったことを確認してください

<meta-data
            android:name="com.google.android.maps.v2.API_KEY"
            android:value="AIzaSyBEwmfL0GaZmdVqdTxxxxxxxx-rVgvY" />

これではない..

<meta-data 
         android:name="com.google.android.gms.version" 
          android:value="AIzaSyBEwmfL0GaZmdVqdTCvxxxxxxx-rVgvY" /> 

1

これと同じエラーが発生しました。私の理由は私のフラグメントクラスの可視性でした。デフォルトに設定されていて、公開する必要があります。


1

フラグメントonCreateonCreateViewメソッドを投稿できますか?フラグメントonCreateメソッドの例外が原因で発生したまったく同じ例外があり、その問題を修正すると、エラーインフレートクラスフラグメントが修正されました


1

Android Studioでこのエラーを受け取りましたが、OnCreateView関数のコードが

mDrawerListView = (ListView) inflater.inflate(
                R.layout.fragment_navigation_drawer, container, false);

あなたのコードは同じことをしていますか?


1

AppCompatActivityを継承したい場合は、次のようにすることができます-アクティビティxmlで、次のようにFrameLayoutを使用します-

<FrameLayout
    android:id="@+id/result_fragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_below="@+id/progress_frame"/>

そして活動中onCreate-

final FragmentManager supportFragmentManager = getSupportFragmentManager();
    FragmentTransaction ft = supportFragmentManager.beginTransaction();
    ft.replace(R.id.result_fragment, fphResultActivityFragment, "result fragment");
    ft.commitAllowingStateLoss();

これは助けてくれてありがとう。私が取り組んだ他のアプリでレイアウトの<fragment>をうまく使用できた理由がわかりませんが、ここでは機能していませんでした!
SingularityFuture

これは機能することに注意してください。ただし、これは通常、静的ではなく動的フラグメントの場合です
Tanner Summers

1

同じエラーが発生しましたが、私の問題は、フラグメントが親アクティビティのxmlレイアウトにIDを持っていないことでした。


1

ある日の闘争の後、私はいくつかのシナリオチェックがあなたが同じことに直面しているかもしれないことを発見しました、

すべてがgoogleコードと同じように機能している場合は、マニフェストファイルを確認してください。私の場合、geoキーとmapキーを追加したため、例外が発生します。

注-マニフェストファイルに2つのキーを追加しないでください。マップキーを削除してください。

meta-data
        android:name="com.google.android.maps.v2.API_KEY"
        android:value="@string/google_maps_key"/>

上記のコードとこのコードを追加します。

 <meta-data
        android:name="com.google.android.geo.API_KEY"
        android:value="@string/auto_location"/>

 <meta-data
        android:name="com.google.android.gms.version"
        android:value="@integer/google_play_services_version"/>

1

同様の問題がありました。AdMobサンプルを実行した後、アプリに広告を挿入しようとしたため、次のエラーが発生しました。

01-02 16:48:51.269    8199-8199/it.dndc.BreathPlot E/AndroidRuntime FATAL EXCEPTION: main
java.lang.IllegalStateException: Could not execute method of the activity
 Caused by: android.view.InflateException: Binary XML file line #57: Error inflating class fragment

解決策は、広告のフラグメントをListActivityに挿入できないことです。代わりに、FragmentActivityとActionBarActivityに問題なく追加できました。

私の提案は、AdMobの例から始めて、既存のアプリに追加します。


1

Navigationコンポーネントで難読化を使用する場合は、androidのフラグメントと引数を除外する必要があります。次の行をproguard-rulesファイルに追加します。

# Exclude the fragments and argType for navigation component.
-keep class * extends androidx.fragment.app.Fragment{}
-keep class com.safetonet.presentation.features.parent.adddevice.model.PresentableAddDeviceData
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.