क्लास बढ़ाते समय त्रुटि हुई


188

मैं एक कस्टम दृश्य बनाने की कोशिश कर रहा हूं GhostSurfaceCameraViewजो विस्तारित होता है SurfaceView। यहाँ मेरी कक्षा परिभाषा फ़ाइल है

GhostSurfaceCameraView.java:

public class GhostSurfaceCameraView extends SurfaceView implements SurfaceHolder.Callback {
    SurfaceHolder mHolder;
    Camera mCamera;

    GhostSurfaceCameraView(Context context) {
        super(context);

        // Install a SurfaceHolder.Callback so we get notified when the
        // underlying surface is created and destroyed.
        mHolder = getHolder();
        mHolder.addCallback(this);
        mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    }

    public void surfaceCreated(SurfaceHolder holder) {
        // The Surface has been created, acquire the camera and tell it where to draw.
        mCamera = Camera.open();
        try {
            mCamera.setPreviewDisplay(holder);
        } catch (IOException exception) {
            mCamera.release();
            mCamera = null;
            // TODO: add more exception handling logic here
        }
    }

    public void surfaceDestroyed(SurfaceHolder holder) {
        // Surface will be destroyed when we return, so stop the preview.
        // Because the CameraDevice object is not a shared resource, it's very
        // important to release it when the activity is paused.
        mCamera.stopPreview();
        mCamera.release();
        mCamera = null;
    }   

    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
        // Now that the size is known, set up the camera parameters and begin
        // the preview.
        Camera.Parameters parameters = mCamera.getParameters();
        parameters.setPreviewSize(w, h);
        parameters.set("orientation", "portrait");
        // parameters.setRotation(90); // API 5+
        mCamera.setParameters(parameters);
        mCamera.startPreview();
    }
}

और यह मेरे घोस्टव्यूस्क्रीन में है। xml:

<com.alpenglow.androcap.GhostSurfaceCameraView android:id="@+id/ghostview_cameraview"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"/>

अब मैंने जो गतिविधि की है उसमें:

protected void onCreate(Bundle savedInstanceState) {
    try {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.ghostviewscreen);
    }
}

जब setContentView()बुलाया जाता है, तो एक अपवाद फेंक दिया जाता है:

Binary XML file 09-17 22:47:01.958: ERROR/ERROR(337):
ERROR IN CODE:
android.view.InflateException: Binary
XML file line #14: Error inflating
class
com.alpenglow.androcap.GhostSurfaceCameraView

क्या कोई मुझे बता सकता है कि मुझे यह त्रुटि क्यों मिली? धन्यवाद।

जवाबों:


369

मुझे लगता है कि मुझे लगा कि यह काम क्यों नहीं कर रहा है। मैं केवल एक पैरामीटर 'संदर्भ' के मामले के लिए एक कंस्ट्रक्टर प्रदान कर रहा था, जब मुझे दो पैरामीटर 'कॉन्टेक्स्ट, एट्रीब्यूटसेट' केस के लिए एक कंस्ट्रक्टर प्रदान करना चाहिए था। मुझे कंस्ट्रक्टर को सार्वजनिक एक्सेस देने की भी आवश्यकता थी। यहाँ मेरा फिक्स है:

public class GhostSurfaceCameraView extends SurfaceView implements SurfaceHolder.Callback {
        SurfaceHolder mHolder;
        Camera mCamera;

        public GhostSurfaceCameraView(Context context)
        {
            super(context);
            init();
        }
        public GhostSurfaceCameraView(Context context, AttributeSet attrs)
        {
            super(context, attrs);
            init();
        }
        public GhostSurfaceCameraView(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
            init();
        }

4
कभी-कभी सबसे सरल चीजें एक समस्या हो सकती हैं :) यह जानने के लिए अच्छा है कि दोनों मापदंडों को फुलाए जाने के लिए उपयोग किया जाता है।
वारपज़िट

