설명 할 수없는 매우 실망스러운 오류가 있습니다. 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;