2016-06-29 12 views
12

वर्तमान में, मैं निम्नलिखित कोड का उपयोग कर एक टुकड़ा जोड़ रहा हूं।एंड्रॉइड - कस्टम आयामों के साथ खंड जोड़ें

private void addFragment(Fragment fragment, String fragmentName) { 
    Log.i("Adder", "Adding fragment " + fragmentName); 
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
    fragmentTransaction.add(R.id.fragment_container, fragment, fragmentName); 
    fragmentTransaction.commit(); 
} 

निम्नलिखित कोड जोड़ा गया टुकड़ा का आकार बदलने के लिए है।

private boolean readjustFragment(Fragment fragmentToBeAdjusted, FragmentCoordinates fragmentCoordinates) { 
    if (fragmentToBeAdjusted != null) { 
     View view = fragmentToBeAdjusted.getView(); 
     RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(fragmentCoordinates.getWidth(), fragmentCoordinates.getHeight()); 
     params.leftMargin = fragmentCoordinates.getX0(); 
     params.bottomMargin = fragmentCoordinates.getY0(); 
     view.setLayoutParams(params); 
     view.requestLayout(); 
     return true; 
    } 
    return false; 
} 

लेकिन बजाय जोड़ने और फिर आकार बदलने के, मैं कैसे कस्टम आयामों (ऊंचाई, चौड़ाई और मार्जिन) के साथ एक टुकड़ा जोड़ सकता हूँ?

उत्तर

6

आप कर सकते हैं, जबकि उदाहरण के लिए दृश्य

बढ़ा-चढ़ाकर अगर आप कंटेनर के रूप में फ्रेम लेआउट का उपयोग कर रहे हैं टुकड़े तो नया उदाहरण विधि

साथ मान प्रदान करने के लिए वांछित चौड़ाई, ऊंचाई और मार्जिन खंड और कहा कि मान देना पारित
/** 
     * 
     * @param widthInDP 
     * @param heightinDP 
     * @param leftMarginDp 
     * @param topMarginDp 
     * @param rightMarginDp 
     * @param bottomMarginDp 
     * @param fragIndex 
     * @return 
     */ 
     public static PlaceholderFragment newInstance(int widthInDP, 
       int heightinDP, int leftMarginDp, int topMarginDp, 
       int rightMarginDp, int bottomMarginDp, int fragIndex) { 
      PlaceholderFragment resizableFragment = new PlaceholderFragment(); 

      Bundle args = new Bundle(); 

      // Test purpose Only 
      args.putInt(INDEX, fragIndex); 

      // Set Width Height dynamically 
      args.putInt(WIDTH, widthInDP); 
      args.putInt(HEIGHT, heightinDP); 

      // SetMargin 
      args.putInt(LEFT_MARGIN, leftMarginDp); 
      args.putInt(RIGHT_MARGIN, rightMarginDp); 
      args.putInt(TOP_MARGIN, topMarginDp); 
      args.putInt(BOTTOM_MARGIN, bottomMarginDp); 
      resizableFragment.setArguments(args); 

      return resizableFragment; 
     } 

और फिर उन्हें onCreateView विधि में लागू करें। यहां ध्यान दें कि यदि आप फ्रेम लेआउट का उपयोग टुकड़ों के लिए कंटेनर के रूप में कर रहे हैं तो FrameLayout परम का उपयोग करें, अन्यथा आपको अपवाद मिलेगा।

FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) rootView 
      .getLayoutParams(); 

    // set width height 
    params.height = dpToPx(getArguments().getInt(HEIGHT)); 
    params.width = dpToPx(getArguments().getInt(WIDTH)); 

    // substitute 
    // parameters for left,top, right, bottom 
    params.setMargins(dpToPx(getArguments().getInt(LEFT_MARGIN)), 
      dpToPx(getArguments().getInt(TOP_MARGIN)), 
      dpToPx(getArguments().getInt(RIGHT_MARGIN)), 
      dpToPx(getArguments().getInt(BOTTOM_MARGIN))); 
    rootView.setLayoutParams(params); 

आउटपुट: -

ऑरेंज पृष्ठभूमि मेरी Frame layout कंटेनर है और अन्य सभी एक ही कंटेनर में कस्टम मार्जिन के साथ Fragments बदला गया है। तुम भी उन्हें

enter image description here

