অ্যান্ড্রয়েডে, আমি কীভাবে প্রোগ্রামটিমে ডিপি-তে মার্জিন সেট করব?


401

ইন এই , এই এবং এই থ্রেড আমি একটি একক দৃশ্য মার্জিন সেট করতে উপর একটি উত্তর খুঁজে করার চেষ্টা করেছেন। তবে, আমি ভাবছিলাম যে এর চেয়ে সহজ উপায় যদি না থাকে। আমি ব্যাখ্যা করব কেন আমি বরং এই পদ্ধতির ব্যবহার করতে চাই না:

আমার একটি কাস্টম বাটন রয়েছে যা বাটনটি প্রসারিত করে। যদি ব্যাকগ্রাউন্ডটি ডিফল্ট ব্যাকগ্রাউন্ড (অন্যথায় ফোন করে setBackgroundResource(int id)বা অন্য কোনও কিছু) সেট করা থাকে setBackgroundDrawable(Drawable d), আমি মার্জিনটি 0 হতে চাই I

public void setBackgroundToDefault() {
    backgroundIsDefault = true;
    super.setBackgroundResource(android.R.drawable.btn_default);
    // Set margins somehow
}

আমি মার্জিনগুলি -3 ডিপিতে পুনরায় সেট করতে চাই (আমি ইতিমধ্যে এখানে পিক্সেল থেকে ডিপিতে কীভাবে রূপান্তর করতে হবে তা এখানে পড়েছি , তাই আমি যখন পিক্সারে মার্জিন সেট করতে পারি তবে আমি নিজেই রূপান্তরটি পরিচালনা করতে পারি)। তবে যেহেতু এটি CustomButtonক্লাসে বলা হয় , তাই পিতা-মাতা লিনিয়ারলআউট থেকে টেবিল লেআউটে পরিবর্তিত হতে পারে এবং আমি তার পরিবর্তে তার পিতামাতাকে পেতে এবং সেই পিতামাতার উদাহরণটি পরীক্ষা করতে চাই না। আমি এটি কল্পনাও করতে পারি যে এটি যথেষ্ট অসাধারণ।

এছাড়াও, কল করার সময় (লেআউটপ্যারাম ব্যবহার করে) parentLayout.addView(myCustomButton, newParams), আমি জানি না এটি এটি সঠিক অবস্থানে যুক্ত করেছে কিনা (তবে চেষ্টা করে দেখেনি) , পাঁচটি সারির মাঝের বোতামটি বলুন।

প্রশ্ন: লেআউটপ্যারাম ব্যবহারের পাশাপাশি প্রোগ্রামিংগতভাবে একটি একক বোতামের মার্জিন সেট করার কোনও সহজ উপায় কী?

সম্পাদনা: আমি লেআউটপ্যারাম পদ্ধতি সম্পর্কে জানি, তবে আমি এমন একটি সমাধান চাই যা প্রতিটি পৃথক ধারক প্রকারকে পরিচালনা করা এড়ায়:

ViewGroup.LayoutParams p = this.getLayoutParams();
    if (p instanceof LinearLayout.LayoutParams) {
        LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams)p;
        if (_default) lp.setMargins(mc.oml, mc.omt, mc.omr, mc.omb);
        else lp.setMargins(mc.ml, mc.mt, mc.mr, mc.mb);
        this.setLayoutParams(lp);
    }
    else if (p instanceof RelativeLayout.LayoutParams) {
        RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams)p;
        if (_default) lp.setMargins(mc.oml, mc.omt, mc.omr, mc.omb);
        else lp.setMargins(mc.ml, mc.mt, mc.mr, mc.mb);
        this.setLayoutParams(lp);
    }
    else if (p instanceof TableRow.LayoutParams) {
        TableRow.LayoutParams lp = (TableRow.LayoutParams)p;
        if (_default) lp.setMargins(mc.oml, mc.omt, mc.omr, mc.omb);
        else lp.setMargins(mc.ml, mc.mt, mc.mr, mc.mb);
        this.setLayoutParams(lp);
    }
}

