android.view.InflateException: ไฟล์ Binary XML: เกิดข้อผิดพลาดในการขยายแฟรกเมนต์คลาส


151

ฉันมีข้อผิดพลาดที่น่าผิดหวังอย่างมากซึ่งฉันไม่สามารถอธิบายได้ ฉันสร้างแอปพลิเคชัน Android ที่ใช้Android AppCompatเพื่อให้เข้ากันได้กับเวอร์ชันที่เก่ากว่า นี่คือไฟล์เค้าโครงกิจกรรมหลักของฉัน:

<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);
   }
}

ปัญหาหลักคือ: โค้ดด้านบนทำงานได้อย่างราบรื่นบนอุปกรณ์เกือบทั้งหมด (อุปกรณ์ที่ได้รับการกระตุ้นหรืออุปกรณ์จริง) แต่เมื่อฉันเรียกใช้บน Samsung 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)

โปรดบอกวิธีการแก้ไขข้อผิดพลาดขอบคุณ :)


1
ในบรรทัดนี้คุณจะได้รับการตรวจสอบข้อยกเว้นว่าชื่อคลาสและชื่อแพคเกจนั้นถูกต้องหรือไม่ .. android: name = "com.hqt.hac.view.fragment.NavigationDrawerFragment"
kalyan pvs

1
ฉันได้ตรวจสอบแล้วและคลาสนี้เป็นจริง ฉันสามารถรวบรวมและเรียกใช้บนอุปกรณ์บางอย่าง แต่ไม่ใช่ซัมซุง s3 ฉันคิดว่ามีปัญหาแปลก ๆ ที่นี่ :(
hqt

คุณพูดถูกถ้ามันทำงานบนอุปกรณ์บางอย่างและไม่ได้อยู่ใน s3 มันเป็นปัญหาที่แปลก .. คำแนะนำของฉันคือการลองใช้ sherlacFragment chek ครั้งเดียว ..
kalyan pvs

ฉันแล้วการแก้ไขปัญหาที่นี่: stackoverflow.com/a/33128448/4366715
daniel kilinskas

1
สำหรับผู้ที่พยายามวินิจฉัยสาเหตุของข้อผิดพลาดนี้: การแก้ไขประวัติโดยสังเขปที่นี่เป็นปลาเฮอริ่งแดง มีข้อยกเว้นก่อนหน้านี้เกิดขึ้นระหว่างการขยายตัวของแฟรกเมนต์ที่ไม่แสดงในการติดตามสแต็ก มันอาจเป็นอะไรก็ได้ ในการแก้ไขปัญหาคุณต้องค้นหาว่าข้อยกเว้นก่อนหน้านี้คืออะไร หากต้องการทำเช่นนั้นให้ดูคำตอบของฉันหรือ @ DaveHubbard
LarsH

คำตอบ:


126

หลังจากแก้จุดบกพร่องเป็นเวลานานฉันได้แก้ไขปัญหานี้แล้ว (แม้ว่าฉันจะยังอธิบายเหตุผลไม่ได้ไม่ได้) ว่าฉันจะเปลี่ยนคุณสมบัติที่จะ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" />

หวังว่าความช่วยเหลือนี้ :)


4
ฉันพบปัญหานี้เมื่อพยายามติดตามการสอน Android อย่างเป็นทางการ การแก้ไขของคุณ (เปลี่ยนandroid:idเป็นclass) ทำงานให้ฉัน ฉันยังมีคำเตือนผ้าสำลีมีการเปลี่ยนแปลงFragmentไปfragmentซึ่งผมไม่ได้ทำ
stevepastelan

9
@DownVoter: ข้อผิดพลาดนี้สับสน และฉันโชคดีที่หาวิธีแก้ไข ฉันขอโทษจริงๆถ้าโพสต์ของฉันไม่สามารถแก้ไขข้อผิดพลาดของคุณเพราะฉันไม่สามารถอธิบายได้ว่าทำไม แต่ฉันคิดว่ามันไม่ควรได้รับการลงคะแนน :)
hqt

