android.view.InflateException: बाइनरी एक्सएमएल फाइल: क्लास के टुकड़े को फुलाए जाने में त्रुटि


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

यहां मुख्य समस्या यह है: उपरोक्त कोड लगभग उपकरणों (उत्तेजित डिवाइस, या कुछ वास्तविक उपकरणों) पर आसानी से चलते हैं। लेकिन जब मैं इसे सैमसंग एस 3 पर चलाता हूं। यह इस त्रुटि को नोटिस करता है:

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
इस पंक्ति में आपको अपवाद की जाँच हो रही है कि क्या क्लास का नाम और पैकेज का नाम सही है या नहीं..और: नाम = "com.hqt.hac.view.fragment.NavigationDrawerFragment"
कल्याण pv

1
मैंने जाँच की है और यह वर्ग सत्य है। मैं कुछ उपकरणों को संकलित और चला सकता हूं लेकिन सैमसंग s3 नहीं। मुझे लगता है कि यहाँ कुछ अजीब समस्याएं हैं :(
hqt

आप सही हैं अगर यह किसी डिवाइस पर निष्पादित हो रहा है और s3 पर नहीं है तो यह एक अजीब समस्या है। मेरी सलाह है कि एक बार एक बार शर्लकफ्रेग्मेंट चेक का उपयोग करने का प्रयास करें ..
kalyan pvs

मैं पहले से ही इस मुद्दे को यहाँ हल: stackoverflow.com/a/33128448/4366715
डैनियल किलिन्किंस

1
उन लोगों के लिए जो इस त्रुटि के कारण का निदान करने की कोशिश कर रहे हैं: यहां उपाख्यानात्मक सुधार एक लाल हेरिंग हैं। खंड के मुद्रास्फीति के दौरान होने वाला एक पूर्व अपवाद है जो स्टैक ट्रेस में दिखाई नहीं दे रहा है । यह कुछ भी हो सकता है। समस्या को ठीक करने के लिए, आपको यह पता लगाना होगा कि पूर्व अपवाद क्या है। ऐसा करने के लिए, मेरा उत्तर या @ डेवहबर्ड देखें।
लार्स

जवाबों:


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:idकरने के लिए class) मेरे लिए काम किया। मुझे बदलने के Fragmentलिए एक लिंट चेतावनी भी मिली fragment, जो मैंने की।
स्टीवेपस्टेलन

9
@DownVoter: यह त्रुटि भ्रामक है। और मैं सौभाग्य से तय करने का तरीका ढूंढता हूं। अगर मेरी पोस्ट आपकी त्रुटि को ठीक नहीं कर सकती है तो मुझे बहुत खेद है क्योंकि मैं यह भी नहीं बता सकता कि क्यों। लेकिन मुझे लगता है कि इसे डाउन वोट नहीं मिलना चाहिए। :)
hqt

2
मुझे आश्चर्य है कि अगर तुम मज़बूती से इस क्रैश हो गया बिना से बदल रहा है nameकरने के लिए class, मैं कुछ उपयोगकर्ताओं को इस दुर्घटना की रिपोर्ट है, लेकिन यह अपने आप repro नहीं कर सकता था!
डैनियल विल्सन

8
मेरे लिए काम नहीं करता है। मैं बहुत थक गया हूँ। देव के 2h और पता नहीं क्यों यह काम नहीं करता है (बाइनरी एक्सएमएल फ़ाइल लाइन ... गलत श्रेणी में गड़बड़ी)। कोई उपाय ?
कोकरिको

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

और यह काम करता है।
यदि आप इसे खंड के अंदर उपयोग कर रहे हैं, तो getSupportFragmentManager के बजाय getChildFragmentManager का उपयोग करें ।


31

TL / DR : उच्च-स्तरीय लेआउट XML से संदर्भित खंड के निर्माण के दौरान एक अपवाद उत्पन्न हुआ । इस अपवाद के कारण उच्च-स्तरीय लेआउट मुद्रास्फीति विफल हो गई, लेकिन प्रारंभिक अपवाद रिपोर्ट नहीं किया गया ; केवल उच्च-स्तरीय मुद्रास्फीति विफलता स्टैक ट्रेस में दिखाई देती है। मूल कारण खोजने के लिए, आपको प्रारंभिक अपवाद को पकड़ना और लॉग इन करना होगा


त्रुटि का प्रारंभिक कारण विभिन्न प्रकार की चीजें हो सकती हैं, यही वजह है कि यहां इतने सारे अलग-अलग उत्तर हैं कि प्रत्येक व्यक्ति के लिए समस्या क्या है। कुछ के लिए, इसके साथ करना था id, classया nameगुण। दूसरों के लिए यह अनुमतियों के मुद्दे या बिल्ड सेटिंग के कारण था। मेरे लिए, उन लोगों ने समस्या को ठीक नहीं किया; इसके बजाय drawable-ldrtl-xhdpiएक लागू करने योग्य संसाधन था जो केवल लागू स्थान में था जैसे कि एक लागू जगह में drawable

