স্যুইচ কেস স্টেটমেন্ট ত্রুটি: কেস এক্সপ্রেশন অবশ্যই ধ্রুবক প্রকাশ হতে হবে


128

আমার সুইচ-কেস স্টেটমেন্টটি গতকাল পুরোপুরি ঠিকঠাক কাজ করে। তবে আমি যখন আজ সকালে এই কোডটি চালাচ্ছি তখন আমাকে মামলায় বর্ণনাকে লালচে বর্ণিত করে একটি ত্রুটি দিয়েছে এবং বলেছে: কেস এক্সপ্রেশনগুলি অবশ্যই ধ্রুবক প্রকাশ হতে পারে, এটি স্থির হয় আমি কী জানি না। নীচে আমার কোডটি এখানে:

public void onClick(View src)
    {
        switch(src.getId()) {
        case R.id.playbtn:
            checkwificonnection();
            break;

        case R.id.stopbtn:
            Log.d(TAG, "onClick: stopping srvice");
            Playbutton.setImageResource(R.drawable.playbtn1);
            Playbutton.setVisibility(0); //visible
            Stopbutton.setVisibility(4); //invisible
            stopService(new Intent(RakistaRadio.this,myservice.class));
            clearstatusbar();
            timer.cancel();
            Title.setText(" ");
            Artist.setText(" ");
            break;

        case R.id.btnmenu:
            openOptionsMenu();
            break;
        }
    }

সমস্ত R.id.int সমস্তই লাল রঙে আন্ডারলাইন করা আছে।


R.id.playbtnইত্যাদির সংজ্ঞা দিতে পারবেন ? সব কি স্থির এবং চূড়ান্ত?
থমাস

2
সম্ভবত আপনি নিজের বিন্যাসটি মোছা / পরিবর্তন করেছেন এবং সেই আইডিগুলির আর অস্তিত্ব নেই বা এর মতো কিছু ...
ভিসেন্টে প্লাটা

ক্লাসটি Rসাধারণত আইডিই / ডেভ সরঞ্জামগুলির দ্বারা উত্পন্ন হয়, সুতরাং এটি ব্যবহৃত Android এর সংস্করণের জন্য সাধারণত সঠিক।
সিএওও

আমার আর.আইডি। * সব ঠিক আছে এবং অ্যান্ড্রয়েডের জেনার ক্লাসে বিদ্যমান এবং এটি মূল বিন্যাসেও রয়েছে।
হার্টলেসআরচেঞ্জেল

উত্তর:


274

একটি নিয়মিত অ্যান্ড্রয়েড প্রজেক্টে, রিসোর্স আর ক্লাসে স্থিরকারীদের এভাবে ঘোষণা করা হয়:

public static final int main=0x7f030004;

তবে ১৪ ই এডিটি হিসাবে, একটি লাইব্রেরি প্রকল্পে, তারা এ জাতীয়ভাবে ঘোষণা করা হবে:

public static int main=0x7f030004;

অন্য কথায়, একটি লাইব্রেরি প্রকল্পে ধ্রুবকগুলি চূড়ান্ত নয়। সুতরাং আপনার কোড আর সংকলন করতে হবে।

এর সমাধানটি সহজ: স্যুইচ বিবৃতিটিকে যদি অন্য-বিবৃতিতে রূপান্তরিত করে।

public void onClick(View src)
{
    int id = src.getId();
    if (id == R.id.playbtn){
        checkwificonnection();
    } else if (id == R.id.stopbtn){
        Log.d(TAG, "onClick: stopping srvice");
        Playbutton.setImageResource(R.drawable.playbtn1);
        Playbutton.setVisibility(0); //visible
        Stopbutton.setVisibility(4); //invisible
        stopService(new Intent(RakistaRadio.this,myservice.class));
        clearstatusbar();
        timer.cancel();
        Title.setText(" ");
        Artist.setText(" ");
    } else if (id == R.id.btnmenu){
        openOptionsMenu();
    }
}

http://tools.android.com/tips/non-constant-fields

আপনি নিম্নলিখিতটি ব্যবহার করে একটি switchবিবৃতিতে দ্রুত কোনও বিবৃতিতে রূপান্তর করতে পারেন if-else:

Eclipse এ
আপনার কার্সারটি switchকীওয়ার্ডে সরান এবং Ctrl+ টিপুন এবং 1তারপরে নির্বাচন করুন

'যদি-অন্য' তে 'স্যুইচ' রূপান্তর করুন।

অ্যান্ড্রয়েড স্টুডিওতে
আপনার কার্সারটিকে switchকীওয়ার্ডে সরান এবং Alt+ টিপুন এবং Enterতারপরে নির্বাচন করুন

