লিনিয়ারলআউট প্রোগ্রামে মার্জিন সেট করুন


266

আমি জাভা ব্যবহার করতে চেষ্টা করছি ( এক্সএমএল নয় ) স্ক্রিনটি পূরণ করে এবং মার্জিন রয়েছে এমন বোতামগুলির সাথে লিনিয়ারলআউট তৈরি করতে। এখানে কোডটি যা মার্জিন ছাড়াই কাজ করে:

LinearLayout buttonsView = new LinearLayout(this);
buttonsView.setOrientation(LinearLayout.VERTICAL);
for (int r = 0; r < 6; ++r) {
    Button btn = new Button(this);
    btn.setText("A");

    LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.FILL_PARENT); // Verbose!
    lp.weight = 1.0f; // This is critical. Doesn't work without it.
    buttonsView.addView(btn, lp);
}

ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT);
setContentView(buttonsView, lp);

সুতরাং এটি দুর্দান্ত কাজ করে, তবে পৃথিবীতে আপনি কীভাবে বাটনগুলি মার্জিন দেবেন যাতে তাদের মধ্যে জায়গা থাকে? আমি চেষ্টা করার চেষ্টা করেছি LinearLayout.MarginLayoutParams, তবে এর কোনও weightসদস্য নেই তাই এটি ভাল নয়। এবং এটি কাজ করে না যদি আপনি lpএটির কনস্ট্রাক্টারে পাসও করেন।

এটা কি অসম্ভব? কারণ এটি নিশ্চিতভাবে এটি দেখতে পেয়েছে, এবং এটি কেবলমাত্র এক্সএমএল-এ আপনি করতে পারেন এমন প্রথম অ্যান্ড্রয়েড লেআউট কাজ নয়।


1
developer.android.com/references/android/view/… , int, int, int) লেআউটপ্যারামস.সেটমার্গিনের পরিবর্তে (30, 20, 30, 0); আপনি লেআউটপ্যারাম.সেটমার্গিনস (30 ডিপি, 20 ডিপি, 30 ডিপি, 0 ডিপি) রেখেছেন;
ডার্টেস্টভেডার

3
সেটমার্গিনগুলি আর্গুমেন্ট হিসাবে গ্রহণ করে .. আপনি কেবল এক্সএমএল বৈশিষ্ট্য ব্যবহার করে "ডিপি" সরবরাহ করতে পারেন
jyavenard

উত্তর:


496

এটি সম্পাদন করার জন্য এখানে একটি ছোট কোড দেওয়া হয়েছে:

LinearLayout ll = new LinearLayout(this);
ll.setOrientation(LinearLayout.VERTICAL);

LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
     LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);

layoutParams.setMargins(30, 20, 30, 0);

Button okButton=new Button(this);
okButton.setText("some text");
ll.addView(okButton, layoutParams);

6
টু দ্য পয়েন্ট কোডের নমুনার জন্য ধন্যবাদ - কেবল বর্ণনার চেয়ে আরও উপকারী
কেউ কোথাও

25
দেখে মনে হচ্ছে মার্জিন প্যারামগুলি পিক্সেলে সেট করা আছে। এগুলি ডিপিএসে সেট করার কোনও উপায়?
আর্টেম রাশাকোভস্কিই

30
@ আর্টেমরুসাকোভস্কিই অ্যান্ড্রয়েডের বেশিরভাগ ফাংশনের মতো তারাও পিক্সেল নেয়। আমি একটি বিশ্বব্যাপী ইউটিলিটি ফাংশনটির পরামর্শ দিচ্ছি যা ডিপসকে পিক্সে রূপান্তর করে। আমি আমার সমস্ত অ্যাপ্লিকেশনগুলিতে এটি করেছি। অ্যান্ড্রয়েড এপিআই সফল হয়।
এমএক্সসিএল

7
@ ম্যাক্সহোয়েল এটাই আমি শেষ করেছিলাম। এটি অবিশ্বাস্য যে মৌলিক জিনিসগুলি কখনও কখনও অনুপস্থিত।
আর্টেম রাশাকোভস্কিই

5
@ আর্টেমরুসাকোভস্কি - ডিআইপিকে পিএক্সে রূপান্তর করতে টাইপডভ্যালু.এপ্লিডাইমেনশন (...) ব্যবহার করুন। স্ট্যাকওভারফ্লো.com
গৌতম

64

সুতরাং এটি দুর্দান্ত কাজ করে, তবে পৃথিবীতে আপনি কীভাবে বাটনগুলি মার্জিন দেবেন যাতে তাদের মধ্যে জায়গা থাকে?

আপনি কল setMargins()উপর LinearLayout.LayoutParamsবস্তু।

আমি লিনিয়ারলআউট.মার্জিনলাউআউটপ্যারাম ব্যবহার করার চেষ্টা করেছি, তবে এতে কোনও ওজন সদস্য নেই তাই এটি কোনও ভাল নয়।

LinearLayout.LayoutParamsডকুমেন্টেশনেLinearLayout.MarginLayoutParams ইঙ্গিত হিসাবে একটি সাবক্লাস ।

এটা কি অসম্ভব?

না।

এটি কেবলমাত্র এক্সএমএল-এ করতে পারেন এমন প্রথম অ্যান্ড্রয়েড লেআউট কাজ নয়

আপনি এই দাবির প্রমাণ সরবরাহ করতে স্বাগত জানাই।

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


2
হা, ঠিক আছে আমি এখন বুঝতে পারি। লেআউট সিস্টেমে কিছুটা হারিয়ে যাচ্ছিল যা জটিল। রানটাইমের সময় লেআউট_উইডথ / উচ্চতা সেট করার মতো কোনও উপায় নেই বলে আমি মনে করি না।
টিম্ম্ম্ম

