android.view.InflateException : 이진 XML 파일 : 클래스 조각 팽창 오류 in dp

설명 할 수없는 매우 실망스러운 오류가 있습니다. Android AppCompat이전 버전과 호환되도록 하는 Android 애플리케이션을 만들었습니다 . 내 주요 활동 레이아웃 파일은 다음과 같습니다.

<android.support.v4.widget.DrawerLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <!-- As the main content view, the view below consumes the entire
         space available using match_parent in both dimensions. -->
    <FrameLayout
        android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <!-- android:layout_gravity="start" tells DrawerLayout to treat
         this as a sliding drawer on the left side for left-to-right
         languages and on the right side for right-to-left languages.
         If you're not building against API 17 or higher, use
         android:layout_gravity="left" instead. -->

    <!-- The drawer is given a fixed width in dp and extends the full height of
         the container. -->
    <fragment android:id="@+id/navigation_drawer"
        android:layout_width="@dimen/navigation_drawer_width"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:name="com.fragment.NavigationDrawerFragment" />

</android.support.v4.widget.DrawerLayout>

그리고 내 활동의 주요 코드는 다음과 같습니다.

public class MainActivity extends ActionBarActivity {
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
   }
}

여기서 주요 문제는 위의 코드가 거의 모든 장치 (자극 장치 또는 일부 실제 장치)에서 원활하게 실행되는 것입니다. 그러나 삼성 S3에서 실행할 때. 이 오류가 나타납니다.

java.lang.RuntimeException: Unable to start activity ComponentInfo{view.MainActivity}: android.view.InflateException: Binary XML file line #25: Error inflating class fragment
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2081)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2106)
            at android.app.ActivityThread.access$700(ActivityThread.java:134)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1217)
            at android.os.Handler.dispatchMessage(Handler.java:99)
            at android.os.Looper.loop(Looper.java:137)
            at android.app.ActivityThread.main(ActivityThread.java:4856)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:511)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1007)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:774)
            at dalvik.system.NativeStart.main(Native Method)
     Caused by: android.view.InflateException: Binary XML file line #25: Error inflating class fragment
            at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704)
            at android.view.LayoutInflater.rInflate(LayoutInflater.java:746)
            at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
            at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
            at android.view.LayoutInflater.inflate(LayoutInflater.java:352)
            at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:316)
            at android.app.Activity.setContentView(Activity.java:1901)
            at android.support.v7.app.ActionBarActivity.superSetContentView(ActionBarActivity.java:208)
            at android.support.v7.app.ActionBarActivityDelegateICS.setContentView(ActionBarActivityDelegateICS.java:111)
            at android.support.v7.app.ActionBarActivity.setContentView(ActionBarActivity.java:76)

오류 수정 방법을 알려주세요. 🙂



답변

디버깅을 위해 오랜 시간이 지난 후에이 문제를 해결했습니다. (아직도 이유를 설명 할 수는 없지만). 속성 android:name을로 변경했습니다 class. (Android 문서에서는 속성이 동일하지만 작동한다고 말합니다!)

따라서 다음과 같이 변경되어야합니다.

 android:name="com.fragment.NavigationDrawerFragment"

class = "com.fragment.NavigationDrawerFragment"

따라서 새로운 레이아웃은 다음과 같아야합니다.

<!-- As the main content view, the view below consumes the entire
     space available using match_parent in both dimensions. -->
<FrameLayout
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

<!-- android:layout_gravity="start" tells DrawerLayout to treat
     this as a sliding drawer on the left side for left-to-right
     languages and on the right side for right-to-left languages.
     If you're not building against API 17 or higher, use
     android:layout_gravity="left" instead. -->

<!-- The drawer is given a fixed width in dp and extends the full height of
     the container. -->
<fragment android:id="@+id/navigation_drawer"
    android:layout_width="@dimen/navigation_drawer_width"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    class = "com.fragment.NavigationDrawerFragment" />

이 도움을 바랍니다 🙂


답변