2
ฉันสงสัยว่าคุณได้รับข้อผิดพลาดนี้อย่างน่าเชื่อถือโดยไม่เปลี่ยนจากnameเป็นclassฉันมีผู้ใช้จำนวนไม่มากที่รายงานข้อผิดพลาดนี้ แต่ไม่สามารถทำซ้ำได้ด้วยตัวเอง!
Daniel Wilson

8
ไม่ได้ผลสำหรับฉัน ผมเหนื่อยมาก. 2 ชั่วโมงของ dev และไม่สามารถหาสาเหตุที่ทำให้มันใช้งานไม่ได้ (Binary xml file line ... errror inflating fragment class) ความคิดใด ๆ
Cocorico

32

ฉันไม่สามารถแก้ปัญหาของฉันโดยใช้คำตอบที่ให้ไว้ ในที่สุดฉันก็เปลี่ยนสิ่งนี้:

<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();
    }

และมันใช้งานได้
หากคุณใช้มันไว้ภายในส่วนใช้getChildFragmentManagerแทนgetSupportFragmentManager


31

TL / DR : เกิดข้อยกเว้นระหว่างการสร้างส่วนที่อ้างอิงจาก XML เลย์เอาต์ระดับสูงกว่า ยกเว้นเรื่องนี้ทำให้เกิดอัตราเงินเฟ้อรูปแบบระดับสูงที่จะล้มเหลว แต่ยกเว้นเริ่มต้นไม่ได้รายงาน ; เฉพาะความล้มเหลวของระดับเงินเฟ้อที่สูงกว่าจะแสดงขึ้นในสแต็กการติดตาม เพื่อหาสาเหตุที่แท้จริงที่คุณต้องจับและเข้าสู่ระบบยกเว้นเริ่มต้น


สาเหตุเริ่มต้นของข้อผิดพลาดอาจเป็นสิ่งที่หลากหลายซึ่งเป็นสาเหตุที่มีคำตอบที่แตกต่างกันมากมายที่นี่เป็นสิ่งที่แก้ไขปัญหาสำหรับแต่ละคน สำหรับบางคนก็จะต้องทำอย่างไรกับid, classหรือnameคุณลักษณะ สำหรับคนอื่น ๆ มันเป็นเพราะปัญหาสิทธิ์หรือการตั้งค่าการสร้าง สำหรับฉันแล้วคนเหล่านั้นไม่ได้แก้ปัญหา แทนที่จะมีทรัพยากร drawable ที่มีอยู่เฉพาะในแทนในสถานที่เช่นบังคับdrawable-ldrtl-xhdpidrawable

แต่นั่นเป็นเพียงรายละเอียด ปัญหาภาพใหญ่คือข้อความแสดงข้อผิดพลาดที่ปรากฏใน logcat ไม่ได้อธิบายถึงข้อยกเว้นที่เริ่มต้นมันทั้งหมด เมื่อ XML เลย์เอาต์ระดับสูงอ้างถึงแฟรกเมนต์แฟรกเมนต์onCreateView()จะถูกเรียกใช้ เมื่อข้อยกเว้นเกิดขึ้นในแฟรกเมนต์ของชิ้นส่วนonCreateView() (ตัวอย่างเช่นในขณะที่ขยาย XML เลย์เอาต์ของแฟรกเมนต์) จะทำให้อัตราเงินเฟ้อของ XML เลย์เอาต์ระดับสูงล้มเหลว ความล้มเหลวของเงินเฟ้อในระดับที่สูงกว่านี้คือสิ่งที่ได้รับการรายงานเป็นข้อยกเว้นในบันทึกข้อผิดพลาด แต่ข้อยกเว้นเริ่มแรกดูเหมือนจะไม่เดินทางไปตามสายโซ่ได้ดีพอที่จะรายงาน

ในสถานการณ์นั้นคำถามคือจะเปิดเผยข้อยกเว้นเริ่มต้นอย่างไรเมื่อไม่ปรากฏในบันทึกข้อผิดพลาด

การแก้ปัญหาค่อนข้างตรงไปตรงมา: ใส่ a try/ catchblock รอบ ๆ เนื้อหาของแฟรกเมน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()ชิ้นส่วนใด ๆ 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's แต่ใช้วิธีการอื่นในการค้นหาสาเหตุที่แท้จริง (การบันทึกกับการดีบักเกอร์)


