রান সময়টিতে একটি ভিউয়ের পরিবর্তে অ্যান্ড্রয়েড লেআউট


175

আমার xmlদুটি টেক্সটভিউ এ / বি এবং একটি ভি সি সহ একটি আলেআউট ফাইল প্রধান রয়েছে আমার কাছে অন্য দুটি xml-আউটআউট ফাইল রয়েছে option1এবং option2। জাভা এর মাধ্যমে সি তে লোড করা option1বা option2রান টাইমে কি সম্ভব ? যদি তাই হয় তবে আমার কোন ফাংশনটি ব্যবহার করতে হবে?

উত্তর:


372

আপনি যে কোনও সময় যে কোনও দৃশ্য প্রতিস্থাপন করতে পারেন।

int optionId = someExpression ? R.layout.option1 : R.layout.option2;

View C = findViewById(R.id.C);
ViewGroup parent = (ViewGroup) C.getParent();
int index = parent.indexOfChild(C);
parent.removeView(C);
C = getLayoutInflater().inflate(optionId, parent, false);
parent.addView(C, index);

আপনি ইতিমধ্যে বিদ্যমান প্রতিস্থাপন করতে না চান তাহলে দেখুন সেট: কিন্তু আরম্ভের সময়ে OPTION1 / OPTION2 মধ্যে নির্বাচন, তাহলে আপনি এই সহজ করতে পারে android:idপিতা বা মাতা বিন্যাস এবং তারপর জন্য:

ViewGroup parent = (ViewGroup) findViewById(R.id.parent);
View C = getLayoutInflater().inflate(optionId, parent, false);
parent.addView(C, index);

দর্শনের কাঠামোর উপর নির্ভর করে আপনাকে যথাযথ মানটিতে "সূচক" সেট করতে হবে। আপনি একটি ভিউস্টাবও ব্যবহার করতে পারেন : ভি সিস্ট হিসাবে আপনার সি ভিউ যুক্ত করুন এবং তারপরে:

ViewStub C = (ViewStub) findViewById(R.id.C);
C.setLayoutResource(optionId);
C.inflate();

আপনি যদি আপনার এক্সএমএল লেআউট পুনর্গঠন করতে চান তবে আপনাকে উপরের "সূচক" মানের উপরে চিন্তা করতে হবে না।


আমি কি খণ্ডটি অপসারণ করব, না খণ্ডটিও সরানো হবে?
কে - এসও-তে বিষক্রিয়া বাড়ছে।

3
@ কার্লমরিসন এই প্রশ্নটি প্রায় 4 বছরের পুরানো এবং খণ্ডগুলির সাথে কোনও সম্পর্ক নেই nothing আমি একটি নতুন প্রশ্ন ফাইল করার পরামর্শ দিচ্ছি এবং / অথবা একবার দেখে নিন android.app.FragmentTransactionএবং এটির replace()পদ্ধতি।
লুপজ

দুঃখের বিষয় আপনার উত্তরটি অত্যন্ত জটিল - মন্তব্যগুলিতে - নবাগত অ্যান্ড্রয়েড প্রোগ্রামারদের জন্য :-(
অ্যান্টোনিও সেস্তো

2
@ অ্যান্টোনিওয়েস্টো যা খুব জটিল? আপনি কোথায় বিভ্রান্ত হয়েছেন?
AdamMc331

@ ব্রুট আমি আমার লিনিয়ারলআউটে যে চিত্রগুলি করেছি সেগুলিতে আমি দিনব্যাপী চিত্রগুলি যুক্ত করতে চাই। পরে আমি লেআউট থেকে কিছু চিত্র সরিয়েছি। তারপরে আমি এটিকে তার নিজের অবস্থানে পুনরুদ্ধার করতে চাই যেখানে থেকে আমি সরিয়েছি। মানে আমি বাচ্চাদের পিতামাতার অপসারণ ছাড়াই চিত্রগুলি যুক্ত করতে চাই আপনি দয়া করে আমাকে হতাশ করতে পারেন?
প্রিয়াঙ্কাচৌহান

43

এবং যদি আপনি এটি খুব ঘন ঘন করেন তবে আপনি বিকল্প বদলাতে স্বাচ্ছন্দ্যে একটি ভিউসুইচার বা একটি ভিউ ফ্লিপার ব্যবহার করতে পারেন ।


হ্যাঁ, যদি বিকল্প মতামত নিয়ে প্রশ্ন আসে তবে ফ্লিপার / স্যুইচারটি দেখুন আরও ভাল
জুম্বি

2
শৈল আদি, আপনি কি ভিউসউইচার টিউটোরিয়াল কোডটি গুলে দেওয়ার চেষ্টা করেছিলেন?
স্নিকোলাস

আমি জানি এটি পুরানো - তবে সতর্কতাটি হ'ল কোনও ভিউসচিটর নিজেই উভয় মতামতকে আরম্ভ করে এবং ধরে রাখে (একটি ফ্রেমলআউট)।
বিক্রম বডিচেরলা

এটি সুপারিশ উত্তর হতে হবে। কেন কেবল প্রস্তুত তৈরি পরীক্ষিত সমাধানটি ব্যবহার করবেন না।

3
private void replaceView(View oldV,View newV){
        ViewGroup par = (ViewGroup)oldV.getParent();
        if(par == null){return;}
        int i1 = par.indexOfChild(oldV);
        par.removeViewAt(i1);
        par.addView(newV,i1);
    }

6
যদিও এই কোডটি প্রশ্নের উত্তর দিতে পারে, কীভাবে এবং / বা কেন এটি সমস্যার সমাধান করে তা সম্পর্কিত অতিরিক্ত প্রসঙ্গ সরবরাহ করলে উত্তরটির দীর্ঘমেয়াদী মান উন্নত হবে
frobinsonj

0

এটি আমার ক্ষেত্রে, ওল্ড সেন্সর এবং নতুন সেন্সর - ওল্ড ভিউ এবং নতুন ভিউতে কাজ করে:

private void replaceSensors(View oldSensor, View newSensor) {
            ViewGroup parent = (ViewGroup) oldSensor.getParent();

            if (parent == null) {
                return;
            }

            int indexOldSensor = parent.indexOfChild(oldSensor);
            int indexNewSensor = parent.indexOfChild(newSensor);
            parent.removeView(oldSensor);
            parent.addView(oldSensor, indexNewSensor);
            parent.removeView(newSensor);
            parent.addView(newSensor, indexOldSensor);
        }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.