लेआउट_गैविटी प्रोग्रामेटिक रूप से कैसे सेट करें?


334

मेरा प्रश्न सरल है,

मेरे बटन लेआउट_गैविटी को प्रोग्रामेटिक रूप से कैसे सेट करें?

मैंने इसे इंटरनेट पर पाया, लेकिन यह केवल मुझे एक नलपॉइंट अपवाद फेंकता है:

 Button MyButton = new Button(this);

    LinearLayout.LayoutParams  lllp=(LinearLayout.LayoutParams)MyButton.getLayoutParams();
    lllp.gravity=Gravity.RIGHT;
    MyButton.setLayoutParams(lllp); 


    MyLinearLayout.addView(MyButton);

कोई भी समाधान?


मेरा मानना ​​है कि इससे पहले कि आप इसे ले सकते हैं लेआउटपाराम्स के पास अपने अभिभावक के लिए दृश्य जोड़ने की आवश्यकता है जो शून्य नहीं हैं।
रिच मोरी

जवाबों:


545

जावा

LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT);
params.weight = 1.0f;
params.gravity = Gravity.TOP;

button.setLayoutParams(params);

Kotlin

val params = LinearLayout.LayoutParams(
    LinearLayout.LayoutParams.WRAP_CONTENT,
    LinearLayout.LayoutParams.WRAP_CONTENT
).apply {
    weight = 1.0f
    gravity = Gravity.TOP
}

गुरुत्वाकर्षण मूल्यों के लिए और सेट गुरुत्वाकर्षण की जांच करने के लिए कैसे गुरुत्वाकर्षण

मूल रूप से, आपको LayoutParamsमाता-पिता के आधार पर चयन करना चाहिए । यह हो सकता है RelativeLayout, LinearLayoutआदि ...


1
कुछ कारणों से params.gravity = 80 (यह डॉक्स होना चाहिए, टी डॉक्स द्वारा) बस काम नहीं कर रहा है। मुझे व्यू और टेक्स्ट के नीचे कुछ स्पेस मिला। इसका इतना नीचे-संरेखित नहीं ...
एडम वराहेगी

51
प्रलेखन से निरंतर मूल्य लेना बस गलत है, कृपया गुरुत्वाकर्षण का उपयोग करें। टीओपी
मैराग्यूस

35
यह "गुरुत्वाकर्षण" है और उसने "लेआउट_ग्रेविटी" के लिए कहा है ??
एम। उस्मान खान

10
@usman नहीं, यह layout_gravity(के बारे में LayoutParams.gravity) है। gravityहोगाbutton.setGravity()
Floern

8
एसओ पर यहां गुरुत्वाकर्षण और लेआउट_ग्रेविटी के बारे में बहुत गलत जानकारी है। कई पीपीएल को लगता है कि setGravity()लेआउट_ग्रेविटी है, लेकिन यह गलत है। मैं यह स्वीकार कर सकता हूं कि यह उत्तर लेआउट_गैविटी प्रोग्रामेटिक रूप से सेट करने के लिए सही है।
बेवर

55

मुझे पुराने धागों को फिर से जीवित करने से नफरत होगी लेकिन यह एक ऐसी समस्या है जिसका सही उत्तर नहीं दिया गया है और इसके अलावा मैं खुद इस समस्या में भाग गया हूं।

यहां लंबा सा है, यदि आप केवल उत्तर में रुचि रखते हैं तो कृपया नीचे दिए गए सभी कोड को स्क्रॉल करें:

एंड्रॉइड: गुरुत्वाकर्षण और एंड्रॉइड: लेआउट_ ग्रेविटी अलग तरीके से काम करती है। यहाँ मैंने एक लेख पढ़ा है जिसने मेरी मदद की है।