2
คุณอาจช่วยฉันแก้จุดบกพร่องหลายชั่วโมงได้ รุ่งโรจน์!
Szymon Sadło

16

ฉันมีปัญหาเดียวกันปัญหาลองคำตอบทั้งหมดในกระทู้นี้เพื่อประโยชน์ วิธีแก้ปัญหาของฉันคือฉันไม่ได้เพิ่ม ID ใน XML กิจกรรม ฉันไม่คิดว่ามันจะสำคัญ แต่ก็ทำ

ดังนั้นใน 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"/>

หากใครบางคนมีความสุขที่จะแสดงความคิดเห็นเกี่ยวกับสาเหตุที่เป็นฉันฉันทั้งหมดหูไปคนอื่นฉันหวังว่าสิ่งนี้จะช่วย


1
ขอบคุณสิ่งนี้ใช้ได้สำหรับฉัน ฉันไม่ใช้ ID มาหลายเดือน แต่หลังจากการเปลี่ยนแปลงเลย์เอาต์ฉันก็เริ่มมีปัญหา Android แปลก
erisco

คุณตอบได้ผลสำหรับฉัน ฉันแค่สงสัยว่าทำไมฉันจึงควรใส่รหัสประจำตัวเมื่อไม่ได้ใช้งานทุกที่ คุณอธิบายให้ฉันได้ไหม
Moshii

12

อาจไม่จำเป็นสำหรับคุณอีกต่อไป แต่หากผู้อ่านรายต่อไปพบว่ามีประโยชน์ 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.


ทำงานให้ฉัน! ขอบคุณมาก!
Dadan

12

ฉันมีปัญหาเดียวกันเพราะฉันไม่ได้ใช้ฟัง /*Add This!*/ดูรหัสต่อไปนี้ด้วย

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

FYI ชั้นแฟรกเมนต์ของฉันมีลักษณะดังนี้:

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ข้อยกเว้นตัวชี้ที่นี่ ฉันจะแนะนำคุณจับตาดูความผิดพลาดเช่นนี้เช่นกัน


1
ขอบคุณ! สิ่งนี้ช่วยได้มาก!
DLee

8

NavigationDrawerFragment ของคุณขยาย android.support.v4.app.Fragment หรือไม่? คุณกำลังนำเข้าแพคเกจที่ถูกต้องหรือไม่

import android.support.v4.app.Fragment;

6

ฉันยังมีปัญหานี้ ฉันแก้ไขมันโดยแทนที่การนำเข้าในMainActivityและNavigationDrawerFragment

จาก

import android.app.Activity;
import android.app.ActionBar;

ถึง

import android.support.v7.app.ActionBar;
import android.support.v7.app.ActionBarActivity;

ฉันอัปเดตMainActivityเพื่อขยายActionBarActivityแทนกิจกรรม

public class MainActivity extends ActionBarActivity implements NavigationDrawerFragment.NavigationDrawerCallbacks

ใช้ActionBar actionBar = getSupportActionBar();เพื่อรับ ActionBar ด้วย

และฉันได้ปรับปรุงฟังก์ชั่นต่อไปนี้ใน NavigationDrawerFragment

private ActionBar getActionBar()
{
    return ((ActionBarActivity)getActivity()).getSupportActionBar();
}

ฉันคิดว่านี่เป็นคำตอบที่ถูก แต่ฉันใช้ AppCompatActivity แทน ActionBarActivity (ไม่คัดค้าน) และยังไม่ลบ android.app.ActionBar นำเข้า (เช่นเดียวกับวิธี onAttach ใช้)
GramThanos

6

ฉันประสบปัญหานี้และแก้ไขได้โดยใช้รหัสต่อไปนี้ ฉันเริ่มต้นธุรกรรมส่วนย่อยโดยใช้ตัวจัดการ childfragment

รูปแบบ:

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