पूरा कोड मैं नमूना में इस्तेमाल किया पर छोड़ दिया सही, ऊपर, नीचे, केंद्र, bottom- सेंटर, शीर्ष केंद्र और इतने जाना बनाने के लिए LayoutParam.Gravity संपत्ति के साथ चारों ओर खेल सकते हैं

package com.example.fragment; 

    import android.annotation.TargetApi; 
    import android.graphics.Color; 
    import android.os.Build; 
    import android.os.Bundle; 
    import android.support.v4.app.Fragment; 
    import android.support.v4.app.FragmentActivity; 
    import android.util.DisplayMetrics; 
    import android.view.LayoutInflater; 
    import android.view.View; 
    import android.view.ViewGroup; 
    import android.widget.FrameLayout; 
    import android.widget.TextView; 

    public class MainActivity extends FragmentActivity { 

     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_main); 
      if (savedInstanceState == null) { 
       getSupportFragmentManager() 
         .beginTransaction() 
         .add(R.id.container, 
           PlaceholderFragment.newInstance(400, 400, 50, 50, 
             50, 50, 1)).commit(); 

       getSupportFragmentManager() 
         .beginTransaction() 
         .add(R.id.container, 
           PlaceholderFragment.newInstance(300, 300, 30, 30, 
             30, 30, 2)).commit(); 

       getSupportFragmentManager() 
         .beginTransaction() 
         .add(R.id.container, 
           PlaceholderFragment.newInstance(200, 200, 20, 20, 
             20, 20, 3)).commit(); 

       getSupportFragmentManager() 
         .beginTransaction() 
         .add(R.id.container, 
           PlaceholderFragment.newInstance(100, 100, 10, 10, 
             10, 10, 4)).commit(); 
      } 
     } 

     /** 
     * A placeholder fragment containing a simple view. 
     */ 
     @TargetApi(Build.VERSION_CODES.HONEYCOMB) 
     public static class PlaceholderFragment extends Fragment { 

      private static final String HEIGHT = "Height"; 
      private static final String WIDTH = "Width"; 
      private static final String LEFT_MARGIN = "left"; 
      private static final String RIGHT_MARGIN = "right"; 
      private static final String TOP_MARGIN = "top"; 
      private static final String BOTTOM_MARGIN = "bottom"; 

      // Test Data 
      private static final String INDEX = "FragNumber"; 

      /** 
      * 
      * @param widthInDP 
      * @param heightinDP 
      * @param leftMarginDp 
      * @param topMarginDp 
      * @param rightMarginDp 
      * @param bottomMarginDp 
      * @param fragIndex 
      * @return 
      */ 
      public static PlaceholderFragment newInstance(int widthInDP, 
        int heightinDP, int leftMarginDp, int topMarginDp, 
        int rightMarginDp, int bottomMarginDp, int fragIndex) { 
       PlaceholderFragment resizableFragment = new PlaceholderFragment(); 

       Bundle args = new Bundle(); 

       // Test purpose Only 
       args.putInt(INDEX, fragIndex); 

       // Set Width Height dynamically 
       args.putInt(WIDTH, widthInDP); 
       args.putInt(HEIGHT, heightinDP); 

       // SetMargin 
       args.putInt(LEFT_MARGIN, leftMarginDp); 
       args.putInt(RIGHT_MARGIN, rightMarginDp); 
       args.putInt(TOP_MARGIN, topMarginDp); 
       args.putInt(BOTTOM_MARGIN, bottomMarginDp); 
       resizableFragment.setArguments(args); 

       return resizableFragment; 
      } 

      public PlaceholderFragment() { 
      } 

      public int dpToPx(int dp) { 
       DisplayMetrics displayMetrics = getActivity().getResources() 
         .getDisplayMetrics(); 
       int px = Math.round(dp 
         * (displayMetrics.xdpi/DisplayMetrics.DENSITY_DEFAULT)); 
       return px; 
      } 

      @Override 
      public View onCreateView(LayoutInflater inflater, ViewGroup container, 
        Bundle savedInstanceState) { 

       View rootView = inflater.inflate(R.layout.fragment_main, container, 
         false); 

       FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) rootView 
         .getLayoutParams(); 

       // set width height 
       params.height = dpToPx(getArguments().getInt(HEIGHT)); 
       params.width = dpToPx(getArguments().getInt(WIDTH)); 

       // substitute 
       // parameters for left,top, right, bottom 
       params.setMargins(dpToPx(getArguments().getInt(LEFT_MARGIN)), 
         dpToPx(getArguments().getInt(TOP_MARGIN)), 
         dpToPx(getArguments().getInt(RIGHT_MARGIN)), 
         dpToPx(getArguments().getInt(BOTTOM_MARGIN))); 
       rootView.setLayoutParams(params); 

       // Test purpose Only 
       switch (getArguments().getInt(INDEX)) { 
       case 1: 
        rootView.setBackgroundColor(Color.MAGENTA); 

        ((TextView) rootView.findViewById(R.id.frag_index)) 
          .setText("Fragment # " + getArguments().getInt(INDEX)); 

        break; 

       case 2: 
        rootView.setBackgroundColor(Color.GREEN); 

        ((TextView) rootView.findViewById(R.id.frag_index)) 
          .setText("Fragment # " + getArguments().getInt(INDEX)); 

        break; 

       case 3: 
        rootView.setBackgroundColor(Color.BLUE); 

        ((TextView) rootView.findViewById(R.id.frag_index)) 
          .setText("Fragment # " + getArguments().getInt(INDEX)); 

        break; 

       default: 
        rootView.setBackgroundColor(Color.WHITE); 

        ((TextView) rootView.findViewById(R.id.frag_index)) 
          .setText("Fragment # " + getArguments().getInt(INDEX)); 

        break; 
       } 

       return rootView; 
      } 
     } 
    } 