কারণ this.getLayoutParams();রিটার্ন একটি ViewGroup.LayoutParams, যা বৈশিষ্ট্যাবলী হবে না topMargin, bottomMargin, leftMargin, rightMargin। আপনি যে MarginContainerএমসির উদাহরণটি দেখেছেন তা হ'ল অফসেট (-3 ডিপি) মার্জিন এবং (ওল, ওএমআর, ওম্ট, ওম্ব) এবং আসল মার্জিনগুলি (মিলি, এমআর, এমটি, এমবি)।

উত্তর:


797

LayoutParamsআপনার বোতামের মার্জিন সেট করতে আপনার ব্যবহার করা উচিত :

LayoutParams params = new LayoutParams(
        LayoutParams.WRAP_CONTENT,      
        LayoutParams.WRAP_CONTENT
);
params.setMargins(left, top, right, bottom);
yourbutton.setLayoutParams(params);

আপনি কোন লেআউট ব্যবহার করছেন তা নির্ভর করে RelativeLayout.LayoutParamsবা আপনার ব্যবহার করা উচিত LinearLayout.LayoutParams

এবং আপনার ডিপি পরিমাপটিকে পিক্সেলে রূপান্তর করতে, এটি ব্যবহার করে দেখুন:

Resources r = mContext.getResources();
int px = (int) TypedValue.applyDimension(
        TypedValue.COMPLEX_UNIT_DIP,
        yourdpmeasure, 
        r.getDisplayMetrics()
);

152
আমি কোন প্যাকেজ থেকে সেই বিশেষ লেআউটপ্যারামগুলি আমদানি করব?
স্টিলথজং

7
setMargins px ব্যবহার করেছে এবং আপনি dp ব্যবহার করবেন, আমার রূপান্তরটি সঠিক: dp -> px সঠিক মার্জিন মান সেট করতে।
throrin19


15
এটি আপনার বর্তমান লেআউটের উপর নির্ভর করে। আপনি যদি লিনিয়ারলআউটে থাকেন তবে লিনিয়ারলআউট.লায়আউটপ্যারাম ব্যবহার করুন। আপেক্ষিক
লেআউট.লয়আউটপ্রেমস

5
আপনার লেআউটপ্যারামগুলি আমদানি করা উচিত যা আপনার প্যারেন্ট লেআউট প্রাক্তন। <linearlayout><relativelayout> <gridlayout> এবং আপনি গ্রিড লেআউট নিয়ে কাজ করছেন। তারপরে, আপনার সম্পর্কিত সম্পর্কিতআউট.লে
আউটপ্রেমগুলি

228

লেআউটপ্যারামস - কাজ করছে না! ! !

ব্যবহারের ধরণের প্রয়োজন: মার্জিনলাউটপ্যারাম

MarginLayoutParams params = (MarginLayoutParams) vector8.getLayoutParams();
params.width = 200; params.leftMargin = 100; params.topMargin = 200;

মার্জিনলাউটপ্যারামের জন্য কোড উদাহরণ:

http://www.codota.com/android/classes/android.view.ViewGroup.MarginLayoutParams


19
সঠিক, তবে এটি আবার সেট করার দরকার নেই, পরিবর্তিত প্যারামগুলি স্বয়ংক্রিয়ভাবে প্রতিফলিত হবে। সুতরাং আপনি লাইনটি সরাতে পারেন: vector8.setLayoutParams (প্যারাম);
Wirsing

লায়াউটপ্যারামগুলি সাধারণত মার্জিন সেট করার সময় বিভ্রান্তি তৈরি করে ... সুতরাং এই মার্জিনলাউটপ্যারামগুলি খুব দরকারী। ধন্যবাদ
অতুল ভরদ্বাজ