นี่คือวิธีที่ฉันเริ่มธุรกรรมส่วน:

   youTubePlayerFragment = (YouTubePlayerSupportFragment) getChildFragmentManager().findFragmentById(R.id.youtube_fragment);

รหัสต่อไปนี้อธิบายวิธีที่ฉันลบส่วนที่เพิ่มโดยใช้ childfragmentmanger

@Override
    public void onDestroyView() {
        super.onDestroyView();

        youTubePlayerFragment = (YouTubePlayerSupportFragment) getChildFragmentManager().findFragmentById(R.id.youtube_fragment);

        if (youTubePlayerFragment != null)
        {
            getChildFragmentManager().beginTransaction().remove(youTubePlayerFragment).commitAllowingStateLoss();
        }

        youTubePlayer = null;
    }

TY Ali คุณช่วยชีวิตฉันไว้!
vm345

ทำงานได้ดี ขอบคุณ!
Polyariz

4

ฉันมีปัญหาที่คล้ายกันในและนอก ข้อความแสดงข้อผิดพลาดมักจะให้รายละเอียดน้อยมากโดยไม่คำนึงถึงสาเหตุที่แท้จริง แต่ฉันพบวิธีที่จะได้รับข้อมูลที่เป็นประโยชน์มากขึ้น ปรากฎว่าคลาส Android ภายใน 'LayoutInflater.java' (ในแพ็คเกจ android.view) มีวิธี 'พอง' ที่มีข้อยกเว้นอีกครั้ง แต่ไม่รับรายละเอียดดังนั้นคุณจะสูญเสียข้อมูลเกี่ยวกับสาเหตุ

