onMeasure()আপনার কাস্টম ভিউটি পিতামাতার দ্বারা সরবরাহিত বিন্যাসের সীমাবদ্ধতার উপর নির্ভরশীল হওয়া কতটা বড় চান তা অ্যান্ড্রয়েডকে বলার সুযোগ is এই লেআউটের সীমাবদ্ধতাগুলি কী তা শেখার জন্য আপনার কাস্টম ভিউয়ের সুযোগ (আপনি যদি কোনও match_parentপরিস্থিতির চেয়ে পরিস্থিতি থেকে আলাদা আচরণ করতে চান wrap_content)। এই সীমাবদ্ধতাগুলি MeasureSpecপদ্ধতিতে পাস হওয়া মানগুলিতে প্যাক করা হয় । এখানে মোডের মানগুলির মোটামুটি পারস্পরিক সম্পর্ক রয়েছে:
- অবিকল অর্থ
layout_widthবা layout_heightমানটি একটি নির্দিষ্ট মানকে সেট করা হয়েছিল। আপনার সম্ভবত এই দৃশ্যটি আপনার আকার করা উচিত। match_parentপ্যারেন্ট ভিউয়ের ঠিক আকার নির্ধারণ করতে (এটি ফ্রেমওয়ার্কের উপর নির্ভরশীল লেআউট) ব্যবহার করার সময় এটি ট্রিগারও পেতে পারে।
- AT_MOST সাধারণত অর্থ
layout_widthবা layout_heightমান সেট করা হয়েছিল match_parentবা wrap_contentযেখানে সর্বোচ্চ আকার প্রয়োজন (এটি ফ্রেমওয়ার্কের উপর নির্ভরশীল লেআউট), এবং প্যারেন্ট মাত্রার আকারটি মান is আপনার এই আকারের চেয়ে বড় হওয়া উচিত নয়।
- UNSPECIFIED এর অর্থ সাধারণত
layout_widthবা layout_heightমানটি wrap_contentকোনও সীমাবদ্ধতা ছাড়াই সেট করা হয়েছিল । আপনার পছন্দ মতো আকার হতে পারে। কিছু লেআউট এছাড়াও এই কলব্যাকটি ব্যবহার করে আপনার পছন্দসই আকারটি বের করার আগে আপনাকে কী দ্বিতীয় ধাপের অনুরোধে পুনরায় পাস করতে হবে তা নির্ধারণের আগে desired
চুক্তি যে বিদ্যমান onMeasure()যে setMeasuredDimension() হবে আকার সঙ্গে শেষে বলা যেতে আপনি দৃশ্য হতে চাই। এই পদ্ধতিটি সমস্ত ফ্রেমওয়ার্ক বাস্তবায়নের সাথে ডাকা হয়, এতে পাওয়া ডিফল্ট বাস্তবায়নও অন্তর্ভুক্ত থাকে View, এজন্য এটি superযদি আপনার ব্যবহারের ক্ষেত্রে ফিট করে তবে পরিবর্তে কল করা নিরাপদ ।
মঞ্জুর, কারণ কাঠামোটি একটি ডিফল্ট বাস্তবায়ন প্রয়োগ করে, আপনার পক্ষে এই পদ্ধতিটি ওভাররাইড করা প্রয়োজন হতে পারে না, তবে আপনি যদি না করেন তবে দৃশ্য স্থানটি আপনার সামগ্রীর চেয়ে কম ছোট হবে এবং আপনি যদি নিজের জায়গাটি রেখে দেন তবে আপনি ক্লিপিং দেখতে পাবেন your wrap_contentউভয় দিকের সাথে কাস্টম ভিউ , আপনার দৃষ্টিভঙ্গিটি সম্ভবত প্রদর্শিত হবে না কারণ কাঠামোটি এটি কত বড় তা জানে না!
সাধারণত, আপনি যদি ওভাররাইডিং করে থাকেন Viewএবং অন্য বিদ্যমান উইজেট না হন তবে এটি বাস্তবায়ন দেওয়ার পক্ষে সম্ভবত এটি ভাল ধারণা, যদিও এটি এর মতো কিছু সাধারণ হিসাবে সহজ:
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int desiredWidth = 100;
int desiredHeight = 100;
int widthMode = MeasureSpec.getMode(widthMeasureSpec);
int widthSize = MeasureSpec.getSize(widthMeasureSpec);
int heightMode = MeasureSpec.getMode(heightMeasureSpec);
int heightSize = MeasureSpec.getSize(heightMeasureSpec);
int width;
int height;
//Measure Width
if (widthMode == MeasureSpec.EXACTLY) {
//Must be this size
width = widthSize;
} else if (widthMode == MeasureSpec.AT_MOST) {
//Can't be bigger than...
width = Math.min(desiredWidth, widthSize);
} else {
//Be whatever you want
width = desiredWidth;
}
//Measure Height
if (heightMode == MeasureSpec.EXACTLY) {
//Must be this size
height = heightSize;
} else if (heightMode == MeasureSpec.AT_MOST) {
//Can't be bigger than...
height = Math.min(desiredHeight, heightSize);
} else {
//Be whatever you want
height = desiredHeight;
}
//MUST CALL THIS
setMeasuredDimension(width, height);
}
আশা করি এইটি কাজ করবে.