लेकिन वे सिर्फ विवरण हैं। बड़ी तस्वीर समस्या यह है कि त्रुटि संदेश जो लॉगकैट में दिखाई देता है वह उस अपवाद का वर्णन नहीं करता है जिसने इसे शुरू किया था। जब एक उच्च-स्तरीय लेआउट 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()को ऐसा करना है, किस स्थिति में, उस प्रत्येक खंड वर्ग के लिए करें जो उस लेआउट में उपयोग किया जाता है जो समस्या का कारण बना। उदाहरण के लिए, ओपी के मामले में, ऐप का कोड जहां अपवाद हुआ था

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(), तो आप अंधेरे में नहीं होंगे कि ऐसा क्यों हुआ।

PS मुझे सिर्फ इस बात का एहसास है कि यह उत्तर @ DaveHubbard से संबंधित है, लेकिन मूल कारण (लॉगिंग बनाम डिबगर) को खोजने के लिए एक अलग दृष्टिकोण का उपयोग करता है।


2
आपने शायद मुझे घंटों डिबगिंग करने से बचाया। कुडोस!
सिजमन सैडलो

16

मेरे पास एक ही समस्या थी, मुद्दा, इस थ्रेड में सभी उत्तरों का कोई फायदा नहीं हुआ। मेरा समाधान था, मैंने गतिविधि 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
धन्यवाद, यह मेरे लिए काम किया। मैं महीनों से एक आईडी को छोड़ रहा था, लेकिन कुछ लेआउट में बदलाव के बाद अचानक मुझे यह दुर्घटना होने लगी। Android अजीब है।
एरिस्को

आप जवाब दीजिए मेरे लिए काम करता है। मुझे आश्चर्य है कि जब मैं कहीं भी इसका उपयोग नहीं कर रहा हूं तो मुझे आईडी विशेषता क्यों डालनी चाहिए। क्या आप मुझे समझा सकते हैं?
मोशी

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.


मेरे लिए काम किया! आपका बहुत बहुत धन्यवाद!
ददन

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.ragment का विस्तार कर रहा है? दूसरे शब्दों में, क्या आप सही पैकेज का आयात कर रहे हैं?

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

मैंने इस समस्या का सामना किया और निम्नलिखित कोड का उपयोग करके इसे हल किया। मैं चाइल्डफ्रैगमेंट प्रबंधक का उपयोग करके खंड लेनदेन शुरू कर रहा था।

लेआउट:

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

निम्नलिखित कोड बताते हैं कि मैंने चाइल्डफ्रैगमेंटमैन्जर का उपयोग करके किस तरह के टुकड़े को हटा दिया।

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

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

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

        youTubePlayer = null;
    }

टीआई अली। आपने मेरा दिन बचा लिया!
vm345

ठीक काम करता है। धन्यवाद!
पॉलीरिज़

4

मुझे इसी तरह की समस्या थी। त्रुटि संदेश अक्सर वास्तविक कारण की परवाह किए बिना बहुत कम विवरण प्रदान करता है। लेकिन मुझे अधिक उपयोगी जानकारी प्राप्त करने का एक तरीका मिल गया। यह पता चला है कि आंतरिक एंड्रॉइड क्लास 'लेआउटइन्फ्लैटर.जवा' (android.view पैकेज में) में एक 'इनफ्लो' पद्धति है जो एक अपवाद को फिर से फेंकती है, लेकिन विवरण नहीं उठाती है, इसलिए आप कारण पर जानकारी खो देते हैं।

मैंने AndroidStudio का उपयोग किया, और LayoutInflator लाइन 539 (संस्करण में मैं काम कर रहा हूं) पर एक ब्रेकपॉइंट सेट किया, जो कि 'इनफ्लो' विधि में एक सामान्य अपवाद के लिए कैच ब्लॉक की पहली पंक्ति है:

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

यदि आप डीबगर में 'ई' को देखते हैं, तो आपको 'कारण' फ़ील्ड दिखाई देगा। यह वास्तव में क्या हुआ, इसके बारे में आपको संकेत देने में बहुत मददगार हो सकता है। यह है कि, उदाहरण के लिए, मैंने पाया कि एक सम्मिलित टुकड़े के माता-पिता के पास एक आईडी होना चाहिए, भले ही आपके कोड में इसका उपयोग न किया गया हो। या कि एक TextView में एक आयाम के साथ एक मुद्दा था।


3

