প্রোগ্রামের মতো একটি ভিউয়ের ডান মার্জিনটি পরিবর্তন করবেন?


172

এই বৈশিষ্ট্যটি জাভা কোডে গতিশীল পরিবর্তন করা যেতে পারে?

android:layout_marginRight

আমার একটি আছে TextView, এটির গতিগতভাবে কিছু পিক্সেলকে তার অবস্থান পরিবর্তন করতে হবে।

প্রোগ্রামটিমে কীভাবে এটি করবেন?

উত্তর:


462

সম্পাদনা: এটি করার আরও সাধারণ উপায় যা বিন্যাসের ধরণের উপর নির্ভর করে না (এটির বাইরে যে এটি একটি বিন্যাসের ধরণ যা মার্জিনকে সমর্থন করে):

public static void setMargins (View v, int l, int t, int r, int b) {
    if (v.getLayoutParams() instanceof ViewGroup.MarginLayoutParams) {
        ViewGroup.MarginLayoutParams p = (ViewGroup.MarginLayoutParams) v.getLayoutParams();
        p.setMargins(l, t, r, b);
        v.requestLayout();
    }
}

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

TextView tv = (TextView)findViewById(R.id.my_text_view);
LinearLayout.LayoutParams params = (LinearLayout.LayoutParams)tv.getLayoutParams();
params.setMargins(0, 0, 10, 0); //substitute parameters for left, top, right, bottom
tv.setLayoutParams(params);

আমি এখনই এটি পরীক্ষা করতে পারছি না, তাই আমার ingালাই কিছুটা হলেও বন্ধ হয়ে যেতে পারে তবে লেআউটপ্যারামগুলি মার্জিন পরিবর্তন করার জন্য যা পরিবর্তন করতে হবে তা।

বিঃদ্রঃ

ভুলে যাবেন না, যদি আপনার TextView ভিতরে, উদাহরণস্বরূপ, একটি RelativeLayout , এক ব্যবহার করা উচিত RelativeLayout.LayoutParams পরিবর্তে LinearLayout.LayoutParams এর


39
অন্য লোকেরা যদি এটির সন্ধান করে তবে আপনার উত্তরটি বিশদভাবে জানাতে। আপনি যদি টেক্সটভিউ প্রোগ্রামক্রমে তৈরি করে থাকেন তবে আপনাকে .getLayoutParams () এর মাধ্যমে একটি বের করার চেষ্টা করার পরিবর্তে একটি নতুন লিনিয়ারলআউট.লায়আউটপ্যারামস অবজেক্টও তৈরি করতে হবে;
আরেস

এটি দুর্দান্ত কাজ করে এবং দেখে মনে হচ্ছে এটি পিক্সেলগুলিতে মার্জিন সেট করে। এটি ডিপি সেট করা সম্ভব?
স্যাররুপের্টআইআইআই

3
@ কেকেনডাল: আপনার ডিপি কে প্রথমে পিক্সে রূপান্তর করুন
কেভিন কপোকক

আপনার নোট অনুসারে: আমার সন্দেহ আছে। টেক্সটভিউ বা বোতামটি যদি কোনও টেবিল সারির ভিতরে থাকে? তারপরে রিলেটিভ লেআউট, টেবিল লেআউট এর পরিবর্তে আমার কী ব্যবহার করা উচিত?
তেজাস

1
নোটের সাথে সম্পর্কিত, আপনি কেবলমাত্র ভিউগ্রুপ.মারগিনলাউটপ্যারামগুলিতে TV.getLayoutParams () কাস্ট করতে পারেন। এই প্রান্তে কী লেআউট প্রান্তিক তা বিবেচনা করে না, যতক্ষণ এটি মার্জিন প্রয়োগ করে
Radu Simionescu

17

লেআউটপ্যারামগুলি ব্যবহার করুন (আগেই ব্যাখ্যা করা হয়েছে)। তবে কোন লেআউটপ্যারাম বেছে নেবেন সে সম্পর্কে সতর্ক হন। Https://stackoverflow.com/a/11971553/3184778 অনুসারে "আপনি যে ভিউটিতে কাজ করছেন তার পার্টেন্টের সাথে সম্পর্কিত যেটি ব্যবহার করতে হবে, আসল দৃশ্য নয়"

উদাহরণস্বরূপ, যদি টেক্সটভিউটি কোনও টেবিলরোর অভ্যন্তরে থাকে, তবে আপনাকে তুলনামূলক লেআউট বা লিনিয়ারলআউটের পরিবর্তে টেবিলরো.লয়আউটপ্যারাম ব্যবহার করতে হবে you


স্পষ্ট করার জন্য ধন্যবাদ!
স্কট বিগস

1
মার্জিনগুলি সেট করার জন্য আপনাকে টেক্সটবক্সের গন্তব্যটি জানতে হবে এটি সত্যিই সফল হয় ... আপনি মনে করেন গন্তব্য স্বাধীন এমন কোনও সমাধান হবে।
টাটিওভারফ্লো

10

সব ধরণের মার্জিন সেট করতে এই ফাংশনটি ব্যবহার করুন

      public void setViewMargins(Context con, ViewGroup.LayoutParams params,      
       int left, int top , int right, int bottom, View view) {

    final float scale = con.getResources().getDisplayMetrics().density;
    // convert the DP into pixel
    int pixel_left = (int) (left * scale + 0.5f);
    int pixel_top = (int) (top * scale + 0.5f);
    int pixel_right = (int) (right * scale + 0.5f);
    int pixel_bottom = (int) (bottom * scale + 0.5f);

    ViewGroup.MarginLayoutParams s = (ViewGroup.MarginLayoutParams) params;
    s.setMargins(pixel_left, pixel_top, pixel_right, pixel_bottom);

    view.setLayoutParams(params);
}