ฉันใช้ AndroidStudio และตั้งจุดพักที่ LayoutInflator line 539 (ในเวอร์ชั่นที่ฉันใช้) ซึ่งเป็นบรรทัดแรกของ catch catch สำหรับข้อยกเว้นทั่วไปในวิธี 'พอง':

        } catch (Exception e) {
            InflateException ex = new InflateException(
                    parser.getPositionDescription()
                            + ": " + e.getMessage());
            ex.initCause(e);
            throw ex;

หากคุณดู 'e' ในตัวดีบักคุณจะเห็นช่อง 'สาเหตุ' มันจะมีประโยชน์มากในการให้คำแนะนำคุณเกี่ยวกับสิ่งที่เกิดขึ้นจริง ตัวอย่างเช่นนี้ฉันพบว่าพาเรนต์ของแฟรกเมนต์ที่รวมไว้ต้องมี ID แม้ว่าจะไม่ได้ใช้ในโค้ดของคุณ หรือว่า TextView มีปัญหากับส่วนข้อมูล


3

ในกรณีที่มีคนต้องการสิ่งนี้ ข้อสันนิษฐาน: โทรศัพท์ของอุปกรณ์เชื่อมต่อกับสาย USB และการอ่าน IDE ของคุณเพื่อเปิดแอป ไปที่พรอมต์คำสั่งเพื่อพิจารณาปัญหา: ป้อน adb logcat

จากนั้นเปิดแอปของคุณจาก IDE คุณจะได้รับการยกเว้น

ในกรณีของฉัน: ฉันกำลังใช้งานแอพ Android เวอร์ชัน 2.3 กับอุปกรณ์มือถือที่ไม่รองรับวิดเจ็ต "Space"


3

ปัญหานี้เกิดขึ้นเมื่อคุณมีคลาสแบบกำหนดเองที่ขยายคลาสอื่น (ในกรณีนี้คือมุมมอง) และไม่อิมพอร์ตคอนสตรัคเตอร์ทั้งหมดที่คลาสต้องการ

ตัวอย่างเช่น: คลาสสาธารณะ CustomTextView ขยาย TextView {}

คลาสนี้จะมีคอนสตรัคเตอร์ 4 ตัวและหากคุณพลาดมันจะผิดพลาด ในความเป็นจริงฉันพลาดคนสุดท้ายที่ใช้โดย Lollipop ซึ่งเสริมคอนสตรัคเตอร์และทำงานได้ดี


2

เราต้องเพิ่มสิ่งต่อไปนี้ใน build.gradle (แอป)

compile 'com.android.support:appcompat-v7:23.1.1'
compile 'com.android.support:design:23.1.1'

เมื่อใดก็ตามที่เราใช้เลย์เอาต์ใหม่หรือคุณสมบัติการออกแบบใหม่ หวังว่านี่จะช่วยคุณได้


2

ตามที่กล่าวไว้ในโพสต์ก่อนหน้า
เปลี่ยนชื่อ

android:name="com.fragment.NavigationDrawerFragment"

ถึง

class = "com.fragment.NavigationDrawerFragment"

ถึงกระนั้นมันก็ไม่ได้ผลสำหรับฉัน ฉันใช้ชื่อชั้นโดยไม่มีส่วน com.fragment และ voila ใช้ได้ ดังนั้นเปลี่ยนเป็น

class = "NavigationDrawerFragment"

2

หลังจากที่ไม่มีคำตอบที่นี่ช่วยฉันฉันเลือกที่จะเรียกใช้แอพในโหมดแก้ไขข้อบกพร่องย้ายข้ามทุกบรรทัดของ onCreateView ในส่วนของฉัน (NavigationDrawerFragment ในกรณีของคุณ) และสังเกตว่าชิ้นส่วนมีปัญหาในการพองเนื่องจาก NullPointerException เช่น

mySeekBar = (SeekBar) getActivity().findViewById(R.id.mySeekBar);
mySeekBar.setOnSeekBarChangeListener(this);

ที่นี่ mySeekBar ถูกตั้งค่าเป็นโมฆะ (เพราะฉันพลาดการเพิ่มการควบคุมในเลย์เอาต์ที่เหมาะสม) และบรรทัดถัดไปเข้าสู่ NPE ซึ่งออกมาเป็น InflateException นอกจากนี้ตามที่แนะนำไว้ข้างต้นให้เปลี่ยนชื่อ android: name to class

ปัญหานี้อาจเกิดขึ้นได้จากหลายสาเหตุที่กล่าวถึงข้างต้น ฉันจะแนะนำโฟลว์การดีบักแบบทีละบรรทัดเพื่อทราบว่ามีอะไรผิดปกติ


และข้อผิดพลาดนี้เกิดขึ้นในonCreateView()วิธีการของส่วน?
LarsH

1

สำหรับบางท่านที่ยังไม่พบวิธีแก้ปัญหานี้ในกรณีของฉันมันเกิดขึ้นเพราะฉันมีปัญหา OOM (หน่วยความจำไม่เพียงพอ) สิ่งนี้อาจเกิดขึ้นได้เมื่อคุณมีตัวอย่างเช่นหน่วยความจำรั่วในแอปของคุณเมื่อใช้งานเป็นเวลานาน ในการติดตามสแต็คของฉันนี่คือเหตุผลหลัก


1

ฉันไม่รู้ว่าจะช่วยได้หรือไม่

ฉันมีปัญหากับ TextView ที่ฉันมีในเลย์เอาต์ฉันพยายามขยาย ( android.view.InflateException: Binary XML line file # 45: เกิดข้อผิดพลาดในการขยายคลาส TextView )

ฉันได้ตั้งค่าคุณสมบัติ XML ต่อไปนี้android: textSize = "? android: attr / textAppearanceLarge"ซึ่งไม่ได้อนุญาตให้โครงร่างนั้นพองเกินจริง

ไม่รู้ว่าทำไม ( ฉันยังใหม่กับ Android - น้อยกว่าหนึ่งปีของประสบการณ์ ) อาจมีบางอย่างเกี่ยวกับคุณลักษณะของระบบการโทร idk ทั้งหมดที่ฉันรู้ก็คือทันทีที่ฉันใช้ old @ธรรมดาdimen / md_text_16sp ( ซึ่งเป็นของฉันเอง ) แก้ไขปัญหาได้แล้ว :)

หวังว่านี่จะช่วย ...


ฉันไม่มีแฟรกเมนต์หรือแอตทริบิวต์ Android textSize ข้อผิดพลาดของฉันเกี่ยวข้องกับ TextInputLayout ด้วยสไตล์ที่กำหนดเองซึ่งสืบทอด TextAppearance.AppCompat แทนที่จะเป็นWidget.Design.TextInputLayout: stackoverflow.com/questions/19874882/…
Junior Mayhé

1

ฉันมีสิ่งนี้ในอุปกรณ์ 4.4.2 แต่ 5+ ใช้ได้ สาเหตุ: ภายในการกำหนดค่าเริ่มต้นของมุมมองที่กำหนดเองฉันกำลังสร้างTextView(Context context, AttributeSet attrs, @AttrRes int defStyleAttr, @StyleRes int defStyleRes)ซึ่งก็คือ API 21+

Android Studio 2.1 ไม่บ่นเกี่ยวกับเรื่องนี้แม้ว่าจะมีการTargetApi(21)เพิ่มความคิดเห็น เห็นได้ชัดว่า Android Studio 2.2 จะแก้ไขสิ่งนี้และแสดงว่าเป็นข้อผิดพลาดอย่างถูกต้อง

หวังว่านี่จะช่วยใครซักคน


1

ฉันมาสายไปงานเลี้ยงเล็กน้อย แต่คำตอบที่ไม่ได้ช่วยฉันในกรณีของฉัน ผมใช้แผนที่ Google เป็นSupportMapFragmentและPlaceAutocompleteFragmentทั้งในส่วนของฉัน เป็นคำตอบทั้งหมดชี้ไปที่ความจริงที่ว่าปัญหาเกิดขึ้นกับ SupportMapFragment เป็นแผนที่ที่จะสร้างใหม่และวาดใหม่

แต่ฉันก็มีปัญหากับ PlaceAutocompleteFragment ดังนั้นนี่คือวิธีแก้ปัญหาการทำงานสำหรับผู้ที่ประสบปัญหานี้เนื่องจากSupportMapFragmentและSupportMapFragment

 mapFragment = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.mapFragment);
    FragmentManager fm = getChildFragmentManager();

    if (mapFragment == null) {
        mapFragment = SupportMapFragment.newInstance();
        fm.beginTransaction().replace(R.id.mapFragment, mapFragment).commit();
        fm.executePendingTransactions();
    }

    mapFragment.getMapAsync(this);

    //Global PlaceAutocompleteFragment autocompleteFragment;


    if (autocompleteFragment == null) {
        autocompleteFragment = (PlaceAutocompleteFragment) getActivity().getFragmentManager().findFragmentById(R.id.place_autoCompleteFragment);

    }