4
পরিবর্তনগুলি চিহ্নিত করার পরে আপনাকে লেআউটপ্যারামগুলি (প্যারামগুলি) স্থাপন করতে হবে
লিও ড্রয়েডকোডার

আমি আজ মার্জিনালাউটপ্যারামগুলি নতুন শ্রেণি হিসাবে পেয়েছি # ধন্যবাদ ks
তুষার পান্ডে

Buttonদেখার জন্য কাজ করে না : ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) button.getLayoutParams()রিটার্নnull
কনস্টান্টিন কনোপকো

118

সর্বকালের সেরা উপায়:

private void setMargins (View view, int left, int top, int right, int bottom) {
    if (view.getLayoutParams() instanceof ViewGroup.MarginLayoutParams) {
        ViewGroup.MarginLayoutParams p = (ViewGroup.MarginLayoutParams) view.getLayoutParams();
        p.setMargins(left, top, right, bottom);
        view.requestLayout();
    }
}

পদ্ধতিটি কীভাবে কল করবেন:

setMargins(mImageView, 50, 50, 50, 50);

আশা করি এটা তোমাকে সাহায্য করবে।


1
আমি যখন মার্গিনস সেট করে রাখি তখন আমি সমস্যার মুখোমুখি হচ্ছি (ধারক.ভিসেন্টার, 0, 20, 0,0); এটির উভয় পক্ষের (উপরে এবং নীচে) এর প্রান্তিকের মার্জিনের মতো উপরের পেরামগুলির সাথে কী ভুল?
আরবাজ.ইন.

1
অসাধারণ নিখুঁত উত্তর !! ধন্যবাদ!!
এসজেডি

33
int sizeInDP = 16;

int marginInDp = (int) TypedValue.applyDimension(
            TypedValue.COMPLEX_UNIT_DIP, sizeInDP, getResources()
                    .getDisplayMetrics());

তারপর

layoutParams = myView.getLayoutParams()
layoutParams.setMargins(marginInDp, marginInDp, marginInDp, marginInDp);
myView.setLayoutParams(layoutParams);

অথবা

LayoutParams layoutParams = new LayoutParams...
layoutParams.setMargins(marginInDp, marginInDp, marginInDp, marginInDp);
myView.setLayoutParams(layoutParams);

15

সাম্প্রতিক আপডেটগুলির সাথে এখানে সর্বসম্মত উত্তর:

পদক্ষেপ 1, মার্জিন আপডেট করার জন্য

মূল ধারণাটি হ'ল মার্জিন আউট করা এবং তারপরে এটি আপডেট করা। আপডেটটি স্বয়ংক্রিয়ভাবে প্রযোজ্য হবে এবং আপনাকে এটি পুনরায় সেট করার দরকার নেই। বিন্যাসের পরামিতিগুলি পেতে, কেবল এই পদ্ধতিটি কল করুন:

LayoutParams layoutParams = (LayoutParams) yourView.findViewById(R.id.THE_ID).getLayoutParams();

LayoutParamsআপনার ভিউ লেআউট থেকে আসে। যদি ভিউটি কোনও রৈখিক বিন্যাস থেকে আসে তবে আপনার আমদানি করা দরকার LinearLayout.LayoutParams। আপনি যদি আপেক্ষিক লেআউট, আমদানি LinearLayout.LayoutParamsইত্যাদি ব্যবহার করেন

এখন, আপনি যদি ব্যবহার মার্জিন নির্ধারণ করে Layout_marginLeft, Rightইত্যাদি, আপনি আপডেট মার্জিন এই ভাবে প্রয়োজন

layoutParams.setMargins(left, top, right, bottom);

আপনি যদি নতুনটি ব্যবহার করে মার্জিন সেট করেন তবে আপনাকে layout_marginStartএইভাবে মার্জিন আপডেট করতে হবে

layoutParams.setMarginStart(start);
layoutParams.setMarginEnd(end);