लेख का GIST: ऊंचाई / चौड़ाई असाइन किए जाने के बाद गुरुत्वाकर्षण प्रभावित करता है। इसलिए गुरुत्वाकर्षण केंद्र एक दृश्य को प्रभावित नहीं करेगा जो FILL_PARENT किया गया है (इसे ऑटो मार्जिन के रूप में सोचें)। लेआउट_ग्रेविटी सेंटर उस दृश्य को प्रभावित करेगा जो FILL_PARENT है (इसे ऑटो पैड के रूप में सोचें)।

मूल रूप से, एंड्रॉइड: लेआउट_गैविटी कैनोनेट को प्रोग्रामेटिक रूप से एक्सेस किया जा सकता है, केवल एंड्रॉइड: ग्रेविटी। ओपी के मामले और मेरे मामले में, स्वीकृत उत्तर बटन को लंबवत केंद्र में नहीं रखता है।

कार्ति के जवाब में सुधार करने के लिए:

LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
params.gravity = Gravity.CENTER;
button.setLayoutParams(params);

से लिंक करें LinearLayout.LayoutParams

एंड्रॉइड: लेआउट_गैविटी दिखाता है "कोई संबंधित तरीके" अर्थ प्रोग्राम तक नहीं पहुंच सकते हैं। जबकि गुरुत्वाकर्षण वर्ग में एक क्षेत्र है।


साथ ही रैखिक गुरुत्वाकर्षण माता-पिता के अभिविन्यास के आधार पर उस गुरुत्वाकर्षण ऑटो-मार्जिन (बेहतर अवधि के अभाव में) को जोड़ने के लिए। प्रदान किया गया लेख लिंक मदद करेगा।
उक्रेन

21
MyButton.setGravity(Gravity.RIGHT);

लेआउट_ग्रेविटी के लिए "कार्ति" द्वारा बताए गए उत्तर का उपयोग करें। यह विधि बच्चों को दृश्य के अंदर रखने के लिए गुरुत्वाकर्षण निर्धारित करती है।


37
यह सिर्फ गुरुत्वाकर्षण है, लेआउट_ग्रेविटी नहीं।
एडम वराहेगी

ठीक है तो मुझे बताएं कि अगर लेआउट_ ग्रेविटी सेटगैविटी के बराबर है, तो मैं गुरुत्वाकर्षण कैसे सेट करूं?
एडम वारहेजि


5
एक विशाल दस्तावेज पोस्ट करना
खेदजनक

लिंक में ग्रेविटी विधि की तलाश करें .., किसी भी तरह सटीक पद्धति पर पुनर्निर्देशन काम नहीं कर रहा है ..
यशवंत कुमार

17

मुझे GridLayout में बटन पर लेआउट_ग्रेविटी प्रोग्रामेटिकली सेट करने की समस्या थी।

बटन लेआउट पर गुरुत्वाकर्षण सेट करने के लिए चाल थी। एफ़टर के बाद बटन को माता-पिता (ग्रिडलाइउट) में जोड़ा गया था, अन्यथा गुरुत्वाकर्षण की अनदेखी की जाएगी

grid.addView(button)
((GridLayout.LayoutParams)button.getLayoutParams()).setGravity(int)

मैं पूरे ग्रिडलाइउट के लिए लेआउट_गैविटी को कैसे बदलूं?
इकबाल

15

यदि आप layou_gravityमौजूदा दृश्य को बदलना चाहते हैं तो ऐसा करें:

((FrameLayout.LayoutParams) view.getLayoutParams()).gravity = Gravity.BOTTOM;

याद रखें LayoutParamsकि लेआउट के आधार पर सही का उपयोग करें ।

LinearLayout.LayoutParams

12
layoutParams2.gravity = Gravity.RIGHT|Gravity.BOTTOM;

एक से अधिक गुरुत्वाकर्षण को जोड़ने के लिए इसका उपयोग करें


9

यह सवाल पुराना है लेकिन मुझे बस यही समस्या थी और इसे इस तरह हल किया

LayoutParams lay = new LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT)
lay.gravity = Gravity.CENTER;

