কোনও শ্রেণি প্রসারিত করার সময় স্ফীতকরণে ত্রুটি


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

এবং এটি আমার ঘোস্টভিউস্ক্রিন.এক্সএমএল:

<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
অনেক ধন্যবাদ! ত্রুটি বার্তাটি একেবারেই অপ্রয়োজনীয়, যা আমাকে এক মুহুর্তের জন্য থামিয়ে দিয়েছিল, তাদের ত্রুটি বার্তায় কারণ (নির্মাণকারী ওভারলোড অনুপস্থিত) অন্তর্ভুক্ত করা উচিত ছিল।
এজেন্টকনপফ

1
এর জন্য ধন্যবাদ. এটি কি কাস্টম ভিউগুলির জন্য বোর্ড জুড়ে যায় কিনা জানেন? আপনি যখনই কোনও কাস্টম ভিউ করবেন তখনই আপনাকে উভয় নির্মাতাকে অন্তর্ভুক্ত করতে হবে? (প্রসঙ্গে এবং তারপরে প্রসঙ্গ এবং বৈশিষ্ট্য)
টিম

2
ও, আগে দেখা উচিত ছিল! বার্তাটি View is not using the 2- **OR** 3-argument View constructorsএক ধরণের বিভ্রান্তিকর।
আক্রমণাত্মক

45

@ টিম - উভয় কনস্ট্রাক্টরের প্রয়োজন নেই, কেবল ViewClassName(Context context, AttributeSet attrs )কনস্ট্রাক্টর প্রয়োজনীয়। ঘন্টাখানেক সময় নষ্ট হয়ে যাওয়ার পরে আমি এটি বেদনাদায়ক উপায়টি খুঁজে পেয়েছি।

আমি অ্যান্ড্রয়েড বিকাশে খুব নতুন, তবে আমি এখানে একটি বুনো অনুমান করছি, যেহেতু আমরা Viewএক্সএমএল ফাইলটিতে কাস্টম ক্লাস যুক্ত করছি, তাই আমরা এক্সএমএলে এর সাথে কয়েকটি বৈশিষ্ট্য নির্ধারণ করছি, যার প্রয়োজন তাত্ক্ষণিক সময়ে প্রক্রিয়া করা। আমার চেয়ে আরও বেশি জ্ঞানবান কেউ যদিও এই বিষয়ে আরও পরিষ্কার আলোকপাত করতে সক্ষম হবেন।


এটি অর্থবোধ করে, আমার কাস্টম টেক্সটভিউ সর্বদা ভিউক্ল্যাশনেম (কনটেক্সট প্রসঙ্গে, অ্যাট্রিবিউটসেট অ্যাটারস) দিয়ে তৈরি হয় যখন আমি এক্সএমএলে এর জন্য বৈশিষ্ট্যগুলি সংজ্ঞায়িত করি। আমি যদি এটি এক্সএমএল ফাইলে সংজ্ঞায়িত না করে ইনস্ট্যান্ট করি তবে নিয়মিত কনস্ট্রাক্টরকে কেবল প্রসঙ্গে, ভিউক্লাসনেম (প্রসঙ্গে প্রসঙ্গ) দিয়ে ডাকা হয়। আমি ভাবছিলাম যে অন্য নির্মাতা কী করেন এবং এটি অনুসারে: স্ট্যাকওভারফ্লো.com/ a / 4022916 / 1505341 উত্তর, দেখার জন্য এটি একটি বেস শৈলী সেট করার জন্য ব্যবহৃত হবে বলে মনে করা হচ্ছে।
কেরেম

19

"ক্লাস স্ফীতকরণে ত্রুটি" বার্তার আরও একটি সম্ভাব্য কারণটি সম্পূর্ণ প্যাকেজটির নাম ভুল বানানটি এক্সএমএল-এ উল্লিখিত হয়েছে:

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

এক্সলিট এক্সএমএল এডিটরটিতে আপনার লেআউট XML ফাইলটি খোলার উচিত এই সমস্যাটি হাইলাইট করা উচিত।


2
এটিই ছিল আমার আবেদনের সমাধান। com.zerokol.views.joystickview হয়ে উঠেছে com.zerokol.views.JoystickView এবং এটি কাজ করেছে!
অ্যান্ডি