পদক্ষেপ 2, dp এ মার্জিন আপডেট করতে

উপরের মার্জিন আপডেট করার সমস্ত দুটি উপায় পিক্সেলগুলিতে আপডেট হচ্ছে। আপনাকে পিক্সেল থেকে ডিপি অনুবাদ করতে হবে।

float dpRatio = context.getResources().getDisplayMetrics().density;
int pixelForDp = (int)dpValue * dpRatio;

এখন উপরের মার্জিন আপডেট ফাংশনগুলিতে গণনা করা মানটি রাখুন এবং আপনার সমস্ত প্রস্তুত হওয়া উচিত


9

বিন্যাস_মার্গিন এমন একটি প্রতিবন্ধকতা যা একটি ভিউ শিশু তার পিতামাতাকে বলে। তবে মার্জিনকে অনুমতি দেওয়া হবে কি না তা বেছে নেওয়া পিতামাতার ভূমিকা। মূলত অ্যান্ড্রয়েড: লেআউট_মার্জিন = "10 ডিপি" সেট করে, শিশু প্যারেন্ট ভিউ গ্রুপকে তার আসল আকারের চেয়ে 10 ডিপি বড় জায়গা বরাদ্দ করতে অনুরোধ করছে । (প্যাডিং = "10 ডিপি", অন্যদিকে, শিশু দর্শন তার নিজস্ব সামগ্রী 10 ডিপি আরও ছোট করে তুলবে ))

ফলস্বরূপ, সমস্ত ভিউগ্রুপগুলি মার্জিনকে সম্মান করে না । সর্বাধিক কুখ্যাত উদাহরণ হ'ল তালিকার দর্শন, যেখানে আইটেমের মার্জিন উপেক্ষা করা হয়। setMargin()আপনি একটি লেআউটপ্যারামে কল করার আগে , আপনার সর্বদা নিশ্চিত হওয়া উচিত যে বর্তমান দর্শনটি এমন একটি ভিউ গ্রুপে বাস করছে যা মার্জিনকে সমর্থন করে (যেমন লিনিয়ারলাইউট বা রিলেটিভলআউট), এবং getLayoutParams()আপনার পছন্দসই লেআউটপ্যারামের ফলাফলটি ফেলে দিতে পারে । ( ViewGroup.LayoutParamsএমনকি setMargins()পদ্ধতি নেই!)

নীচের ফাংশনটি কৌশলটি করা উচিত। তবে নিশ্চিত হয়ে নিন যে আপনি প্যারেন্ট ভিউয়ের ধরণের পরিবর্তে রিলেটিভলআউটকেই প্রতিস্থাপন করেন।

private void setMargin(int marginInPx) {
    RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) getLayoutParams();
    lp.setMargins(marginInPx,marginInPx, marginInPx, marginInPx);
    setLayoutParams(lp);
}

9

এই পদ্ধতি আপনি সেট দেওয়া হবে মার্জিন মধ্যে ডিপি

public void setMargin(Context con,ViewGroup.LayoutParams params,int dp) {

        final float scale = con.getResources().getDisplayMetrics().density;
        // convert the DP into pixel
        int pixel =  (int)(dp * scale + 0.5f); 

        ViewGroup.MarginLayoutParams s =(ViewGroup.MarginLayoutParams)params;
        s.setMargins(pixel,pixel,pixel,pixel);

        yourView.setLayoutParams(params);
}

হালনাগাদ

আপনার প্রয়োজন অনুসারে প্যারামিটারটি পরিবর্তন করতে পারেন।


8

কোটলিনে এটি দেখতে এই রকম হবে:

val layoutParams = (yourView?.layoutParams as? MarginLayoutParams)
layoutParams?.setMargins(40, 40, 40, 40)
yourView?.layoutParams = layoutParams

3