และใน onDestroyView ให้ล้าง SupportMapFragment และ SupportMapFragment

@Override
public void onDestroyView() {
    super.onDestroyView();


    if (getActivity() != null) {
        Log.e("res","place dlted");
        android.app.FragmentManager fragmentManager = getActivity().getFragmentManager();
        android.app.FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        fragmentTransaction.remove(autocompleteFragment);
        fragmentTransaction.commit();

        autocompleteFragment = null;
    }


}

1

หลังจากพยายามมานานนี่เป็นวิธีที่ฉันจะแก้ไขปัญหาหลังจากที่ไม่มีคำตอบใด ๆ ข้างต้นได้

  1. ขยายAppCompatActivityสำหรับกิจกรรมแทนMainActivity
  2. เพิ่มandroid:theme="@style/Theme.AppCompat.Light"ของคุณ<Activity..../>ในAndroidManifest.xml
  3. ในNavigationDrawerFragmentคลาสของคุณให้เปลี่ยนActionBarอินสแตนซ์ของคุณเป็น

    ActionBar mActionBar=((AppCompatActivity)getActivity()).getSupportActionBar();

แก้ไข

มันควรจะเป็นความสอดคล้องระหว่างกิจกรรมและเค้าโครง หากเค้าโครงมีหนึ่งในAppCompat ธีมเหมือนเช่นTheme.AppCompat.Lightของคุณกิจกรรมextends AppCompatActivityควร

ผมอยากที่จะมีเบอร์เกอร์ไอคอนและลิ้นชักการนำทางที่มีลักษณะเช่นเดียวกับAndroid App Gmailแต่ผมจบลงด้วยน่าเกลียดลิ้นชักการนำทาง ทั้งหมดว่าเป็นเพราะการเรียนการสอนทั้งหมดของฉันแทนextends ActivityAppCompatActivity