제공된 답변을 사용하여 문제를 해결할 수 없습니다. 마침내 나는 이것을 바꿨다.

<fragment
android:id="@+id/fragment_food_image_gallery"
android:name="ir.smartrestaurant.ui.fragment.ImageGalleryFragment"
android:layout_width="match_parent"
android:layout_height="200dp"
android:layout="@layout/fragment_image_gallery"
tools:layout="@layout/fragment_image_gallery" />

이에 :

<FrameLayout
android:id="@+id/fragment_container"
android:layout_width="match_parent"
android:layout_height="200dp" />

,

private void showGallery() {
    ImageGalleryFragment fragment = new ImageGalleryFragment()
    getSupportFragmentManager().beginTransaction()
                .replace(R.id.fragment_container, fragment)
                .commit();
    }

작동합니다.
프래그먼트 내부에서 사용하는 경우 getSupportFragmentManager 대신 getChildFragmentManager 를 사용하십시오 .


답변

TL / DR : 상위 레벨 레이아웃 XML에서 참조되는 단편을 작성하는 중에 예외가 발생했습니다 . 이 예외로 인해 더 높은 수준의 레이아웃 인플레이션이 실패했지만 초기 예외는보고되지 않았습니다 . 더 높은 수준의 인플레이션 실패 만 스택 추적에 나타납니다. 근본 원인을 찾으려면 초기 예외포착하고 기록해야합니다 .


오류의 초기 원인은 매우 다양 할 수 있으므로 여기에 각 개인의 문제를 해결 한 방법에 대한 답변이 너무 많습니다. 일부의 id경우 class, 또는 name속성 과 관련이있었습니다 . 다른 사람들에게는 권한 문제 또는 빌드 설정 때문이었습니다. 저에게는 문제가 해결되지 않았습니다. 대신와 drawable-ldrtl-xhdpi같은 적용 가능한 장소 대신에 존재하는 드로어 블 리소스가있었습니다 drawable.

그러나 이것들은 단지 세부 사항입니다. 큰 문제는 logcat에 나타나는 오류 메시지가 모든 예외를 시작하지 않았다는 것입니다. 높은 수준의 레이아웃 XML이 조각을 참조하면 조각 onCreateView()이 호출됩니다. 프래그먼트에서 예외가 발생 하는 경우onCreateView() (예 : 프래그먼트의 레이아웃 XML을 팽창시키는 동안) 상위 레벨 XML의 인플레이션이 실패합니다. 이 높은 수준의 인플레이션 실패는 오류 로그에서 예외로보고됩니다. 그러나 초기 예외는보고 될 정도로 체인을 잘 여행하지 않는 것 같습니다.

이러한 상황에서 오류 로그에 표시되지 않는 초기 예외를 노출시키는 방법이 문제입니다.

해결책은 매우 간단합니다. 조각의 내용 주위에 try/ catch블록 onCreateView()을 넣고 catch절에서 예외를 기록하십시오.

public View onCreateView(LayoutInflater inflater, ViewGroup contnr, Bundle savedInstSt) {
    try {
        mContentView = inflater.inflate(R.layout.device_detail_frag, null);
        // ... rest of body of onCreateView() ...
    } catch (Exception e) {
        Log.e(TAG, "onCreateView", e);
        throw e;
    }
}

어떤 프래그먼트 클래스 onCreateView()가이 작업을 수행 해야하는지 명확하지 않을 수 있으며 ,이 경우 문제를 일으킨 레이아웃에 사용 된 각 프래그먼트 클래스에이를 수행하십시오. 예를 들어, OP의 경우 예외가 발생한 앱의 코드는

at android.app.Activity.setContentView(Activity.java:1901)

어느

   setContentView(R.layout.activity_main);

따라서 onCreateView()layout에서 참조 된 조각 중 하나 에서 예외를 잡아야 합니다 activity_main.

필자의 경우 근본 원인 예외는

Caused by: android.content.res.Resources$NotFoundException: Resource
   "com.example.myapp:drawable/details_view" (7f02006f)  is not a
   Drawable (color or path): TypedValue{t=0x1/d=0x7f02006f a=-1
   r=0x7f02006f}

