পরিবর্তনশীল অভ্যন্তর শ্রেণীর মধ্যে অ্যাক্সেস করা হয়। চূড়ান্ত ঘোষণা করা প্রয়োজন


116

সুতরাং শিরোনাম এটি সব বলে। আমি আমার ভিতরে একটি সংকলন ত্রুটি পেয়েছি onClick

এখানে কোড।

public class fieldsActivity extends Activity {

Button addSiteButton;
Button cancelButton;
Button signInButton;


/**
 * Called when the activity is first created.
 */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // to create a custom title bar for activity window
    requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);

    setContentView(R.layout.fields);
    // use custom layout title bar
    getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.topbar);

    Pager adapter = new Pager();
    ViewPager mPager = (ViewPager) findViewById(R.id.fieldspager);
    mPager.setAdapter(adapter);
    mPager.setCurrentItem(1);



    addSiteButton = (Button) findViewById(R.id.addSiteButton);
    addSiteButton.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
           mPager.setCurrentItem(2, true); //Compilation error happens here.
        }


    });


    cancelButton = (Button) findViewById(R.id.cancel_button);
    signInButton = (Button) findViewById(R.id.sign_in_button);

}

1
আপনি যদি Eclipse ব্যবহার করে থাকেন তবে আপনি একটি দ্রুত ফিক্স দেখতে নির্বাচিত ত্রুটি সহ সিটিআরএল -১ (ওএস এক্সের সিএমডি -১) টিপতে পারেন যা আপনাকে কী পরিবর্তন করতে হবে তা দেখায়। : আরও এখানে দেখুন depth-first.com/articles/2008/01/11/...
Intrications

উত্তর:


130

আপনি যদি এটি চূড়ান্ত করতে না চান তবে আপনি সর্বদা এটি একটি বৈশ্বিক পরিবর্তনশীল করতে পারেন।


1
@ কেভিনঝাও একবার বৈশ্বিক ভেরিয়েবলগুলি চূড়ান্ত হয়ে গেলে তারা কি চূড়ান্ত হয়?
the_prole

@ থি_প্লেল আমি মনে করি আপনি জাভাতে ফাইনাল ব্যবহার করতে পারবেন তবে অ্যান্ড্রয়েড অ্যাপ তৈরির সময় আপনি এটি ব্যবহার করতে পারবেন কিনা তা আমি নিশ্চিত নই, তাই গুগলিং এটি একটি ভাল ধারণা হতে পারে :-)
কেভিন ঝাও

15
বিপরীতমুখী ক্ষেত্রে, বৈশ্বিক ভেরিয়েবলগুলি ব্যবহার করা এড়ানো একটি খারাপ ধারণা, যদি আপনি কোনও শিক্ষানবিস না হন তবে যদি গ্লোবালগুলির সাথে আপনার প্রোগ্রামকে অতিরিক্ত জটিল করে তোলা ভাল শিক্ষার অভিজ্ঞতা। এখানে বিশ্বব্যাপী ভেরিয়েবলগুলি কীভাবে খারাপ ধারণা তা ব্যাখ্যা করার জন্য একটি নিবন্ধ এখানে
the_prole

65

আপনি ভেরিয়েবলটিকে চূড়ান্ত ঘোষণা করতে পারেন, বা এটিকে একটি উদাহরণ (বা বৈশ্বিক) পরিবর্তনশীল করতে পারেন। আপনি যদি এটি চূড়ান্ত ঘোষণা করেন তবে আপনি পরে এটি পরিবর্তন করতে পারবেন না।

কোনও পদ্ধতিতে সংজ্ঞায়িত এবং বেনামি অভ্যন্তর শ্রেণীর দ্বারা অ্যাক্সেস করা কোনও চলক অবশ্যই চূড়ান্ত হতে হবে। অন্যথায়, আপনি সেই পরিবর্তনশীলটি অভ্যন্তরীণ শ্রেণিতে ব্যবহার করতে পারেন, অজানা। মূলত, যা অভ্যন্তর শ্রেণিতে ঘটে তা অন্তর্ শ্রেণিতে থাকে।

আমি এখানে আরও গভীরভাবে ব্যাখ্যা লিখেছি । এটি উদাহরণস্বরূপ এবং বৈশ্বিক ভেরিয়েবলগুলিকে চূড়ান্ত ঘোষণার প্রয়োজন হয় না তাও ব্যাখ্যা করে।


44

ত্রুটিটি সব বলে, পরিবর্তন করুন:

ViewPager mPager = (ViewPager) findViewById(R.id.fieldspager);

প্রতি