बस अगर किसी को इसकी जरूरत है। मान्यताओं: डिवाइस फोन एप्लिकेशन को लॉन्च करने के लिए यूएसबी केबल और आपके आईडीई रीडिंग तक पहुंच गया। समस्या को निर्धारित करने के लिए कमांड प्रॉम्प्ट पर जाएं: adb logcat दर्ज करें

फिर आईडीई से अपना ऐप लॉन्च करें। आप एक अपवाद होंगे।

मेरे मामले में: मैं संस्करण 2.3 के एक एंड्रॉइड ऐप को एक मोबाइल डिवाइस पर तैनात कर रहा था, जो विजेट "स्पेस" का समर्थन नहीं करता था


3

यह समस्या तब होती है जब आपके पास एक कस्टम वर्ग होता है जो एक अलग वर्ग (इस मामले में एक दृश्य) का विस्तार करता है और वर्ग द्वारा आवश्यक सभी निर्माणों को आयात नहीं करता है।

उदाहरण के लिए: सार्वजनिक वर्ग CustomTextView TextView {} का विस्तार करता है

इस वर्ग में 4 कंस्ट्रक्टर होंगे और यदि आप किसी एक को याद करते हैं तो यह दुर्घटनाग्रस्त हो जाएगा। तथ्य की बात के लिए मैंने आखिरी को याद किया जो लॉलीपॉप द्वारा उपयोग किया गया था, उस निर्माणकर्ता को जोड़ा और ठीक काम किया।


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 की हर पंक्ति में चल रहा था (आपके मामले में नेविगेशनड्रावरफ्रेगमेंट)। और देखा कि NullPointerException की वजह से टुकड़े को फुलाए जाने में कठिनाई हो रही थी। उदाहरण के लिए

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

यहाँ mySeekBar को अशक्त करने के लिए सेट किया गया था (क्योंकि मैं उपयुक्त लेआउट में नियंत्रण जोड़ने से चूक गया था) और अगली पंक्ति एनपीई में मिल गई जो कि इन्फ्लेटेक्स्टैप्शन के रूप में सामने आई। इसके अलावा, जैसा कि ऊपर बताया गया है, Android का नाम बदलें: कक्षा में नाम।

यह समस्या ऊपर उल्लिखित विभिन्न कारणों से उत्पन्न हो सकती है। मैं लाइन-दर-लाइन डिबग प्रवाह की सिफारिश करूंगा ताकि पता चल सके कि क्या गलत है।


और क्या यह त्रुटि एक विखंडन onCreateView()विधि में हो रही थी?
लार्स

1

आप में से कुछ के लिए जो अभी भी इसके लिए एक समाधान नहीं मिला है, मेरे मामले में यह हो रहा था क्योंकि मेरे पास एक OOM (आउट ऑफ मेमोरी) मुद्दा था। यह तब हो सकता है जब आपके पास उदाहरण के लिए आपके ऐप में एक मेमोरी रिसाव होता है जब इसे लंबे समय तक उपयोग किया जाता है। मेरे स्टैक ट्रेस में, यह मुख्य कारण था।


1

मुझे नहीं पता कि यह मदद करेगा।

मुझे एक समस्या यह थी कि मैं जिस लेआउट को देखने की कोशिश कर रहा था, उसमें मुझे एक समस्या दिखाई दे रही थी ( android.view.InflateException: बाइनरी एक्सएमएल फ़ाइल लाइन # 45: कक्षा में टेक्स्ट व्यू को त्रुटि देने में त्रुटि )।

मैंने निम्न XML विशेषता android: textSize = " सेट किया था ? Android: attr / textAppearanceLarge" जो लेआउट को फुलाए जाने की अनुमति नहीं दे रहा था।

पता नहीं क्यों, ( मैं अभी भी एंड्रॉइड के लिए थोड़ा नया हूं - एक वर्ष से कम का अनुभव ), कॉलिंग सिस्टम विशेषताओं के साथ कुछ करने के लिए कुछ हो सकता है, आईडीके, मुझे पता है जैसे ही मैं सादे पुराने का उपयोग करता हूं @ dimen / md_text_16sp ( जो कि मेरा एक रिवाज है ), समस्या हल हुई :)

उम्मीद है की यह मदद करेगा...


मेरे पास कोई अंश नहीं था और न ही Android विशेषता का पाठ। मेरी त्रुटि एक TextInputLayout से संबंधित थी, जिसकी बजाय TextAppearance.AppCompat को प्राप्त करने वाली एक कस्टम शैली है Widget.Design.TextInputLayout: stackoverflow.com/questions/19874882/…
जूनियर मेहे

1