5
धन्यवाद!! उदाहरणों में कहीं भी मुझे सभी निर्माणकर्ताओं को ओवरलोडिंग की आवश्यकता के बारे में कोई उल्लेख नहीं मिला! आपने मुझे समय के घंटे (दिन?) बचाए।
स्कॉट बिग्स

1
आपका बहुत बहुत धन्यवाद! त्रुटि संदेश काफी अनिर्दिष्ट है, जिसने मुझे एक पल के लिए रोक दिया था, उन्हें अपने त्रुटि संदेश में कारण (लापता निर्माता अधिभार) को शामिल करना चाहिए था।
AgentKnopf

1
इसके लिए धन्यवाद। किसी को पता है कि क्या यह कस्टम दृश्य के लिए बोर्ड भर में चला जाता है? जब भी आप एक कस्टम दृश्य बनाते हैं तो आपको दोनों कंस्ट्रक्टरों को शामिल करने की आवश्यकता होती है? (संदर्भ, और फिर संदर्भ और विशेषताएँ)
टिम

2
ओ, यह पहले देखा जाना चाहिए! संदेश View is not using the 2- **OR** 3-argument View constructorsभ्रामक है।
अटैकिव

45

@ समय - दोनों कंस्ट्रक्टर की आवश्यकता नहीं है, केवल ViewClassName(Context context, AttributeSet attrs )कंस्ट्रक्टर आवश्यक है। मुझे यह दर्दनाक तरीके से पता चला, घंटों और समय बर्बाद करने के बाद।

मैं एंड्रॉइड डेवलपमेंट के लिए बहुत नया हूं, लेकिन मैं यहां एक जंगली अनुमान लगा रहा हूं, क्योंकि यह शायद इस तथ्य के कारण है कि चूंकि हम Viewएक्सएमएल फाइल में कस्टम क्लास जोड़ रहे हैं , इसलिए हम एक्सएमएल में कई विशेषताओं को सेट कर रहे हैं, जिनकी आवश्यकता है तात्कालिकता के समय संसाधित किया जाना। हालांकि मुझसे ज्यादा ज्ञानी इस मामले पर स्पष्ट प्रकाश डाल पाएंगे।


यह समझ में आता है, जब मैं xml में इसके लिए विशेषताओं को परिभाषित करता हूं, तो मेरा कस्टम टेक्स्ट व्यू हमेशा ViewClassName (प्रसंग संदर्भ, विशेषता गुण) के साथ निर्मित होता है। अगर मैं इसे एक्सएमएल फ़ाइल में परिभाषित किए बिना तुरंत करता हूं, तो नियमित निर्माणकर्ता को केवल संदर्भ, ViewClassName (संदर्भ संदर्भ) के साथ बुलाया जाता है। मैं सोच रहा था कि अन्य कंस्ट्रक्टर क्या करता है और इसके अनुसार: stackoverflow.com/a/4022916/1505341 उत्तर, यह देखने के लिए बेस स्टाइल सेट करने के लिए उपयोग किया जाना चाहिए।
केरम

19

"त्रुटि फ़्लोइंग क्लास" संदेश का एक और संभावित कारण यह हो सकता है कि पूर्ण पैकेज का नाम जहां यह XML में निर्दिष्ट है, गलत वर्तनी हो:

<com.alpenglow.androcap.GhostSurfaceCameraView android:id="@+id/ghostview_cameraview"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"/>

एक्लिप्स एक्सएमएल एडिटर में अपनी लेआउट एक्सएमएल फ़ाइल को खोलना इस समस्या को उजागर करना चाहिए।


2
यह वास्तव में मेरे आवेदन के लिए तय था। com.zerokol.views.joystickview com.zerokol.views.JoystickView बन गया और यह काम कर गया!
एंडी

सच। अपनी आईडीई द्वारा प्रदान किए गए इरादों का उपयोग करके डबल चेक वर्तनी करें या काम करने की कोशिश करें, बस अपना पैकेज नाम टाइप करके शुरू करें और आपके सभी उपलब्ध वर्ग इरादों के तहत दिखाए जाएंगे।
ख् 0

