মূল সমস্যাটি হ'ল, আপনাকে প্রকৃত পরিমাপের জন্য অঙ্কন পর্বের জন্য অপেক্ষা করতে হবে (বিশেষত গতিশীল মানগুলি wrap_content
বা এর মতো match_parent
), তবে সাধারণত এই পর্বটি শেষ হয় নি onResume()
। সুতরাং এই পর্বের জন্য অপেক্ষা করার জন্য আপনার একদম প্রয়োজন। এর বিভিন্ন সম্ভাব্য সমাধান রয়েছে:
1. আঁকুন / লেআউট ইভেন্টগুলি শুনুন: ভিউTreeObserver
একটি ViewTreeObserver বিভিন্ন অঙ্কন ইভেন্টের জন্য বরখাস্ত হয়। সাধারণত OnGlobalLayoutListener
আপনি পরিমাপটি পাওয়ার জন্য যা চান তা তাই শ্রোতার মধ্যে কোডটি বিন্যাস পর্বের পরে কল করা হবে, সুতরাং পরিমাপগুলি প্রস্তুত:
view.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
view.getViewTreeObserver().removeOnGlobalLayoutListener(this);
view.getHeight(); //height is ready
}
});
দ্রষ্টব্য: শ্রোতা তাত্ক্ষণিকভাবে সরানো হবে কারণ অন্যথায় এটি প্রতিটি লেআউট ইভেন্টে আগুন লাগবে। আপনার যদি অ্যাপ্লিকেশনগুলিকে সমর্থন করতে হয় SDK Lvl <16 শ্রোতার রেজিস্ট্রেশন করতে এটি ব্যবহার করুন:
public void removeGlobalOnLayoutListener (ViewTreeObserver.OnGlobalLayoutListener victim)
২. লেআউট সারিতে একটি চলমানযোগ্য যুক্ত করুন: দেখুন.পোস্ট ()
খুব পরিচিত না এবং আমার প্রিয় সমাধান। মূলত আপনার নিজের চালনার সাথে ভিউয়ের পোস্ট পদ্ধতিটি ব্যবহার করুন। এটি রোমান গাইয়ের মতামত অনুসারে পরিমাপ, লেআউট ইত্যাদির পরে আপনার কোডটি সারিবদ্ধ করে তুলেছে :
UI ইভেন্টের সারি ক্রমযুক্ত ইভেন্টগুলি প্রক্রিয়া করবে। সেট কনটেন্টভিউ () আহ্বান করার পরে ইভেন্টের কাতারে রিলেআউট চেয়ে একটি বার্তা থাকবে, সুতরাং আপনার সারিটিতে পোস্ট করা যে কোনও কিছুই বিন্যাস পাসের পরে ঘটবে
উদাহরণ:
final View view=//smth;
...
view.post(new Runnable() {
@Override
public void run() {
view.getHeight(); //height is ready
}
});
সুবিধা উপর ViewTreeObserver
:
- আপনার কোডটি কেবল একবার কার্যকর করা হয়েছে এবং কার্যকর করার পরে আপনাকে পর্যবেক্ষককে অক্ষম করতে হবে না যা ঝামেলা হতে পারে
- কম ভার্বোজ সিনট্যাক্স
তথ্যসূত্র:
৩.উইউরাইট ভিউজের অন-লেআউট পদ্ধতি w
এটি কেবলমাত্র নির্দিষ্ট পরিস্থিতিতে ব্যবহারিক যখন যুক্তিটি নিজেই ভিউতে আবদ্ধ করা যায়, অন্যথায় এটি একটি সম্পূর্ণ ভার্জোজ এবং ভার্চুয়াল বাক্য গঠন।
view = new View(this) {
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
super.onLayout(changed, l, t, r, b);
view.getHeight(); //height is ready
}
};
এছাড়াও মনে রাখবেন, যে লেআউটটিকে অনেকবার ডাকা হবে, সুতরাং পদ্ধতিতে আপনি কী করেন তা বিবেচনা করুন বা প্রথমবারের পরে আপনার কোডটি অক্ষম করুন be
৪. লেআউট পর্যায়ে গেছে কিনা তা পরীক্ষা করে দেখুন
ইউআই তৈরি করার সময় আপনার যদি এমন কোড রয়েছে যা একাধিকবার কার্যকর করছে আপনি নিম্নলিখিত সমর্থনটি v4 lib পদ্ধতিটি ব্যবহার করতে পারেন:
View viewYouNeedHeightFrom = ...
...
if(ViewCompat.isLaidOut(viewYouNeedHeightFrom)) {
viewYouNeedHeightFrom.getHeight();
}
উইন্ডোতে সর্বশেষ সংযুক্ত বা বিচ্ছিন্ন হওয়ার পরে ভিউটি কমপক্ষে একটি বিন্যাসের মধ্য দিয়ে চলেছেলে সত্য প্রত্যাবর্তন করে।
অতিরিক্ত: স্থিরভাবে সংজ্ঞায়িত পরিমাপ পাওয়া
যদি কেবল স্থিতিশীলভাবে সংজ্ঞায়িত উচ্চতা / প্রস্থ পাওয়ার পক্ষে যথেষ্ট হয় তবে আপনি এটি দিয়ে এটি করতে পারেন:
তবে মনে রাখবেন, অঙ্কনের পরে এটি প্রকৃত প্রস্থ / উচ্চতার চেয়ে আলাদা হতে পারে। জাভাডোক পার্থক্যটি পুরোপুরি বর্ণনা করে:
একটি দৃশ্যের আকার প্রস্থ এবং উচ্চতা দিয়ে প্রকাশ করা হয়। একটি দৃশ্য আসলে প্রস্থ এবং উচ্চতার মানগুলির দুটি জোড়া রাখে।
প্রথম জুটি পরিমাপ করা প্রস্থ এবং পরিমাপ করা উচ্চতা হিসাবে পরিচিত। এই মাত্রাগুলি সংজ্ঞা দেয় যে ভিউটি তার পিতামাতার মধ্যে কতটা বড় হতে চায় (আরও তথ্যের জন্য লেআউট দেখুন)
দ্বিতীয় জোড়টি কেবল প্রস্থ এবং উচ্চতা বা কখনও কখনও অঙ্কন প্রস্থ এবং অঙ্কনের উচ্চতা হিসাবে পরিচিত। এই মাত্রাগুলি স্ক্রিনে অঙ্কনের সময় এবং বিন্যাসের পরে দৃশ্যটির আসল আকারকে সংজ্ঞায়িত করে। এই মানগুলি পরিমাপ করা প্রস্থ এবং উচ্চতা থেকে আলাদা হতে পারে না। গেটউইথ () এবং গেটহাইট () কল করে প্রস্থ এবং উচ্চতা পাওয়া যাবে।