সত্য। ডাবল চেক বানান করুন বা আপনার আইডিই দ্বারা প্রদত্ত উদ্দেশ্যগুলি ব্যবহার করে কাজ করার চেষ্টা করুন, কেবলমাত্র আপনার প্যাকেজের নামটি টাইপ করে শুরু করুন এবং আপনার সমস্ত অ্যাভেলবেল ক্লাসগুলি উদ্দেশ্য অনুসারে প্রদর্শিত হবে।
খায়

এটা আমার ক্ষেত্রে ছিল।
বনি ইসহাক কে

2

এক্সএমএলে পূর্ণ শ্রেণীর পাথ লেখা গুরুত্বপূর্ণ। কেবলমাত্র সাবক্লাসের নাম লেখা থাকলে আমি 'ত্রুটি স্ফীত করতে ক্লাস' পেয়েছি got


এটি @ এমএমথিস যা পরামর্শ দিচ্ছে তার সাথে খুব মিল। সম্ভবত তার উত্তরে মন্তব্য করা বা এটি অতিরিক্ত তথ্যের সাথে সম্পাদনা করা আরও ভাল।
ইলিয়া বারাহোভস্কি

1

গত কয়েক ঘন্টা ধরে আমাকে এই সমস্যায় ফেলতে হয়েছিল। দেখা যাচ্ছে, আমি অ্যান্ড্রয়েড স্টুডিওতে মডিউল হিসাবে কাস্টম ভিউ লাইব যুক্ত করেছি, তবে আমি এটিকে অ্যাপের উপর নির্ভরতা হিসাবে যুক্ত করতে অবহেলা করেছি build.gradle

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

1

তবে , কনস্ট্রাক্টরের মধ্যে শুল্কের কিছু শুরুর জন্য আমি এই ত্রুটিটি পেয়েছি।


0

টেক্সটএডিট প্রসারিত করতে আমার একই সমস্যা ছিল। আমার জন্য ভুলটি ছিল আমি কনস্ট্রাক্টরে "পাবলিক" যোগ করিনি। আমার ক্ষেত্রে এটি কাজ করে এমনকি আমি যদি কেবলমাত্র একজন নির্মাণকারীকে যুক্তি দিয়েছি Contextএবং AttributeSet। তারযুক্ত জিনিসটি হ'ল বাগটি কেবল তখনই প্রকাশ পায় যখন আমি একটি APK তৈরি করি (ডোজিত বা না) এবং আমি এটি ডিভাইসগুলিতে স্থানান্তর করি। অ্যাপ্লিকেশনটি একটি ইউএসবি সংযুক্ত ডিভাইসে অ্যান্ড্রয়েডস্টুডিও -> রান অ্যাপের মাধ্যমে চালিত হলে অ্যাপটি কাজ করে।


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 মাধ্যমে customView বৃদ্ধি বলা হয়। আপনি দেখতে পাচ্ছেন যে আপনি নতুন কীওয়ার্ডটি আপনার অবজেক্টটি ইনস্ট্যান্ট করতে ব্যবহার করছেন না আপনি করছেন না new GhostSurfaceCameraView()। এটি করে আপনি প্রথম কনস্ট্রাক্টর অর্থাৎ কল করছেনpublic View (Context context)

যদিও এক্সএমএল থেকে দর্শন স্ফীত করার সময়, যখন ব্যবহার setContentView(R.layout.ghostviewscreen);বা ব্যবহার করার সময় findViewByIdআপনি, না, আপনি না! , অ্যান্ড্রয়েড সিস্টেমটিViewClassName(Context context, AttributeSet attrs ) কনস্ট্রাক্টরকে কল করে ।

ডকুমেন্টেশন পড়ার সময় এটি স্পষ্ট: "এক্সএমএল থেকে কোনও ভিউ ফুলে উঠলে বলা হয় এমন কনস্ট্রাক্টর।" দেখুন: https://developer.android.com/references/android/view/View.html#View(android.content.Context,%20android.util.AttributeSet)

সুতরাং, কখনও কখনও বেসিক পলিমারফিজমটি ভুলে যাবেন না এবং ডকুমেন্টেশনের মাধ্যমে পড়া কখনও ভুলবেন না। এটি এক টন মাথা ব্যথা বাঁচায়।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.