8

मैं वर्तमान में एक टैबलेट ऐप विकसित कर रहा हूं जो ViewPager विजेट का तीव्रता से उपयोग करता है। मुझे एक बार स्क्रीन पर एकाधिक व्यूपरर्स भी मिलते हैं।मेरे सभी दृश्यों को लेआउट से एंड्रॉइड रोकें

अब मुझे निम्न समस्या का सामना करना पड़ रहा है: यदि कोई व्यूपेजर अगले/पिछले पृष्ठ पर स्क्रॉल करता है, तो (निश्चित रूप से) को इसके लेआउट को फिर से समझना होगा और दृश्य जोड़ना/निकालना होगा। मैंने देखा कि requestLayout दृश्य पदानुक्रम के शीर्ष तक सीधे कॉल करता है, इसलिए टैबलेट स्क्रीन पर मेरे दृश्यों के सभी को अमान्य कर रहा है (जो बहुत हैं!)। यह बहुत महंगा है

मेरा प्रश्न यह है: वहाँ ViewPager जो प्रारंभिक लेआउट करता है के चारों ओर एक फ्रेम लागू करने के लिए एक संभावना है और फिर लेआउट अनुरोध अप का प्रचार नहीं करता है दृश्य पदानुक्रम के रूप में मुझे पता है कि प्रारंभिक लेआउट के बाद, फ्रेम एक ही आकार रहता है और नहीं बदलेगा।

मैं निम्नलिखित फ्रेम के साथ आया, लेकिन यह काफी अच्छा काम नहीं करता है, क्योंकि यह 100% समय पर काम नहीं करता है।

public class MyFrame extends FrameLayout 
{ 
    // VARIABLE CONTROLLING THE DISPATCH OF THE LAYOUT 
    // REQUEST UP THE VIEW HIERARCHY 
    private boolean doLayout = true; 

    public MyFrame(Context context) 
    { 
     super(context); 
     doLayout = true; 
    } 

    @Override 
    public void requestLayout() 
    { 
     if (doLayout) // DO THE LAYOUT REQUEST UP TO THE TOP 
      super.requestLayout(); 
     else 
     { 
      // JUST MEASURE MYSELF AND MY CHILDREN 
      measure(MeasureSpec.getMode(MeasureSpec.AT_MOST), 
      MeasureSpec.getMode(MeasureSpec.AT_MOST)); 
      layout(getLeft(), getTop(), getRight(), getBottom()); 
     } 
     doLayout = false; 
    } 
} 

किसी भी सलाह के लिए धन्यवाद!

उत्तर

0

मैं वास्तव में चाहता हूं कि मैं आपको बता सकूं कि एक बेहतर तरीका था, लेकिन मुझे नहीं लगता कि वहां है। यदि व्यूपैगर वास्तव में विचार जोड़ रहा/हटा रहा है, तो आपका लेआउट लगातार ट्रैश हो जाएगा, भले ही यह नहीं हो, यह हो सकता है। यह एक आलसी धारणा है कि सामग्री बदल सकती है (इस प्रकार ऊपर की ओर अमान्य हो रही है), और यह उन कुछ धारणाओं को दूर करने के लिए हमारे कठिन कार्यक्रमों तक है।

यदि आप आश्वस्त कर सकते हैं कि फ़्रेमलाउट की सीमा कभी नहीं बदलेगी, तो ओवर-राइटिंग अनुरोध में कोई नुकसान नहीं है।

4

मुझे पता है कि सवाल थोड़ा पुराना है, लेकिन मेरा जवाब किसी और को आपकी प्रश्न के रूप में मदद कर सकता है और कॉलिन के जवाब ने मेरी मदद की।

मेरे पास वही समस्या है जैसा आप करते हैं। और इसके लिए दो समाधान हैं। सबसे पहले आपको यह सुनिश्चित करने की ज़रूरत है कि आपके व्यूपेजर के पास * लेआउट_विड्थ * और * लेआउट_हेइट * * match_parent * पर सेट है, और यह दृश्य हाइरेरिसी इस तरह से व्यवस्थित किया जाता है कि एंड्रॉइड इस निष्कर्ष पर नहीं आ जाएगा कि इसे फिर से लेआउट की आवश्यकता है ViewPager पैरेंट लेआउट में से कोई भी। उदाहरण के लिए, कहें कि आपके पास एक रिलेवेटलाइट है जिसमें निश्चित आकार के दो दृश्य एक दूसरे के नीचे हैं और दूसरे दृश्य के नीचे एक व्यूपर है। इस मामले में ViewPager में कोई भी परिवर्तन पैरेंट लेआउट के लिए प्रचारित होगा। हालांकि, यदि आप उन दो निश्चित आकार के दृश्यों और व्यूपार्जर को लाइनरलाउट में डालते हैं तो ऐसा नहीं होगा, व्यूपेजर से परे कोई लेआउट अनुरोध प्रचारित नहीं होगा। क्या बेहतर है, एक ViewPager पेज पर लेआउट अनुरोध अन्य पृष्ठों पर प्रचारित नहीं किया जाएगा।

दूसरा समाधान (वास्तव में यह समाधान के दूसरे भाग में अधिक है) अपने FrameLayout है, लेकिन इस तरह संशोधित:

public class LayoutStopperFrameLayout extends FrameLayout { 

    private boolean doLayout; 

    public LayoutStopperFrameLayout(Context context) { 
     super(context); 
     doLayout = true; 
    } 

    public LayoutStopperFrameLayout(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     doLayout = true; 
    } 

    public LayoutStopperFrameLayout(Context context, AttributeSet attrs, 
      int defStyle) { 
     super(context, attrs, defStyle); 
     doLayout = true; 
    } 

    public void setPropagateRequestLayout(boolean doLayout) { 
     this.doLayout = doLayout; 
    } 

    @Override 
    public void requestLayout() { 
     if (doLayout) { 
      // DO THE LAYOUT REQUEST UP TO THE TOP 
      super.requestLayout(); 
     } 
    } 
} 

अपने आवेदन में मैं टुकड़ा onStart में setPropagateRequestLayout() और के लिए onStop तरीकों कॉल लेआउट अनुरोध क्रमशः बंद और क्रमशः बारी बारी से।

संबंधित मुद्दे