이 예외는 오류 로그에 onCreateView()명시 적으로 기록 할 때까지 오류 로그에 표시되지 않았습니다 . 일단 기록되면 문제는 쉽게 진단하고 해결할 수 있습니다 ( 어떤 이유로 폴더 details_view.xml아래에만 존재 함 ldrtl-xhdpi). 열쇠는 문제의 근본 원인 인 예외를 잡아서 노출시키는 것이 었습니다.

모든 프래그먼트의 onCreateView()메소드 에서 상용구로 이것을하는 것은 아프지 않습니다 . 발견되지 않은 예외가 있으면 관계없이 활동이 중단됩니다. 유일한 차이점은에서 예외를 잡아서 기록하면 onCreateView()왜 그런 일이 발생했는지 암울하지 않을 것입니다.

추신 : 나는이 답변이 @DaveHubbard와 관련이 있다는 것을 깨달았지만 근본 원인을 찾기 위해 다른 접근법을 사용합니다 (로깅 대 디버거).


답변

나는 같은 문제가 있었으며 문제는이 스레드의 모든 답변을 시도했지만 아무 소용이 없었습니다. 내 솔루션은 Activity XML에 ID를 추가하지 않았다는 것입니다. 나는 그것이 중요하다고 생각하지 않았지만 그렇게했다.

그래서 활동 XML에서 나는 가지고 있었다 :

<fragment
    android:name="com.covle.hellocarson.SomeFragment"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>

그러나해야했다 :

<fragment
    android:id="@+id/some_fragment"
    android:name="com.covle.hellocarson.SomeFragment"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>

누군가 이것이 이것이 왜인지에 대해 기꺼이 의견을 말하면, 나는 모두 귀입니다. 다른 사람들에게도 이것이 도움이되기를 바랍니다.


답변

더 이상 필요하지 않을 수도 있지만 더 많은 독자가 도움이 될 경우. 나는 정확히 동일 android.view.InflateException:...Error inflating class fragment합니다. 나는 모든 올바른 도서관을 포함시켰다. AndroidManifest.xml파일 에 하나 이상의 사용자 권한을 추가하여 해결<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

Btw 나는 달리고 있었다 Android Studio 0.8.9 on Ubuntu 12.04.


답변

리스너를 구현하지 않았기 때문에 같은 문제가 있습니다. 로 다음 코드를 참조하십시오 /*Add This!*/.

public class SomeActivity extends AppCompatActivity
        implements BlankFragment.OnFragmentInteractionListener /*Add this!*/
{
    @Override                                                  /*Add This!*/
    public void onFragmentInteraction(Uri uri){                /*Add This!*/
    }                                                          /*Add This!*/
}

참고로, 내 조각 클래스는 다음과 같습니다.

public class SomeFragment extends Fragment {

    private OnFragmentInteractionListener mListener;

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        try {
            mListener = (OnFragmentInteractionListener) activity;
        } catch (ClassCastException e) {
            throw new ClassCastException(activity.toString()
                    + " must implement OnFragmentInteractionListener");
        }
    }

    public interface OnFragmentInteractionListener {
        public void onFragmentInteraction(Uri uri);
    }
}

편집하다:

또한의 onCreate기능에 예외가있는 다른 상황에서도 이와 동일한 오류 메시지 가 나타납니다 Fragment. 나는 다음과 같은 것을 가지고있다 :

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

    int ID = getArguments().getInt("val");

    return rootView;
} 

이 조각을 재사용하기 때문에 인수를 설정하는 것을 잊었습니다. 그런 다음의 결과는 getArguments()입니다 null. 분명히, null여기 에서 포인터 예외가 발생합니다. 이와 같은 실수를 계속 주시하십시오.


답변

NavigationDrawerFragment가 android.support.v4.app.Fragment를 확장합니까? 즉, 올바른 패키지를 가져오고 있습니까?

import android.support.v4.app.Fragment;