final ViewPager mPager = (ViewPager) findViewById(R.id.fieldspager);

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

@ সিগনিস আমি একটি নালপয়েন্টার এক্সসেপশন ত্রুটি পেয়ে যাচ্ছি addSiteButton.setOnClickListener(new View.OnClickListener() {আপনার কি ধারণা আছে যে এটি কেন আসছে?
পিএইচডিওলিভির

1
@ পিএইচডিওলিভিরা এনপিই সাধারণত নিক্ষিপ্ত হয় যখন আপনি কোনও ভেরিয়েবলের কোনও পদ্ধতিতে কল করেন null। সম্ভবত, ফাইন্ডভিউবিআইডি ফিরে আসছে null। অ্যান্ড্রয়েড প্রোগ্রামার না হয়ে আমি আরও বলতে পারি না; আমি আপনাকে একটি পৃথক প্রশ্ন খোলার পরামর্শ দিচ্ছি। অবশ্যই, এটি অভ্যন্তরীণ ক্লাস, ফাইনাল এবং সিমিলিয়ার সাথে কিছুই করার নেই ।
অজানা

25

এখানে একটি মজার উত্তর।

আপনি একটি চূড়ান্ত এক-উপাদান অ্যারের ঘোষণা করতে পারেন এবং অ্যারের উপাদানগুলি যা আপনি দৃশ্যত চান তা পরিবর্তন করতে পারেন। আমি নিশ্চিত যে এই সংকলক নিয়মটি প্রথম স্থানে প্রয়োগ করার কারণটি ভঙ্গ করেছে তবে আমি আজ যেমন ছিলাম আপনি যখন সময় বেঁধে থাকবেন তখন তা কার্যকর।

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

final int[] tapCount = {0};

addSiteButton.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View v) {
       tapCount[0]++;
    }

});

উপরের ক্ষেত্রে আপনি রেফারেন্স করা বস্তুটি পরিবর্তন করছেন না, তবে অ্যারের ভিতরে সামগ্রী পরিবর্তন করছেন। লিঙ্কে সুন্দর ব্যাখ্যা আছে।
অবিলাশ

হ্যা আমি জানি. সমস্যাটি সমাধান করার জন্য কেবল হ্যাকের মতো মনে হচ্ছে। আপনার মন্তব্যটি অন্যদের জন্য এটি পরিষ্কার করার জন্য ধন্যবাদ Thanks
the_new_mr

4

@ ওয়েজার যেমন বলেছে, আপনি এটি তৈরি করতে পারেন finalযাতে ভেরিয়েবলটি অভ্যন্তর শ্রেণিতে ব্যবহার করা যায়।

final ViewPager pager = (ViewPager) findViewById(R.id.fieldspager);

আমি বলেছি pager বদলে mPagerকারণ আপনি এটি একটি স্থানীয় পরিবর্তনশীল যেমন ব্যবহার করছেন onCreateপদ্ধতি। mউপসর্গ cusomarily বর্গ সদস্য ভেরিয়েবল জন্য সংরক্ষিত (অর্থাত ভেরিয়েবল যে বর্গ শুরুতে ঘোষণা করে এবং সব শ্রেণী পদ্ধতি ব্যবহারের জন্য উপলব্ধ রয়েছে)।

আপনার যদি আসলে কোনও শ্রেণীর সদস্যের পরিবর্তনশীল প্রয়োজন হয় তবে এটি চূড়ান্ত করার জন্য এটি কাজ করে না কারণ আপনি findViewByIdতার মান সেট না করা পর্যন্ত ব্যবহার করতে পারবেন না onCreate। সমাধানটি হ'ল অজ্ঞাতনামা অভ্যন্তরীণ শ্রেণি ব্যবহার না করা। এইভাবে mPagerচলকটি চূড়ান্ত ঘোষণার প্রয়োজন হয় না এবং ক্লাস জুড়ে ব্যবহার করা যায়।

public class MainActivity extends AppCompatActivity {

    private ViewPager mPager;
    private Button mButton;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        // ...

        mPager = (ViewPager) findViewById(R.id.fieldspager);

        // ...

        mButton.setOnClickListener(myButtonClickHandler);
    }


    View.OnClickListener myButtonClickHandler = new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            mPager.setCurrentItem(2, true);
        }
    };
}

0
    public class ConfigureActivity extends Activity {

        EditText etOne;
        EditText etTwo;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_configure);

            Button btnConfigure = findViewById(R.id.btnConfigure1);   
            btnConfigure.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            configure();
                        }
                    });
    }

    public  void configure(){
            String one = etOne.getText().toString();
            String two = etTwo.getText().toString();
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.