ฉันกลับมาที่โครงการทั้งหมดอีกครั้งเพื่อขยายAppCompatActivityจากนั้นคลิกขวาที่Layout Folderเลือกnew-> Activityจากนั้นNavigation Drawer Activityและบูมทุกอย่างทำเพื่อฉัน!


1
android.view.InflateException: Binary XML file line #16: Error inflating class com.google.android.material.bottomappbar.BottomAppBar

มุมมองสามารถเป็นอะไรก็ได้ที่ล้มเหลวในการขยายตัวข้อผิดพลาดชนิดนี้เกิดขึ้นเมื่อมีการปะทะกันในการแก้ไขชื่อคลาสหรือแอตทริบิวต์ชื่อของมุมมองที่อ้างถึงในไฟล์ XML

เมื่อฉันได้รับข้อผิดพลาดเดียวกันฉันได้ทุกอย่างสะอาดและปลอดภัยในไฟล์ UI-XML มุมมองที่ฉันใช้

   <com.google.android.material.bottomappbar.BottomAppBar
    android:id="@+id/bottomAppBar"
    style="@style/Widget.MaterialComponents.BottomAppBar.Colored"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="bottom"
    app:hideOnScroll="true"
    app:menu="@menu/bottom_app_bar"
    app:navigationIcon="@drawable/ic__menu_24"/>

ฉันใช้คุณสมบัติสไตล์ซึ่งอ้างถึงคุณสมบัติส่วนประกอบของวัสดุ แต่สไตล์ของฉัน. xml มี ...

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
....
</style>

ที่การแก้ปัญหาในชั้นเรียนกำลังเผชิญกับความขัดแย้ง แอตทริบิวต์มุมมองของฉันอ้างถึงคุณสมบัติที่ไม่ได้กำหนดในธีมแอพของฉัน ชุดรูปแบบหลักที่ถูกต้องจากส่วนประกอบวัสดุช่วยฉัน ดังนั้นฉันจึงเปลี่ยนแอตทริบิวต์หลักเป็น ...

<style name="AppTheme" parent="Theme.MaterialComponents.Light.NoActionBar">
...
</style>

ซึ่งแก้ไขปัญหาได้


0

ฉันคิดว่าปัญหาพื้นฐานคือ "android: targetSdkVersion" ซึ่งกำหนดไว้ใน AndroidManifest.xml ในกรณีของฉันค่าเริ่มต้นที่ฉันได้กำหนดไว้:

android:targetSdkVersion=16

ฉันเปลี่ยนเป็น:

android:targetSdkVersion=22

ซึ่งแก้ไขข้อผิดพลาดทั้งหมดของฉัน ดังนั้นการตั้งค่า "targetSdkVersion" ที่ถูกต้องก็มีความสำคัญก่อนที่จะสร้างแอป Android


0

ในกรณีที่มีคนอื่นมาที่นี่และคำตอบไม่ช่วยแก้ปัญหาให้ลองอีกหนึ่งสิ่ง

ดังที่คนอื่น ๆ ได้กล่าวถึงสิ่งนี้มักเกิดจากปัญหาที่ซ้อนอยู่ในตัว XML ซึ่งตรงข้ามกับสิ่งที่คุณทำผิดใน Java ในกรณีของฉันมันเป็นความผิดพลาดที่ง่ายมาก (และโง่) ที่จะแก้ไข

ฉันมีรหัสเช่นนี้:

<view
    android:layout_width="fill_parent"
    android:layout_height="1dip"
    android:id="@+id/view44"
    android:background="@color/gray"
    />

เมื่อทั้งหมดที่ฉันต้องทำคือใช้ประโยชน์ v ใน 'มุมมอง' เพื่อให้ระบบทำการพิจารณาใหม่ ตรวจสอบว่ามุมมองที่กำหนดเองของคุณ (หรือแฟรกเมนต์, มุมมองรีไซเคิล ฯลฯ ) ทั้งหมดมีการประกาศตัวพิมพ์ใหญ่ที่เหมาะสมเพื่อให้ XML อัตโนมัติสมบูรณ์จะตรงกับมุมมองที่เหมาะสม