2
অতিরিক্ত ০.৫f কেন?
বেহালিট

2
@ বিহিত আমি জানি এটি দেরি হয়ে গেছে তবে যে কারো জন্য এটি খুঁজছেন ... আপনি যখন কোন ইনটকে একটি ফ্ল্যাট ফেলবেন তখন ভাসমান বৃত্তাকার। ০.০ -> ০.৪ রাউন্ডে ০.০ -> ০.৯ থেকে ২.২ রাউন্ড এটি চূড়ান্ত ইনসটিগুলিতে অসঙ্গতি তৈরি করতে পারে। এটি প্রতিরোধের জন্য, 0.5 যোগ করা সমস্ত রাউন্ডিং 1 নিশ্চিত করে Why কেন? বলুন যে আপনার ভাসমানটি 0.3: 0.3 + 0.5 = 0.8 যা 1 থেকে 1 গোল করে s নেতিবাচক
ইন্টিগ্রেশন

7

আপডেট: অ্যান্ড্রয়েড কেটিএক্স

কোর KTX মডিউল সাধারণ লাইব্রেরি যা Android ফ্রেমওয়ার্ক, অংশ জন্য এক্সটেনশন প্রদান করে androidx.core.viewতাদের মধ্যে।

dependencies {
    implementation "androidx.core:core-ktx:{latest-version}"
}

নিম্নলিখিত এক্সটেনশন ফাংশনগুলি মার্জিনগুলি মোকাবেলা করার জন্য কার্যকর:

মধ্যে সেট সব কুড়াল মার্জিন ViewGroupএর MarginLayoutParams। (মাত্রাটি পিক্সেলগুলিতে সরবরাহ করতে হবে, আপনি ডিপি নিয়ে কাজ করতে চাইলে শেষ বিভাগটি দেখুন)

inline fun MarginLayoutParams.setMargins(@Px size: Int): Unit
// E.g. 16px margins
val params = (myView.layoutParams as ViewGroup.MarginLayoutParams)
params.setMargins(16)

আপডেট মার্জিন ViewGroupএর ViewGroup.MarginLayoutParams

inline fun MarginLayoutParams.updateMargins(
    @Px left: Int = leftMargin, 
    @Px top: Int = topMargin, 
    @Px right: Int = rightMargin, 
    @Px bottom: Int = bottomMargin
): Unit
// Example: 8px left margin 
params.updateMargins(left = 8)

ViewGroupএর MarginLayoutParams(আপ / বাম / ডান পরিবর্তে শেষ) আপেক্ষিক মার্জিন আপডেট করে ।

inline fun MarginLayoutParams.updateMarginsRelative(
    @Px start: Int = marginStart, 
    @Px top: Int = topMargin, 
    @Px end: Int = marginEnd, 
    @Px bottom: Int = bottomMargin
): Unit
// E.g: 8px start margin 
params.updateMargins(start = 8)

নিম্নলিখিত এক্সটেনশন বৈশিষ্ট্যগুলি বর্তমান মার্জিনগুলি পাওয়ার জন্য কার্যকর:

inline val View.marginBottom: Int
inline val View.marginEnd: Int
inline val View.marginLeft: Int
inline val View.marginRight: Int
inline val View.marginStart: Int
inline val View.marginTop: Int
// E.g: get margin bottom
val bottomPx = myView1.marginBottom
  • dpপরিবর্তে ব্যবহার px:

আপনি যদি এর dpপরিবর্তে (ঘনত্ব-স্বাধীন পিক্সেল) দিয়ে কাজ করতে চান তবে আপনাকে pxপ্রথমে সেগুলি রূপান্তর করতে হবে। আপনি নিম্নলিখিত এক্সটেনশন সম্পত্তি সহ এটি সহজেই করতে পারেন:

val Int.px: Int
    get() = (this * Resources.getSystem().displayMetrics.density).toInt()

তারপরে আপনি আগের এক্সটেনশন ফাংশনগুলিকে কল করতে পারেন:

params.updateMargins(start = 16.px, end = 16.px, top = 8.px, bottom = 8.px)
val bottomDp = myView1.marginBottom.dp

পুরানো উত্তর:

কোটলিনে আপনি এই জাতীয় এক্সটেনশন ফাংশন ঘোষণা করতে পারেন:

fun View.setMargins(
    leftMarginDp: Int? = null,
    topMarginDp: Int? = null,
    rightMarginDp: Int? = null,
    bottomMarginDp: Int? = null
) {
    if (layoutParams is ViewGroup.MarginLayoutParams) {
        val params = layoutParams as ViewGroup.MarginLayoutParams
        leftMarginDp?.run { params.leftMargin = this.dpToPx(context) }
        topMarginDp?.run { params.topMargin = this.dpToPx(context) }
        rightMarginDp?.run { params.rightMargin = this.dpToPx(context) }
        bottomMarginDp?.run { params.bottomMargin = this.dpToPx(context) }
        requestLayout()
    }
}

fun Int.dpToPx(context: Context): Int {
    val metrics = context.resources.displayMetrics
    return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, this.toFloat(), metrics).toInt()
}

তারপরে আপনি এটিকে কল করতে পারেন:

myView1.setMargins(8, 16, 34, 42)

বা:

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