7

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

मैं समर्थन पुस्तकालय खंडों का उपयोग कर रहा हूं। मैं समर्थन पुस्तकालय GridLayout उपयोग नहीं कर रहा है कि अगर एक फर्क नहीं पड़ता

प्रासंगिक कोड और xml इस प्रकार है:

GridLayout एक्सएमएल:

<?xml version="1.0" encoding="utf-8"?> 
<merge xmlns:android="http://schemas.android.com/apk/res/android"> 
    <ScrollView 
     android:id="@+id/grid_scroll" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_above="@+id/bottom_fragment" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentTop="true" 
     android:layout_marginRight="8dp" 
     android:layout_marginTop="?android:attr/actionBarSize" 
     android:overScrollMode="ifContentScrolls" > 

     <GridLayout 
      android:id="@+id/grid" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:alignmentMode="alignMargins" 
      android:animateLayoutChanges="true" 
      android:columnCount="3" 
      android:columnOrderPreserved="true" 
      android:orientation="horizontal" 
      android:overScrollMode="ifContentScrolls" 
      android:rowOrderPreserved="true" > 
     </GridLayout> 
    </ScrollView> 
</merge> 

एक टुकड़ा एक्सएमएल

का उदाहरण
<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="200dp" 
    android:layout_height="100dp" 
    android:alpha="1" > 

    <Button 
     android:id="@+id/button1" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:alpha="1.0" /> 
</RelativeLayout> 

फ्रैगमेंट ऑनक्र eateView() विधि

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    super.onCreateView(inflater, container, savedInstanceState); 
    View view; 
    GridLayout.Spec rowSpec = GridLayout.spec(mRowStart, mRowSpan); 
    GridLayout.Spec columnSpec; 
    GridLayout.LayoutParams childParams; 
    if (large) {; 
     view = inflater.inflate(R.layout.my_place_large, container, false); 
     columnSpec = GridLayout.spec(mColumnStart, 2); 
     childParams = new GridLayout.LayoutParams(rowSpec, columnSpec); 
     //childParams.width = 200; //If I do this everything works regardless of the layout size 
    } else { 
     view = inflater.inflate(R.layout.my_place_small, container, false); 
     columnSpec = GridLayout.spec(mColumnStart, 1); 
     childParams = new GridLayout.LayoutParams(rowSpec, columnSpec); 
     //childParams.width = 100; //If I do this everything works regardless of the layout size 
    } 
    childParams.setMargins(0, 0, 0, 0); 
    //childParams.height = 100; //If I do this everything works regardless of the layout size 
    view.setLayoutParams(childParams); 
    view.setId(ID); 
    return view; 
} 

लेआउट

private void populateGrid() { 
    RelativeLayout gridParent = (RelativeLayout) mParentActivity.findViewById(R.id.locations); 
    mLocationsGrid = (GridLayout) gridParent.findViewById(R.id.grid); 
    nColumns = mLocationsGrid.getColumnCount(); 
    mAdapter = new MyAdapter(mContext, this, mResolver); //This is how I keep track of the various fragments depending on my app's state 
    int nCards = mAdapter.getNumberOfCards(); 
    FragmentManager fragmentManager = mParentActivity.getSupportFragmentManager(); 
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
    for (int i = 0; i < nCards; ++i) { 
     fragmentTransaction.add(mLocationsGrid.getId(), mAdapter.getFragmentAtIndex(i), String.valueOf(i)); 
    } 
    fragmentTransaction.commit(); 
    mPopulated = true; 
} 

के टुकड़े जोड़ें मुझे लगता है कि यह कवर करना चाहिए। बस दोहराते हैं, अगर मैं लाइनों जो स्पष्ट onCreateView() में आयाम सेट uncomment, वे GridLayout में ठीक से तो मैं सब कुछ है कि टुकड़े और इस तरह के कार्यों का ट्रैक रखता है पता है, के रूप में टुकड़ा लेन-देन करता दिखाई देते हैं। मुद्दा तब आता है जब मैं खंड के xml में आकार को आज़माता और निर्दिष्ट करता हूं, इस मामले में मुझे एक खाली स्क्रीन मिलती है।

आप विचार, सुझाव और संगीत की सराहना की जाती है। धन्यवाद, जेरेड

उत्तर

6

यह बहुत देर हो रहा है, लेकिन ऑफ मौके में यह अभी भी उपयोग में हो सकता है। समस्या यह है कि जब आप गतिशील रूप से नए लेआउट पैराम्स सेट करते हैं तो आप XML लेआउट पैरामीटर को ओवरराइड कर रहे हैं। आईई, जब आप कार्य करें:

view.setLayoutParams(childParams); 

यह XMLs मूल ऊंचाई और चौड़ाई सेटिंग मिटा देगा। सिर्फ इसलिए कि आप बच्चे को छोड़ रहे हैं पैराम चौड़ाई/ऊंचाई कोड में रिक्त नहीं है इसका मतलब यह नहीं है कि कोई मान सेट नहीं है। ग्रिडलाउट के मामले में, वे undefined पर सेट हैं।

फ़िक्स पहले दृश्य की मौजूदा लेआउटपैम की ऊंचाई/चौड़ाई को सहेजने के लिए होगा और नए लेआउटपैम को गतिशील रूप से बनाते समय इसका उपयोग करें। उदाहरण:

if (large) {; 
    view = inflater.inflate(R.layout.my_place_large, container, false); 
    ViewGroup.LayoutParams oldParams = view.getLayoutParams(); 
    columnSpec = GridLayout.spec(mColumnStart, 2); 
    childParams = new GridLayout.LayoutParams(rowSpec, columnSpec); 
    childParams.width = oldParams.width; 
} 

इससे आपको कोड में पंक्ति/कॉल चश्मा लगाने के दौरान एक्सएमएल में चौड़ाई/ऊंचाई रखने की अनुमति मिल जाएगी।

+1

इस तथ्य को हम क्या किया है। मैं आपको चयनित उत्तर दूंगा हालांकि यद्यपि आपने इसे लिखने के लिए समय निकाला है, और स्पष्ट रूप से। – Jared