0

ฉันมีข้อผิดพลาดนี้เช่นกันและหลังจากการดีบักปัญหานานมากดูเหมือนว่า MainClass ของฉันจะขยายกิจกรรมแทน FrameActivity ในกรณีของฉัน xml ไม่ใช่ปัญหา หวังว่าจะช่วยคุณ


0

ในกรณีของฉัน

รูปแบบที่ฉันพยายามขยายมี

<include 
 layout  = "...."
/>

แท็กการลบจะแก้ไข

ฉันพยายามขยายเลย์เอาต์ก่อนหน้านี้ที่ออกแบบมาสำหรับ Actvity ลงในอะแดปเตอร์มุมมองเพจเจอร์


0

ข้อผิดพลาดของฉันเกิดจากปัญหาอื่น

ฉันกำลังส่งบันเดิลจากกิจกรรมไปยังส่วนของมัน เมื่อฉันแสดงความคิดเห็นรหัสที่ได้รับมัดในชิ้นส่วนข้อผิดพลาดก็หายไป ตามที่ปรากฎข้อผิดพลาดของฉันเกิดจาก "getArguments ();" ด้านล่าง ส่วนที่ได้รับคืนเป็นโมฆะ

Bundle args = getArguments();

เมื่อตรวจสอบรหัสการส่งกิจกรรมฉันรู้ว่าฉันมีข้อผิดพลาดด้านล่าง;

Bundle bundle =new Bundle();
 bundle.putInt("recipeID", recipe_position);
 Fragment mainFragment = new MainActivityFragment();
 mainFragment.setArguments(bundle);
 FragmentManager fragmentManager = getSupportFragmentManager();
 --> fragmentManager.beginTransaction()
                        .replace(R.id.container, new  MainActivityFragment(),
                                DetailRecipeActivityFragment.TAG)
                        .commit();

ฉันกำลังสร้างแฟรกเมนต์ใหม่ที่สอดคล้องกับลูกศร ในขณะที่ฉันควรใช้ชิ้นส่วนที่มีการอินสแตนซ์ล่วงหน้าซึ่งมีชุดของฉันอยู่แล้ว ดังนั้นมันควรจะเป็น:

Bundle bundle =new Bundle();
 bundle.putInt("recipeID", recipe_position);
 Fragment mainFragment = new MainActivityFragment();
 mainFragment.setArguments(bundle);
 Fragment mainFragment = new MainActivityFragment();
 FragmentManager fragmentManager = getSupportFragmentManager();
 -->fragmentManager.beginTransaction()
                        .replace(R.id.container, mainFragment,
                                DetailRecipeActivityFragment.TAG)
                        .commit();

ฉันไม่รู้ว่าทำไมมันจึงพ่นข้อผิดพลาดนี้แทนที่จะเป็น NPE แต่สิ่งนี้แก้ไขข้อผิดพลาดของฉันได้ในกรณีที่บางคนกำลังมีสถานการณ์เดียวกัน


0

ฉันมีปัญหาเดียวกันในกรณีของฉันชื่อแพคเกจไม่ถูกต้องการแก้ไขมันแก้ไขปัญหาได้



0

ฉันมีข้อผิดพลาดนี้เมื่อฉันมี RecyclerView ที่รูทของ Fragment.xml ของฉัน

แต่เมื่อฉันห่อมันด้วย ViewGroup แอปทำงานได้ดี


0

เพิ่มฟิลด์ชื่อนี้ในการนำทาง

หุ่นยนต์: name = "androidx.navigation.fragment.NavHostFragment"

   <fragment
             android:id="@+id/container"
             android:layout_width="match_parent"
             android:layout_height="0dp"
             android:name="androidx.navigation.fragment.NavHostFragment"
             app:navGraph="@navigation/navigation"
             app:layout_constraintBottom_toTopOf="@+id/bottomNavigationView"
             app:layout_constraintTop_toTopOf="parent">
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.