@Muzikant .. ठीक .. मैं पहली बार देखा फ्लॉप .. लेकिन अब इसकी me..Thanks के लिए स्पष्ट
नोमान

क्या यह केवल यह निर्दिष्ट करके काम करता है कि यह किस तरह का लेआउट है? जैसे RelativeLayout.LayoutParams ... इसके बजाय सिर्फ LayoutParams
ryvianstyron

RelativeLayout.LayoutParams दृश्य के गुरुत्व को सेट करने के लिए अन्य झंडों का उपयोग करता है (rightOf, centerInParent, centerVertical)। यह समाधान लीनियरलैटआउट लड़कों के लिए है
नोनी

6

बदलते आकार के बिना फ्रेमलाइन पर एक से अधिक गुरुत्वाकर्षण स्थापित करना:

     // assign more than one gravity,Using the operator "or"
    var gravity = Gravity.RIGHT or Gravity.CENTER_VERTICAL
     // update gravity
    (pagerContainer.layoutParams as FrameLayout.LayoutParams).gravity = gravity
     // refresh layout
     pagerContainer.requestLayout()

यह मेरा समय बचा रहा है ... THX
BertKing

4

मैं कुछ इस तरह का उपयोग करता हूं: (ज़मीरिन और सी # कोड)

  LinearLayout linLayout= new LinearLayout(this); 
    linLayout.SetGravity(GravityFlags.Center);

    TextView txtView= new TextView(this);  
     linLayout.AddView(txtView); 

SetGravity मेरे textView को लेआउट के केंद्र में रखता है। तो SetGravity लेआउट संपत्ति लेआउट सामग्री को देखें


4

मामले में आपको निम्नलिखित के उपयोग के लिए ग्रेविटी सेट करने की आवश्यकता है

Button b=new Button(Context);
b.setGravity(Gravity.CENTER);

बटन के लिए लेआउट_ग्रेविटी सेट करने के लिए लेआउटपरैम के रूप में गुरुत्वाकर्षण क्षेत्र का उपयोग करें

LayoutParams lp=new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);
lp.gravity=Gravity.CENTER;

इस उम्मीद को आज़माएं यह धन्यवाद


3

बाकी उत्तर सही हैं, मैं और अधिक स्पष्टीकरण जोड़ना चाहता हूं। लेआउट_गर्भावस्था के बारे में है कि माता-पिता के दृश्य में दृश्य को कैसे स्थान दिया जाए।

आपको गुरुत्वाकर्षण सेट करना होगा ** पद्धति के बाद parentView.addView () ** कहा जाता था। हम कोड देख सकते हैं:

public void setLayoutParams(ViewGroup.LayoutParams params) {
    if (params == null) {
        throw new NullPointerException("Layout parameters cannot be null");
    }
    mLayoutParams = params;
    resolveLayoutParams();
    if (mParent instanceof ViewGroup) {
        ((ViewGroup) mParent).onSetLayoutParams(this, params);
    }
    requestLayout();
}

और null पॉइंटर की समस्या इसलिए है क्योंकि यह getLayoutParams () से पहले addView को कॉल नहीं कर रहा है।

एनोटेशन पहले से ही कहा गया था "यदि यह दृश्य किसी पैरेंट व्यूग्रुप या {@ लिंक # setLayoutParams (android.view.ViewGroup.LayoutParams)} से जुड़ा हुआ नहीं है, तो इसे सफलतापूर्वक रद्द किया जा सकता है। जब कोई व्यू किसी माता-पिता से जुड़ा होता है। व्यूग्रुप, इस विधि को अशक्त नहीं करना चाहिए। "


इस बिट मुझे भी ... यह स्पष्ट नहीं है कि आपको addView () कहा जाता है के बाद गुरुत्वाकर्षण सेट करना होगा। आपको लगता है कि आप सब कुछ नए दृश्य पर सेट करेंगे और फिर इसे जोड़
देंगे

3

यदि आप माता-पिता के केंद्र में एक दृश्य रखना चाहते हैं, तो आप निम्नलिखित कोड के साथ कर सकते हैं।