मेरे पास 4.4.2 डिवाइस पर यह था, लेकिन 5+ ठीक था। कारण: एक कस्टम दृश्य के आरंभ के अंदर, मैं एक बना रहा था TextView(Context context, AttributeSet attrs, @AttrRes int defStyleAttr, @StyleRes int defStyleRes), जो कि एपीआई 21+ है।

Android Studio 2.1 ने एनोटेट होने के बावजूद इसके बारे में कोई शिकायत नहीं की है TargetApi(21)। जाहिर है, एंड्रॉइड स्टूडियो 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अपनी Mainगतिविधि के लिए बढ़ाएँ Activity
  2. android:theme="@style/Theme.AppCompat.Light"अपने <Activity..../>में जोड़ेंAndroidManifest.xml
  3. अपनी NavigationDrawerFragmentकक्षा में, अपने ActionBarउदाहरणों को बदलें

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

संपादित करें

यह गतिविधि और लेआउट के बीच एक सामंजस्य होना चाहिए । यदि लेआउट में AppCompat थीम जैसे कि एक है Theme.AppCompat.Light, तो आपकी गतिविधि होनी चाहिए extends AppCompatActivity

मैं बर्गर आइकन और एक नेविगेशन ड्रॉअर लेना चाहता था जो एंड्रॉइड जीमेल ऐप जैसा दिखता है , लेकिन मैं एक बदसूरत नेविगेशन ड्रॉअर के साथ समाप्त हुआ । वह सब क्योंकि मेरी सभी कक्षाओं के extends Activityबजाय AppCompatActivity

मैंने विस्तार करने के लिए पूरी परियोजना को फिर से दोहराया 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

दृश्य कुछ भी हो सकता है जो फुलाए जाने में विफल हो रहा है, इस तरह की त्रुटि तब आती है जब एक्सएमएल फ़ाइल में संदर्भित एक दृश्य के वर्ग नामों या नाम विशेषता को हल करने में एक संघर्ष होता है।

जब मुझे वही त्रुटि मिलती है तो मुझे बस यूआई-एक्सएमएल फ़ाइल में सब कुछ साफ और सुरक्षित मिलता है, जो दृश्य मैं उपयोग कर रहा था,

   <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" सेट करना भी महत्वपूर्ण है।


0

यदि कोई व्यक्ति यहां आता है और उत्तर समस्या को हल करने में मदद नहीं करता है, तो एक और बात करने की कोशिश करें।

जैसा कि दूसरों ने उल्लेख किया है, यह आमतौर पर एक्सएमएल में निहित एक समस्या के कारण होता है, क्योंकि आपने अपने जावा में कुछ गलत किया था। मेरे मामले में, यह तय करने के लिए एक सुपर आसान (और बेवकूफ) गलती थी।

मेरे पास इस तरह का कोड था:

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

जब मुझे केवल इतना करना था कि v को 'व्यू' में कैपिटल किया जाए, ताकि सिस्टम इसे पुनः प्राप्त कर सके। जांचें कि आपके कस्टम दृश्य (या टुकड़े, रिसाइकलव्यू आदि) सभी के सामने उचित पूंजीकरण घोषणा है ताकि XML ऑटो-पूर्ण इसे उपयुक्त दृश्य से मेल खाएगा।


0

मेरे पास यह त्रुटि भी थी, और बहुत लंबे समय तक डिबगिंग के बाद समस्या यह बताई गई कि मेरे मेनक्लास ने फ़्रेमएक्टिविटी के बजाय गतिविधि को बढ़ाया, मेरे मामले में, एक्सएमएल एक समस्या नहीं थी। आशा है कि आपकी मदद करेंगे।


0

मेरे मामले में ।

मैं जिस लेआउट को बढ़ाने की कोशिश कर रहा था

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

टैग, इसे हटाकर इसे ठीक कर दिया गया।

मैं व्यू-पेज एडाप्टर में एक एक्टविटी के लिए डिज़ाइन किए गए पिछले लेआउट को बढ़ाने की कोशिश कर रहा था।


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

मुझे नहीं पता कि यह वास्तव में एनपीई के बजाय इस त्रुटि को क्यों फेंकता है, लेकिन किसी ने एक ही परिदृश्य होने की स्थिति में मेरी त्रुटि को हल किया


0

मुझे एक ही समस्या थी, मेरे मामले में पैकेज का नाम गलत था, इसे ठीक करने से समस्या हल हो गई।



0

जब मैं अपने टुकड़े के मूल में अपना RecyclerView था, तो मुझे यह त्रुटि मिली।

लेकिन जब मैंने इसे व्यूग्रुप के साथ लपेटा, तो ऐप ने ठीक काम किया।


0

नेविगेशन में इस नाम फ़ील्ड को जोड़ें

एंड्रॉयड: नाम = "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">
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.