2
: আর শৈলী সেট করার কোন উপায় আছে stackoverflow.com/questions/2016249/...
Timmmm

1
রানটাইমের মাধ্যমে প্রস্থ এবং উচ্চতা নির্ধারণে আমার কোনও সমস্যা হয়নি LayoutPararms। আমি শৈলীর শর্তাবলী ... হ্যাঁ, ভাল, এর একটি কারণ আছে যা আমি তাদের ব্যবহার করি না। :-)
CommonsWare

6
আমি জানতে চাই যে প্রোগ্রামটিমেটিকভাবে একটি ইউআই তৈরির জন্য এই জাতীয় পিটা কেন রয়েছে
কেউ কোথাও

3
আমাকে বুঝতে পেরে যুগে যুগে নিয়ে গেছে, কিছুদিন আগে আমি ভুল লেআউটপ্যারামগুলি আমদানি করেছিলাম যা মার্জিনকে সমর্থন করে না ... এই উত্তরগুলি পড়ে আমি সিদ্ধান্ত নিয়েছি আমার আমদানি সরিয়ে ফেলব। 10 টিরও বেশি বিকল্প রয়েছে ডি: আমি লিনিয়ারলআউট.লায়আউটপ্যারামের জন্য গিয়েছিলাম। কাজ করে।
ডুমসকাটায়

31

আইটেমগুলিতে সরাসরি মার্জিন যুক্ত করতে (কিছু আইটেম মার্জিনের সরাসরি সম্পাদনার অনুমতি দেয়), আপনি এটি করতে পারেন:

LayoutParams lp = ((ViewGroup) something).getLayoutParams();
if( lp instanceof MarginLayoutParams )
{
    ((MarginLayoutParams) lp).topMargin = ...;
    ((MarginLayoutParams) lp).leftMargin = ...;
    //... etc
}
else
    Log.e("MyApp", "Attempted to set the margins on a class that doesn't support margins: "+something.getClass().getName() );

... এটি পার্শ্ববর্তী বিন্যাস সম্পর্কে জানার / সম্পাদনা করার প্রয়োজন ছাড়াই কাজ করে। আপনি যেমন চেষ্টা করেন এবং মার্জিনকে সমর্থন করে না এমন কোনওটির বিরুদ্ধে এটি চালানোর ক্ষেত্রে "উদাহরণস্বরূপ" চেকটি নোট করুন।


2
এটি ঠিক আমি খুঁজছি
djdance

21

ডিভাইসের স্ক্রিন পিক্সেল ঘনত্বের পরিবর্তনের কারণে DIPপ্রোগ্রামিনালি মার্জিন সেট করতে সর্বদা ইউনিট ব্যবহার করা ভাল । নীচের মত_

//get resources
Resources r = getResources();
float pxLeftMargin = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 10, r.getDisplayMetrics());
float pxTopMargin = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 10, r.getDisplayMetrics());
float pxRightMargin = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 10, r.getDisplayMetrics());
float pxBottomMargin = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 20, r.getDisplayMetrics());

//get layout params...
LayoutParams params=new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
params.setMargins(Math.round(pxLeftMargin), Math.round(pxTopMargin), Math.round(pxRightMargin), Math.round(pxBottomMargin));

//set margin...
yourLayoutTOsetMargin.setLayoutParams(params); 

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


10

আমি নীচের কোডটি ব্যবহার করে সরাসরি মার্জিন সেট আপ করেছি

LinearLayout layout = (LinearLayout)findViewById(R.id.yourrelative_layout);
LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.WRAP_CONTENT);            
params.setMargins(3, 300, 3, 3); 
layout.setLayoutParams(params);

এখানে কেবলমাত্র লক্ষ্য করা যায় যে LayoutParamsনিম্নলিখিত প্যাকেজটির জন্য আমদানি করা উচিত android.widget.RelativeLayout.LayoutParams, অন্যথায় একটি ত্রুটি ঘটবে।


7

এটা চেষ্টা কর

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

7
 MarginLayoutParams layoutParams = (MarginLayoutParams) getLayoutParams();
 layoutParams.setMargins(leftMargin, topMargin, rightMargin, bottomMargin);

2
“যদিও এই কোডটি প্রশ্নের উত্তর দিতে পারে তবে কোডটির ব্যাখ্যা এখানে অন্তর্ভুক্ত করা ভাল is
xenteros

4

এটা চেষ্টা কর:

MarginLayoutParams params = (MarginLayoutParams) view.getLayoutParams();
params.width = 250;
params.leftMargin = 50;
params.topMargin = 50;

3
/*
 * invalid margin
 */
private void invalidMarginBottom() {
    RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) frameLayoutContent.getLayoutParams();
    lp.setMargins(0, 0, 0, 0);
    frameLayoutContent.setLayoutParams(lp);
}

আপনার ভিউর ভিউর গ্রুপ সম্পর্কে সতর্কতা অবলম্বন করা উচিত above উপরের কোডটিতে, উদাহরণস্বরূপ, আমি ফ্রেমলাউটের মার্জিনটি পরিবর্তন করতে চাই, এবং ফ্রেমলআউটের ভিউ গ্রুপটি একটি আপেক্ষিক লেআউট , সুতরাং আপনাকে ( রিলেটিভলআউট.লায়আউটপ্যারামস) এ প্রচ্ছন্ন হওয়া দরকার


0

এখানে একটি একক লাইন সমাধান:

((LinearLayout.LayoutParams) yourLinearLayout.getLayoutParams()).marginToAdd = ((int)(Resources.getSystem().getDisplayMetrics().density * yourDPValue));
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.