मैं भी इस समस्या में भाग गया, लेकिन मेरे मामले में मेरे पास एक FragmentPagerAdapter
आपूर्ति थीViewPager
इसके पृष्ठों साथ । समस्या मैं था कि था onMeasure()
की ViewPager
में से किसी से पहले कहा जाता थाFragments
निर्मित किया गया था (और इसलिए कर सकते थे नहीं आकार में ही सही ढंग से)।
थोड़ा परीक्षण और त्रुटि के बाद, मैंने पाया कि finishUpdate()
FragmentPagerAdapter की विधि Fragments
को आरंभिक रूप से शुरू करने के बाद कहा जाता है ( instantiateItem()
में सेFragmentPagerAdapter
), और भी के बाद / पेज स्क्रॉल के दौरान। मैंने एक छोटा इंटरफ़ेस बनाया:
public interface AdapterFinishUpdateCallbacks
{
void onFinishUpdate();
}
जो मैं अपने में गुजारता हूँ FragmentPagerAdapter
और कॉल करता :
@Override
public void finishUpdate(ViewGroup container)
{
super.finishUpdate(container);
if (this.listener != null)
{
this.listener.onFinishUpdate();
}
}
जो बदले में मुझे setVariableHeight()
अपने CustomViewPager
कार्यान्वयन पर कॉल करने की अनुमति देता है :
public void setVariableHeight()
{
// super.measure() calls finishUpdate() in adapter, so need this to stop infinite loop
if (!this.isSettingHeight)
{
this.isSettingHeight = true;
int maxChildHeight = 0;
int widthMeasureSpec = MeasureSpec.makeMeasureSpec(getMeasuredWidth(), MeasureSpec.EXACTLY);
for (int i = 0; i < getChildCount(); i++)
{
View child = getChildAt(i);
child.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(ViewGroup.LayoutParams.WRAP_CONTENT, MeasureSpec.UNSPECIFIED));
maxChildHeight = child.getMeasuredHeight() > maxChildHeight ? child.getMeasuredHeight() : maxChildHeight;
}
int height = maxChildHeight + getPaddingTop() + getPaddingBottom();
int heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);
super.measure(widthMeasureSpec, heightMeasureSpec);
requestLayout();
this.isSettingHeight = false;
}
}
मुझे यकीन नहीं है कि यह सबसे अच्छा तरीका है, अगर आपको लगता है कि यह अच्छा / बुरा / बुरा है, तो टिप्पणी पसंद आएगी, लेकिन यह मेरे कार्यान्वयन में बहुत अच्छा काम कर रहा है :)
उम्मीद है कि इससे वहां किसी को मदद मिलेगी!
संपादित करें: मैं requestLayout()
कॉल करने के बाद जोड़ना भूल गया super.measure()
(अन्यथा यह दृश्य को फिर से नहीं बनाता है)।
मैं माता-पिता की गद्दी को अंतिम ऊंचाई तक जोड़ना भी भूल गया।
मैं भी आवश्यक रूप से एक नया बनाने के पक्ष में मूल चौड़ाई / ऊँचाई को मापता हूँ। तदनुसार कोड अपडेट किया है।
एक अन्य समस्या मैं था कि यह अपने आप में एक में सही ढंग से आकार नहीं होता था ScrollView
और पाया अपराधी के साथ बच्चे को मापने था MeasureSpec.EXACTLY
बजायMeasureSpec.UNSPECIFIED
। इसे प्रतिबिंबित करने के लिए अद्यतन किया गया।
इन परिवर्तनों को कोड में जोड़ा गया है। आप चाहें तो पुराने (गलत) संस्करणों को देखने के लिए इतिहास की जांच कर सकते हैं।