আপনি যখন কোনও কাস্টম ভিউতে getDimensionPixelSize(R.dimen.dimen_value)থাকবেন , আপনি ব্যবহার করতে পারেন , আমার ক্ষেত্রে, আমি initপদ্ধতিতে তৈরি লেআউটপ্যারামগুলিতে মার্জিনটি যুক্ত করেছি ।

কোটলিনে

init {
    LayoutInflater.from(context).inflate(R.layout.my_layout, this, true)
    layoutParams = LayoutParams(MATCH_PARENT, WRAP_CONTENT).apply {
    val margin = resources.getDimensionPixelSize(R.dimen.dimen_value)
    setMargins(0, margin, 0, margin)
}

জাভাতে:

public class CustomView extends LinearLayout {

    //..other constructors

    public CustomView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    private void init() {
        LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
        int margin = getResources().getDimensionPixelSize(R.dimen.spacing_dime);
        params.setMargins(0, margin, 0, margin);
        setLayoutParams(params);
    }
}

1

ডিপিতে মার্জিন নির্ধারণ করতে এই পদ্ধতিটি ব্যবহার করুন

private void setMargins (View view, int left, int top, int right, int bottom) {
    if (view.getLayoutParams() instanceof ViewGroup.MarginLayoutParams) {
        ViewGroup.MarginLayoutParams p = (ViewGroup.MarginLayoutParams) view.getLayoutParams();

        final float scale = getBaseContext().getResources().getDisplayMetrics().density;
        // convert the DP into pixel
        int l =  (int)(left * scale + 0.5f);
        int r =  (int)(right * scale + 0.5f);
        int t =  (int)(top * scale + 0.5f);
        int b =  (int)(bottom * scale + 0.5f);

        p.setMargins(l, t, r, b);
        view.requestLayout();
    }
}

পদ্ধতিটি কল করুন:

setMargins(linearLayout,5,0,5,0);

1

দ্রুত এক-লাইন সেটআপ ব্যবহারের জন্য

((LayoutParams) cvHolder.getLayoutParams()).setMargins(0, 0, 0, 0);

তবে লেআউটপ্যারামগুলির কোনও ভুল ব্যবহারের জন্য কারফুল থাকুন, কারণ এতে কোনও ifস্ট্যাটমেন্ট উদাহরণ নেই


1

আপনারা যারা এটি সহজে ব্যবহার করতে পারেন তাদের জন্য একটি কোটলিন এক্সটেনশন ফাংশন তৈরি করেছেন।

Dp নয় পিক্সেলগুলিতে পাস করার বিষয়টি নিশ্চিত করুন। শুভ কোডিং :)

fun View.addLayoutMargins(left: Int? = null, top: Int? = null,
                      right: Int? = null, bottom: Int? = null) {
    this.layoutParams = ViewGroup.MarginLayoutParams(this.layoutParams)
            .apply {
                left?.let { leftMargin = it }
                top?.let { topMargin = it }
                right?.let { rightMargin = it }
                bottom?.let { bottomMargin = it }
            }
}

1

আমার উদাহরণে আমি লিনিয়ারলআউটকে প্রোগ্রামগতভাবে একটি চিত্র ভিউ যুক্ত করছি। আমি ইমেজারভিউতে শীর্ষ এবং নীচের মার্জিন সেট করেছি। তারপরে লিনিয়ারলয়েটে ইমেজভিউ যুক্ত করুন।



        ImageView imageView = new ImageView(mContext);
        imageView.setImageBitmap(bitmap);
        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
                LinearLayout.LayoutParams.MATCH_PARENT,
                LinearLayout.LayoutParams.WRAP_CONTENT
        );
        params.setMargins(0, 20, 0, 40);
        imageView.setLayoutParams(params);
        linearLayout.addView(imageView);

1

আপনি এই পদ্ধতিটি ব্যবহার করতে পারেন এবং 20 এর মতো স্থির মাত্রা রাখতে পারেন এটি আপনার ডিভাইস অনুসারে রূপান্তর করে

 public static int dpToPx(int dp) 
      {
          float scale = context.getResources().getDisplayMetrics().density;
       return (int) (dp * scale + 0.5f);
  }