public class myLayout extends LinearLayout {

    public myLayout(Context context) {
      super(context);

      RelativeLayout vi = (RelativeLayout) ((LayoutInflater) context
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(
            R.layout.activity_main, null);
      LinearLayout.LayoutParams cc = new LinearLayout.LayoutParams(
            LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
      cc.gravity = Gravity.CENTER;
      this.setGravity(Gravity.CENTER);
      this.addView(vi);
  }
}

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


i - इटैलिक))))
आर्टेम

2

RelativeLayout के लिए, इस कोड की कोशिश करो, यह मेरे लिए काम करता है: yourLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);


2

पूरी तरह से काम !!! उपरोक्त उत्तर में से कोई भी मेरे लिए काम नहीं करता है। Xml फ़ाइल में गुरुत्वाकर्षण और सेटिंग लेआउट_ग्रेविटी अलग है। नीचे दिए गए कोड की जाँच करें

// here messageLL is the linear layout in the xml file
// Before adding any view just remove all views
   messageLL.removeAllViews();
// FrameLayout is the parent for LinearLayout
FrameLayout.LayoutParams params = new 
   FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
   params.gravity = Gravity.CENTER|Gravity.CENTER_VERTICAL;
   messageLL.setLayoutParams(params);
   messageText.setVisibility(View.GONE);
   messageNoText.setVisibility(View.VISIBLE);
   messageLL.addView(messageNoText);

यह भी जांचें , जहां आप गुरुत्वाकर्षण और लेआउट_ग्रेविटी के बारे में स्पष्ट व्याख्या पा सकते हैं।


1

उपर्युक्त अधिकांश उत्तर सही हैं, इसलिए एक सहायक विधि लिखी गई है , इसलिए आप इसे सीधे अपने प्रोजेक्ट में उपयोग कर सकते हैं।

layout_gravityप्रोग्राम सेट करें

// gravity types : Gravity.BOTTOM, Gravity.START etc.
// view : can be any view example : button, textview, linearlayout, image etc.

// for single view
   public static void setLayoutGravity(int gravity, View view){
     ((LinearLayout.LayoutParams) view.getLayoutParams()).gravity = gravity;
    }


// for mulitple views
  public static void setLayoutGravity(int gravity, View ...view){
        for(View item : view)
            ((LinearLayout.LayoutParams) item.getLayoutParams()).gravity = gravity;
    }

0

मैंने LinearLayout.LayoutParams से RelativeLayout.LayoutParams पर स्विच किया और आखिरकार जो परिणाम मैं एक कस्टम सर्कलव्यू पर चाह रहा था, उसे पाने के लिए मैंने बनाया।

लेकिन गुरुत्वाकर्षण के बजाय आप addRule का उपयोग करते हैं

RelativeLayout.LayoutParams mCircleParams = नया RelativeLayout.LayoutParams (सर्कलहाइट, सर्कलहाइट);

    mCircleParams.addRule(RelativeLayout.CENTER_IN_PARENT);


0
 int width=getResources().getDisplayMetrics().widthPixels; 
 LinearLayout.LayoutParams params = new LinearLayout.LayoutParams
                    (width, width);

            params.gravity = Gravity.CENTER;

           iv_main_text = new HTextView(getContext());
            iv_main_text.setLayoutParams(params);
            iv_main_text.setBackgroundColor(Color.BLUE);
            iv_main_text.setTextSize(60);
            iv_main_text.setGravity(Gravity.CENTER);
            iv_main_text.setTextColor(Color.BLACK);

-1
FloatingActionButton sendFab = new FloatingActionButton(this);
    FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
    layoutParams.setMargins(32, 32, 32, 32);
    layoutParams.gravity = Gravity.END|Gravity.BOTTOM;
    sendFab.setLayoutParams(layoutParams);
    sendFab.setImageResource(android.R.drawable.ic_menu_send);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.