'যদি' দিয়ে 'স্যুইচ' প্রতিস্থাপন করুন।


আমি আমার স্যুইচ-কেস স্টেটমেন্টটিকে অন্য-যদি বিবৃতিতে পরিবর্তন করি তখন .. আমি কেবলই ভাবছিলাম যে আমি একটি নতুন অ্যান্ড্রয়েড প্রকল্প তৈরি করেছি এবং একটি স্যুইচ-কেস স্টেটমেন্ট ব্যবহার করেছি এবং ভাল কাজ করেছি ..
হার্টলেসআরচেন্জ

1
এটি হতে পারে যে আপনার প্রথম প্রকল্পটি একটি লাইব্রেরি প্রকল্প ব্যবহার করছে এবং আপনার নতুন প্রকল্পটি এটি নয়।
বেনিটো বার্তোলি

আমি বুঝতে পারি না যে দুঃখিত আমি এখানে সত্যই একটি শিক্ষানবিস .. আপনি ব্যাখ্যা করতে পারেন
হার্টলেসআরচেঞ্জেল

7
কমপক্ষে গ্রহপ আপনাকে স্বয়ংক্রিয়ভাবে অন্য / অন্যটিতে স্যুইচ রূপান্তর করতে দেয়। স্যুইচ কীওয়ার্ডে ক্লিক করুন। তারপরে সিটিআরএল -১ টি দেখুন
ড্যারেন কাতো

1
সংকলনটির সংকলনের সময় জানা প্রয়োজন be finalকীওয়ার্ড ব্যতীত রানটাইমে একটি পরিবর্তনশীল পরিবর্তন করা যায়।
বেনিটো বার্তোলি

52

প্রোজেক্টস আমার জন্য প্রকল্পের "ইস লাইব্রেরি" অনিচ্ছুক আমার জন্য কাজ করেছিল।


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

5
একটি লাইব্রেরী প্রকল্প "ইস লাইব্রেরি" এর সাথে চিহ্নিত হওয়ার কারণ রয়েছে। এটি সমস্যার উপযুক্ত সমাধান নয় - নিয়মিত অ্যাপ্লিকেশনগুলির মতো আচরণের জন্য গ্রন্থাগারগুলি কী হওয়া উচিত তা তৈরি করে এটি আপনার অ্যান্ড্রয়েড প্রকল্প কাঠামোটি ভেঙে দেবে।
এডিটিসি

13

সমাধানটি এভাবে করা যেতে পারে:

  1. শুধু ধার্য মান থেকে পূর্ণসংখ্যা
  2. করুন পরিবর্তনশীল থেকে চূড়ান্ত

উদাহরণ:

public static final int cameraRequestCode = 999;

আশা করি এটা তোমাকে সাহায্য করবে।


8

আর.আইডি। *, যেহেতু এডিটি 14 আরও চূড়ান্ত স্ট্যাটিক ইনট হিসাবে ঘোষণা করা হয়নি তাই আপনি সুইচ কেস কনস্ট্রাক্টে ব্যবহার করতে পারবেন না। পরিবর্তে অন্য ক্লজটি ব্যবহার করতে পারেন।


হ্যাঁ আমি এটি টিউনস এন্ড্রয়েড.কম এ পড়েছি, আমি একটি নতুন প্রকল্প তৈরি করার চেষ্টা করেছি এবং উপরের কোডটি ব্যবহার করেছি এবং এটি ঠিক কাজ করে .. এটি কীভাবে?
হার্টলেসআরচেঞ্জেল

1
সরঞ্জামস.এন্ড্রয়েড / রিসেন্ট / বিল্ডচেনজইনরিভিশন 14 "লাইব্রেরী প্রকল্পের পুনর্নির্মাণ" বিভাগটি দেখুন
ব্ল্যাকবেল্ট

6
কেন তারা এই পরিবর্তন এনেছে তা বোঝা যায় না।
অ্যান্ড্রু এস

8

এই সমস্যার সহজ সমাধান হ'ল:

স্যুইচটিতে ক্লিক করুন এবং তারপরে CTL + 1 টিপুন , এটি আপনার স্যুইচটিকে যদি অন্যথায় ব্লক স্টেটমেন্টে পরিবর্তন করে, এবং আপনার সমস্যার সমাধান করবে


7

যদি অন্য-ইফ-এর পরিবর্তে সুন্দর স্যুইচ রাখার এই অন্যান্য সমাধান সম্পর্কে কী হবে:

private enum LayoutElement {
    NONE(-1),
    PLAY_BUTTON(R.id.playbtn),
    STOP_BUTTON(R.id.stopbtn),
    MENU_BUTTON(R.id.btnmenu);

    private static class _ {
        static SparseArray<LayoutElement> elements = new SparseArray<LayoutElement>();
    }

    LayoutElement(int id) {
        _.elements.put(id, this);
    }

    public static LayoutElement from(View view) {
        return _.elements.get(view.getId(), NONE);
    }

}

সুতরাং আপনার কোডে আপনি এটি করতে পারেন:

public void onClick(View src) {
    switch(LayoutElement.from(src)) {
    case PLAY_BUTTTON:
        checkwificonnection();
        break;

    case STOP_BUTTON:
        Log.d(TAG, "onClick: stopping srvice");
        Playbutton.setImageResource(R.drawable.playbtn1);
        Playbutton.setVisibility(0); //visible
        Stopbutton.setVisibility(4); //invisible
        stopService(new Intent(RakistaRadio.this,myservice.class));
        clearstatusbar();
        timer.cancel();
        Title.setText(" ");
        Artist.setText(" ");
        break;

    case MENU_BUTTON:
        openOptionsMenu();
        break;
    }
}

এনামগুলি স্থিতিশীল তাই এটি খুব সীমিত প্রভাব ফেলবে। উদ্বেগের জন্য একমাত্র উইন্ডোটি হ'ল জড়িত দ্বিগুণ সন্ধান (প্রথমে অভ্যন্তরীণ স্পার্সআরে এবং পরে স্যুইচ টেবিলের উপরে)

এটি বলেছিল, আইডির রেফারেন্স রেখে প্রয়োজনে এই এনামটি সাবলীল উপায়ে আইটেম আনার জন্যও ব্যবহার করা যেতে পারে ... তবে এটি অন্য সময়ের জন্য গল্প।


এনাম অ্যান্ড্রয়েডে তাদের স্মৃতি ফোলাভাবের কারণে নিরুৎসাহিত হয়; এগুলি এওএসপি-তে কখনই ব্যবহৃত হয় না - এবং আপনি কোথাও ইনপুট দেখতে পান তার কারণ।
ADTC


3

আমার ক্লাসে ঘোষিত ভেরিয়েবলগুলি সহ একটি ফাংশনে স্যুইচ ব্যবহার করার সময় এটি আমাকে এই ত্রুটিটি ছুঁড়ে ফেলছিল:

private void ShowCalendar(final Activity context, Point p, int type) 
{
    switch (type) {
        case type_cat:
            break;

        case type_region:
            break;

        case type_city:
            break;

        default:
            //sth
            break;
    }
}

আমি যখন ঘোষণা করলাম তখন সমস্যার সমাধান হয়েছিল finalক্লাস শুরুর ভেরিয়েবলগুলিতে :

final int type_cat=1, type_region=2, type_city=3;

1
enumintএই ক্ষেত্রে একটি ভাল বিকল্প । পদ্ধতির কলকারী অবৈধ প্রকারের সাথে ফাংশনটিতে কল করতে সক্ষম হবে না।
নাহধঃ

আমার নির্দিষ্ট ইনট টাইপ রয়েছে তাই এর ঠিক আছে যদি আমি ইনট ব্যবহার করি। তবে আমি
এনাম

i have specific int types so its ok if i use intsআসলেই তা বোঝায় না। এনাম
nhahtdh

আমার অর্থ এই যে
ফাংশনটিতে আগত ইনটি

i mean that the incoming int variable type in the function will always be one of these 3 types so it won't break anythingএটি আপনার অনুমান। অন্য কেউ স্বেচ্ছাসেবী নম্বর দিয়ে ফাংশনটিকে ভুলভাবে কল করতে পারে। সাথে enum, আপনার ধরে নিতে হবে না, এটি ভাষা দ্বারা প্রয়োগ করা হয়।
নাহধঃ

2

আমি এটি উল্লেখ করতে চাই, আমি যখন আমার প্রকল্পে একটি লাইব্রেরি যুক্ত করার চেষ্টা করছিলাম তখনও আমি একই অবস্থা পেলাম। হঠাৎ সমস্ত সুইচ স্টেটমেন্ট ত্রুটি দেখাতে শুরু করে!

এখন আমি যুক্ত করা লাইব্রেরিটি সরিয়ে দেওয়ার চেষ্টা করেছি, তারপরেও এটি কার্যকর হয়নি। " যখন আমি প্রকল্পটি পরিষ্কার করি " তখন সমস্ত ত্রুটিগুলি কেবলই বন্ধ হয়ে যায়!

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