0

আজকের মতো, প্যারিস ব্যবহার করা সবচেয়ে ভাল , এয়ারবিএনবি দ্বারা সরবরাহিত একটি গ্রন্থাগার।

স্টাইলগুলি এর পরে প্রয়োগ করা যেতে পারে:

Paris.style(myView).apply(R.style.MyStyle);

এটি টীকাগুলি ব্যবহার করে কাস্টম ভিউটিকে সমর্থন করে (যদি আপনি কোনও দৃশ্য প্রসারিত করেন):

@Styleable and @Style

0

আপনাকে ফোন করতে হবে

setPadding(int left, int top, int right, int bottom)

তাই ভালো: your_view.setPadding(0,16,0,0)

আপনি যা ব্যবহার করার চেষ্টা করছেন তা কেবল প্রাপ্তি।

অ্যান্ড্রয়েড স্টুডিওগুলি padding...()জাভাতে আসলে কী বোঝায় তা দেখায় :

প্যাডিং উদাহরণ চিত্রটি কেবলমাত্র কলগুলি দেখায়getPadding...()

আপনি যদি আপনার টেক্সটভিউতে মার্জিন যুক্ত করতে চান তবে আপনাকে লেআউটপ্যারাম করতে হবে:

val params =  LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,LinearLayout.LayoutParams.WRAP_CONTENT)
params.setMargins(int left, int top, int right, int bottom)
your_view.layoutParams = params

-1
((FrameLayout.LayoutParams) linearLayout.getLayoutParams()).setMargins(450, 20, 0, 250);
        linearLayout.setBackgroundResource(R.drawable.smartlight_background);

আমাকে FrameLayoutলিনিয়ারআলআউটের জন্য আমার কাস্ট করতে হয়েছিল কারণ এটি এর উত্তরাধিকার সূত্রে পেয়েছে এবং সেখানে মার্জিন সেট করেছে যাতে ক্রিয়াকলাপটি কেবলমাত্র স্ক্রিনের অংশে প্রদর্শিত হয় মূল স্ক্রিনের মূল লেআউট প্যারামগুলির চেয়ে আলাদা ব্যাকগ্রাউন্ডের সাথে setContentView

LinearLayout linearLayout = (LinearLayout) findViewById(R.id.activity);
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(WindowManager.LayoutParams.FILL_PARENT, WindowManager.LayoutParams.MATCH_PARENT);
linearLayout.setBackgroundColor(getResources().getColor(R.color.full_white));
setContentView(linearLayout,layoutParams);

অন্য কেউই একই ক্রিয়াকলাপটি ব্যবহার এবং ভিন্ন মেনু থেকে ক্রিয়াকলাপটি খোলার উপর ভিত্তি করে মার্জিন পরিবর্তন করার জন্য কাজ করেনি! সেটলআউটপ্যারামগুলি কখনই আমার পক্ষে কাজ করেনি - ডিভাইসটি প্রতিবারই ক্র্যাশ হয়ে যায়। যদিও এটি হার্ডকডযুক্ত সংখ্যা - এটি কেবলমাত্র প্রদর্শনের উদ্দেশ্যে কোডের একটি উদাহরণ।


-1

আপনি ViewGroup.MarginLayoutParamsপ্রস্থ, উচ্চতা এবং মার্জিন সেট করতে ব্যবহার করতে পারেন

ViewGroup.MarginLayoutParams marginLayoutParams = new ViewGroup.MarginLayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
marginLayoutParams.setMargins(0,16,0,16);
linearLayout.setLayoutParams(marginLayoutParams);

পদ্ধতিটি setMargins();যথাক্রমে বাম, শীর্ষ, ডান, নীচে মান গ্রহণ করে। বাম থেকে শুরু করে, ক্লকওয়াইজ!

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.