यह मेरा मामला था।
बन्नी इशाक के

2

Xml में पूर्ण श्रेणी पथ लिखना महत्वपूर्ण है। मुझे केवल 'उप-वर्ग का नाम' लिखे जाने पर 'त्रुटि भड़काने वाली कक्षा' मिली।


यह @rmtheis के सुझाव के समान है। संभवतः उसके उत्तर पर टिप्पणी करना या अतिरिक्त जानकारी के साथ उसे संपादित करना बेहतर है।
इलिया बाराहोवस्की

1

मुझे यह त्रुटि पिछले कुछ घंटों से परेशान कर रही थी। पता चला, मैंने एंड्रॉइड स्टूडियो में एक मॉड्यूल के रूप में कस्टम व्यू लिब को जोड़ा था, लेकिन मैंने इसे ऐप की निर्भरता के रूप में जोड़ने की उपेक्षा की थी build.gradle

dependencies {
    ...
    compile project(':gifview')
}

1

fwiw , मुझे यह त्रुटि मिली क्योंकि कुछ कस्टम आरंभीकरण के कारण निर्माणकर्ता के भीतर एक अशक्त वस्तु तक पहुँचने का प्रयास किया जा रहा है।


0

मुझे TextEdit का विस्तार करने में समान समस्या थी। मेरे लिए गलती यह थी कि मैंने कंस्ट्रक्टर के लिए "पब्लिक" नॉन ऐड किया था। मेरे मामले में यह तब भी काम करता है जब मैं केवल एक कंस्ट्रक्टर को परिभाषित करता हूं, एक तर्क के साथ Contextऔर AttributeSet। वायर्ड बात यह है कि बग केवल तब ही प्रकट होता है जब मैं एक एपीके (एकल या नहीं) का निर्माण करता हूं और मैं इसे उपकरणों पर स्थानांतरित करता हूं। जब एप्लिकेशन AndroidStudio के माध्यम से चलाया जाता है -> USB कनेक्ट डिवाइस पर RunApp ऐप काम करता है।


0

मेरे मामले में मैंने ऐसे चक्रीय संसाधन जोड़े:

<drawable name="above_shadow">@drawable/above_shadow</drawable>

फिर बदल दिया गया

<drawable name="some_name">@drawable/other_name</drawable>

और यह काम किया


0

मेरे मामले में, मैंने अपनी कक्षा को कहीं और से कॉपी किया और तुरंत ध्यान नहीं दिया कि यह एक abstractकक्षा थी। आप अमूर्त कक्षाएं नहीं बढ़ा सकते।


0

यहाँ समझने वाली बात यह है कि:

ViewClassName(Context context, AttributeSet attrs )कस्टम व्यू को xml के माध्यम से फुलाते समय कंस्ट्रक्टर को कहा जाता है। आप देख रहे हैं कि आप नए कीवर्ड का उपयोग अपनी वस्तु को तुरंत करने के लिए नहीं कर रहे हैं new GhostSurfaceCameraView()। ऐसा करते हुए आप पहले कंस्ट्रक्टर को बुला रहे हैं public View (Context context)

जबकि XML से दृश्य को फुलाते समय, अर्थात उपयोग करते समय setContentView(R.layout.ghostviewscreen);या उपयोग करते समय findViewById, आप, NO, आप नहीं! , android सिस्टमViewClassName(Context context, AttributeSet attrs ) कंस्ट्रक्टर को कॉल करता है ।

दस्तावेज़ को पढ़ते समय यह स्पष्ट है: "कन्स्ट्रक्टर जिसे एक्सएमएल से एक दृश्य को फुलाते समय कहा जाता है।" देखें: https://developer.android.com/reference/android/view/View.html#View(android.content.Context,%20android.util.AttributeSet)

इसलिए, कभी भी मूल बहुरूपता को न भूलें और प्रलेखन के माध्यम से पढ़ना कभी न भूलें। यह एक टन सिरदर्द से बचाता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.