तो तकनीकी रूप से यह करने योग्य है लेकिन मुझे समझ में नहीं आया कि आप ऐसा करने का प्रयास क्यों कर रहे हैं?

+2

मैंने अभी इस समाधान को मुद्रित किया है =) भूलें, लेआउट पैराम्स में आपके कंटेनर का प्रकार होना चाहिए। – Alexander

+0

मान लीजिए कि मैं सही दिशा में इंगित कर रहा हूं। –

+0

हां यह अच्छा समाधान है। लेकिन मैंने नए इंस्टेंस के बजाय बिल्डर का इस्तेमाल किया। – Alexander

-1

आप अपने मामले में कंटेनर व्यू, R.id.fragment_container पर आयाम सेट कर सकते हैं, और टुकड़े को सभी उपलब्ध स्थान ले जाने दें।

+0

मुझे कंटेनर को कई टुकड़े रखने में सक्षम होने की आवश्यकता है। जब टुकड़ा आकार बदलना संभव है, तो मैं समय जोड़ने के दौरान आकार क्यों निर्धारित नहीं कर सकता? – jay

2

आप टुकड़ा के onCreateView में LayoutParams निर्दिष्ट करते समय, इस तरह से यह कर सकते हैं -

public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
    View v = inflater.inflate(R.layout.so_demo_frag,container,false); 
    RelativeLayout.LayoutParams p = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 400); 
    v.setLayoutParams(p); 
    return v; 
} 
1

क्यों ना आप अपना ViewGroup बनाने की कोशिश करने के लिए नहीं? यह ViewGroup ज़िम्मेदारी है Layout() और उसके आकार onMeasure() में बच्चों की स्थिति समायोजित करने के लिए। बस आवश्यक दृश्य समूह का विस्तार करें और तर्क और बाधाओं के साथ विधियों को ओवरराइड करें।

2
Just add it with framelayout in your mainActvity and add your fragment like this: 

     <FrameLayout 
      android:id="@+id/playfragment" 
      android:layout_width="match_parent" 
      android:layout_height="30dp" /> 


FragmentPlay frg2 = new FragmentPlay();//create the fragment instance for the top fragment 
     FragmentManager manager = getSupportFragmentManager();//create an instance of fragment manager 
     FragmentTransaction transaction = manager.beginTransaction();//create an instance of Fragment-transaction 
     transaction.add(R.id.playfragment, frg2, "Frag_Top_tag"); 
     transaction.commit(); 
+0

मैंने एक नया टुकड़ा जोड़ने के लिए बिल्कुल वही किया है, लेकिन मुझे गतिशील रूप से खंड के आयामों को सेट करने के लिए एक तरीका चाहिए। हितेश का समाधान इसे हासिल करने का एक अच्छा तरीका था। – jay

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