エラーになります
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
Hdemirchianが言ったように、必ず使うこと:
import Android.support.v4.app.Fragment;
また、フラグメントを使用しているアクティビティが、通常のFragmentActivity
ではなくActivity
に拡張されていることも確認してください。
import Android.support.v4.app.FragmentActivity;
FragmentActivity
クラスを取得します。
getActivity()
が呼び出される前にフラグメントの中でonActivityCreated()
を操作した場合、例外Android.view.InflateException: Binary XML file line: #... Error inflating class fragment
が発生する可能性があります。そのような場合、あなたは間違った活動参照を受け取り、それに頼ることはできません。
例えば、次のパターンは間違っています:
@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(...);
}
Activity
がFragmentActivity
を拡張していることを確認してください。
私は同じエラーがありました。私は一日中掘っていましたが、私はこの問題について25の解決策を試したと思います。午前2時に私がアプリマニフェストxmlでこの行を見逃していたことがわかったまでは、何もうまくいきませんでした。
<meta-data Android:name="com.google.Android.gms.version"
Android:value="@integer/google_play_services_version" />
その行は<application>
タグの内側にありました。これが誰かに役立つことを願っています。 GL。
私は同じ問題を抱えていました。私にとっての解決策は、FragmentActivity内のsuper.onCreateとsetContentViewの順序でした。
次の順序でうまくいきます。
super.onCreate(savedInstanceState);
setContentView(R.layout.fc_activity_list_profiles);
これを難しい方法で学びました - FragmentManager
から(潜在的に)動的にロードされたフラグメントの中にXMLレイアウトベースの<fragment>
タグをネストすると、フラグメントxmlを膨らませようとして奇妙なエラーが発生し始めます。
結局、これはnot supportedです - 純粋にFragmentManager
アプローチでこれを行えばうまくいきます。
Xmlから<DrawerLayout>
内のフラグメントをロードしようとしていたため、この問題が発生していました。バックスタックをポップしたときにonCreateView()
メソッドでクラッシュが発生していました。
私はあなたが直面しているのと同じ問題を抱えていました。上のヒントはどれも私を助けてくれませんでした。その後、私がしなければならなかったのは、以下からインポートを修正することだけであることがわかりました。
import Android.app.Fragment;
に:
import Android.support.v4.app.Fragment;
フラグメントの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)
やってみました:
<fragment
Android:name="de.androidbuch.activiti.task.TaskDetailsFragment"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent" />
TaskDetailsFragment
がAndroid.app.Fragment
を拡張している場合は、onCreateView()
を変更してください。
フラグメントに表示するviewを返すか、LayoutInflaterを使用してレイアウトをビューに変換してから返します。
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View mainview = inflater.inflate(R.layout.main, null);
return mainview;
}
これがうまくいくことを願っています。 :)
クラスパスを確認してください。これはビューインフレータがxml class = "de.androidbuch.activiti.task.TaskDetailsFragment"で定義されているクラス定義を見つけることができなかった可能性があるため、上記のパスが間違っている可能性があります。
さまざまな理由でこのエラーを受け取りました。
再現する手順:
〜>私の問題は、私がまったく新しい空白のアプリケーションを作成したことです。
〜>それから私はファイル〜>新規ファイルメニューからカスタムフラグメントを生成しました。
〜>レイアウトやボタンなどを追加してフラグメントをカスタマイズしました.
〜>アプリケーションを作成するときに私のために生成された自動生成されたactivity_my.xmlで新しいカスタムフラグメントを参照しました。こうすることでXMLは私に代わってオブジェクトを生成することができました。
File〜> New File Menuでカスタムフラグメントを生成するとき、Heresはインターフェース関数スタブを自動的に生成してフラグメントクラスファイルの一番下に配置します。
これはあなたのMyActivityクラスがこのインターフェースを実装しなければならないことを意味します。そうでない場合、上記のエラーはxmlからフラグメントを参照するときにのみ発生します。 XML内のフラグメントの参照を完全に削除し、MyActivity.Javaクラスファイルのコードを使用してフラグメントを作成することで、Logcatは問題を詳細に説明し、インターフェイスについて不平を言うより簡潔なエラーを生成します。これはプロジェクトテンプレートのActivity + Fragmentで示されています。ただし、そのプロジェクトテンプレートではインターフェイススタブは生成されません。
私にとっては、スタックトレースをスクロールした後、私はAndroid.permission.ACCESS_NETWORK_STATEのパーミッションが欠けているのを発見しました。
この権限を追加した後、それは修正されました
ポートレートモードとランドスケープモード用に別々のレイアウトファイルがあり、アイテムをクリックした後に向きを変更するたびにインフレーションエラーが発生する場合は、レイアウトファイル間に食い違いがある可能性があります。
エラーが発生したのは、横モードでアイテムをクリックしたときだけですか。 TaskDetailsFragmentアクティビティは、横長モードと縦長モードの間に矛盾がある可能性があるレイアウトファイルを使用していますか?
この場合の私の問題は、ライフサイクルの後半で呼び出されていた私のメソッドの1つで、ダムNULLポインター例外が発生するという単純な例でした。これは私にとって "Error inflating class fragment"例外を引き起こしていました。手短に言うと、考えられる原因については例外スタックトレースのさらに下の部分をチェックすることを忘れないでください。
Nullポインタ例外を解決すると、フラグメントは正常に読み込まれました。
上記の解決策のどれも私を助けませんでした。ログで、私は以下に述べるように例外の詳細を見つけることができました:
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>
何も変更したくない場合は "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)
/>
Logcatとまったく同じエラーメッセージが表示された同じエラータイプがありました。 Project->Properties
の下にあるJava Build Pathを変更する必要がありました。 Android-support-v4.jar
やgoogle-play-services.jar
のようなGoogleマップ関連のライブラリを含めました。しかし、'Build class path'
オプションメニューの'Order and Export'
にこれらを含めることができませんでした。多分エラーはここにあります。
ライブラリをビルドクラスパスに含めるようにしてください。
クラスの構築順序によってもエラーが発生する可能性があるため、構築パスの順序を並べ替えることをお勧めします。 'my_project_name/src'->'my_project_name/gen'->'Android Private Libraries'
の順に使用するとエラーは消えました。最後のユニットには、前述のjarファイルが含まれています。
Fragment
を静的に、つまりxmlで追加する場合は、OnFragmentInteractionListener
クラスにActivity
を実装しなかった可能性があります。それからインタフェースの実装は問題を解決するでしょう。動的に、つまりJavaクラスでFragment
を追加するのであれば、これは解決策ではありません。 IDE自体では、必要なインタフェースを実装せずに先に進むことはできません。
これと同じエラーがありました。私の理由は私のフラグメントクラスの可視性でした。デフォルトに設定されています。パブリックにする必要があります。
あなたがこれを使ったことを確かめなさい
<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" />
私は同様の問題を抱えていました。 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の例から始めて、それにあなたの既存のアプリを追加する:私は多くの時間を節約できただろう!
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();
あなたのxmlファイルでは単にタグの代わりにを使ってください。インフレータはAndroid.app.Fragmentを作成しようとしますが、そこからAPI <10で失敗します。そのため、異なるタイプのビューグループを作成する必要があります。
ある日の闘争の後、私はシナリオチェックを見つけました。
すべてがGoogleコードと同じように動作しているのであれば、私の場合はマニフェストファイルをチェックしてください。
注 - マニフェストファイルに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"/>
フラグメントのonCreate
およびonCreateView
メソッドを投稿してもらえますか。フラグメントonCreate
メソッドの例外が原因で発生したものとまったく同じ例外が発生しました。この問題を解決すると、クラスフラグメントのエラーを修正しました。
ListFragmentを使用したときにこのエラーが発生しましたが、リストビューIDはlistではなくlistView1でした。
'あなたのコンテンツはid属性が' Android.R.id.list 'のListViewを持っている必要があります
http://developer.Android.com/reference/Android/app/ListFragment.html
Androidスタジオでこのエラーを受信していました。問題は、OnCreateView関数のコードが相対レイアウトであるのに対し、フラグメントが相対レイアウトであることでした。
mDrawerListView = (ListView) inflater.inflate(
R.layout.fragment_navigation_drawer, container, false);
あなたのコードは同じことをしていますか?
私は同じエラーを得ました、しかし私の問題は私のフラグメントが親活動のxmlレイアウトにidを持っていなかったということでした。
私の場合、
...
Android.view.InflateException:
Binary XML file line #24: Error inflating class fragment
...
Caused by: Java.lang.InstantiationException:
class *.HomeFragment has no zero argument constructor
...
空のコンストラクタを追加した後は解決しました。
public HomeFragment() {}
これがこの問題に対する私の解決策です。
Caused by: Android.view.InflateException: Binary XML file line #31: Error inflating class fragment
Caused by: Java.lang.IllegalArgumentException: Binary XML file line #31: Duplicate id 0x7f09006d, tag null, or parent id 0xffffffff with another fragment for com.example.eduardf.audit.DateTime
私の場合は、DialogFragmentをFragmentで再度開くとエラーが発生しました。
<Android.support.constraint.ConstraintLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:tools="http://schemas.Android.com/tools"
Android:layout_width="match_parent"
Android:layout_height="match_parent">
<LinearLayout
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:orientation="vertical">
<TextView
Android:id="@+id/title"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:drawableStart="@drawable/ic_black_edit_24px"
Android:singleLine="true" />
<fragment
Android:id="@+id/fragment_date"
Android:name="com.example.eduardf.audit.DateTime"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
tools:layout="@layout/fragment_date_time" />
</LinearLayout>
</Android.support.constraint.ConstraintLayout>
DailogFragmentは最初の膨張後のフラグメントを保存します。これを防ぐために、私はフラグメントを強制的に削除しました。
@Override
public void onDestroyView () {
if (!(afterRotate || getActivity() == null)) {
final FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
final Fragment fragment = fragmentManager.findFragmentById(R.id.fragment_date);
if (fragment != null)
fragmentManager.beginTransaction().remove(fragment).commit();
}
super.onDestroyView();
}
また、画面を回転させたときなどに、不要なフラグメントの削除に注意する必要がありました。
private boolean afterRotate = false;
...
@Override
public void onSaveInstanceState (Bundle outState) {
super.onSaveInstanceState(outState);
afterRotate = true;
}
あなたのフラグメントがリストフラグメントの場合、そのフラグメントを使用するアクティビティはonFragmentInteraction
インターフェースを実装しなければなりません。
私の簡単な方法
あなたのxmlで<fragment>
を使うなら、あなたはname
属性を提供しなければなりません。
<fragment
Android:name='path.to.your.fragment
/>`
これはあなたのフラグメントを初期化し、あなたはJavaからそれをする必要はありません。
その場合、フラグメントを追加するためにJavaアプローチを使用したい場合は、次のようなレイアウトを使用してください。
<LinearLayout
Android:id="@+id/fragment_container"
/>
そしてあなたのフラグメントのためにこのコンテナを使ってください
transaction.replace(R.id.fragment_container, fragment_obj);
アクティビティがFragmentActivityまたはAppCompatActivityを拡張していることを確認してください。
それぞれのフォルダにgoogle-services.jsonを置いて、明らかに追加するようにしてください。
<meta-dataandroid:name="com.google.Android.geo.API_KEY" Android:value="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" />
マニフェストファイルに「実装 'com.google.Android.gms:play-services-maps:15.0.1'」であなたの評価を確認してください。
それが動作します。