সীমাবদ্ধতা: প্রোগ্রামক্রমে পরিবর্তন সীমাবদ্ধ করে


110

আমি সাহায্যের প্রয়োজন ConstraintSet। আমার লক্ষ্যটি কোডের মধ্যে দর্শনীয় সীমাবদ্ধতাগুলি পরিবর্তন করা, তবে কীভাবে এটি সঠিকভাবে করা যায় তা আমি বুঝতে পারি না।

আমার 4 TextViewটি এবং একটি আছে ImageView। আমার ImageViewএকটিতে সীমাবদ্ধতা স্থাপন করা দরকার TextView

check_answer4 = (TextView) findViewById(R.id.check_answer4);
check_answer1 = (TextView) findViewById(R.id.check_answer1);
check_answer2 = (TextView) findViewById(R.id.check_answer2);
check_answer3 = (TextView) findViewById(R.id.check_answer3);

correct_answer_icon = (ImageView) findViewById(R.id.correct_answer_icon);

যদি 1 ম উত্তর সঠিক, আমি সেট সীমাবদ্ধতার প্রয়োজন ImageViewথেকে

app:layout_constraintRight_toRightOf="@+id/check_answer1"
app:layout_constraintTop_toTopOf="@+id/check_answer1"

তাহলে 2nd উত্তর সঠিক, আমি সেট সীমাবদ্ধতার প্রয়োজন ImageViewথেকে

app:layout_constraintRight_toRightOf="@+id/check_answer2"
app:layout_constraintTop_toTopOf="@+id/check_answer2"

ইত্যাদি।


এর জন্য, আপনাকে গতিবদ্ধভাবে বাধা পরিবর্তন করতে হবে।
শ্বেতা চৌহান

3
@ শ্বেতা আমি এই সম্পর্কে ঠিক জিজ্ঞাসা করছি, এটি কীভাবে ডায়নামিকভাবে করবেন?
বিগ কোচ

পেয়ে. আপনার উত্তর পোস্ট করা।
শ্বেতা চৌহান

উত্তর:


184
  1. চিত্র দেখার সীমাবদ্ধতা সেট করতে:

     app:layout_constraintRight_toRightOf="@+id/check_answer1"
     app:layout_constraintTop_toTopOf="@+id/check_answer1"

    ব্যবহার করুন:

     ConstraintLayout constraintLayout = findViewById(R.id.parent_layout);
     ConstraintSet constraintSet = new ConstraintSet();
     constraintSet.clone(constraintLayout);
     constraintSet.connect(R.id.imageView,ConstraintSet.RIGHT,R.id.check_answer1,ConstraintSet.RIGHT,0);
     constraintSet.connect(R.id.imageView,ConstraintSet.TOP,R.id.check_answer1,ConstraintSet.TOP,0);
     constraintSet.applyTo(constraintLayout);
  2. চিত্র দেখার সীমাবদ্ধতা সেট করতে:

     app:layout_constraintRight_toRightOf="@+id/check_answer2"
     app:layout_constraintTop_toTopOf="@+id/check_answer2"

    ব্যবহার করুন:

     ConstraintLayout constraintLayout = findViewById(R.id.parent_layout);
     ConstraintSet constraintSet = new ConstraintSet();
     constraintSet.clone(constraintLayout); 
     constraintSet.connect(R.id.imageView,ConstraintSet.RIGHT,R.id.check_answer2,ConstraintSet.RIGHT,0);      
     constraintSet.connect(R.id.imageView,ConstraintSet.TOP,R.id.check_answer2,ConstraintSet.TOP,0);
     constraintSet.applyTo(constraintLayout);

3
constraintSet.clone (constraintLayout); এই লাইনে, সীমাবদ্ধতা কি পিতামাতার বিন্যাসটির বাইরে রয়েছে?
রিজেশ পিকে

5
@ পাং .clone(constraintLayout)এই পরিবর্তনশীল কি এবং আমি এটি কোথা থেকে পেতে পারি?
একাকী

8
@ রিজেশপিকে @ মিক্সট ৪ পিপি হ্যাঁ এটি মূল লেআউট, অর্থাৎConstraintLayout constraintLayout = findViewById(R.id.parent_layout);
মুহাম্মদ মুজাম্মিল

1
@ নিঃসঙ্গতা আমি মনে করি এটি আপনার পরিবর্তন সীমাবদ্ধ বিন্যাস ভিউগ্রুপের উল্লেখ করে একটি পরিবর্তনশীল হওয়া উচিত
ফেলিক্স

81

ধরুন আমরা রানটাইম চলাকালীন সীমাবদ্ধতাগুলি পরিবর্তন করতে চাইছি, ক্লিক করার সময় বাটন 1 টি বাটন 2 এর সাথে সংযুক্ত হতে হবে:

এখানে চিত্র বর্ণনা লিখুন

তারপরে, এই বিন্যাসটি থাকা:

<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/root"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin">


    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button 1"
        app:layout_constraintTop_toTopOf="@+id/button3"
        app:layout_constraintBottom_toBottomOf="@+id/button3"
        app:layout_constraintStart_toEndOf="@+id/button3"
        android:layout_marginStart="0dp"
        app:layout_constraintEnd_toEndOf="parent"
        android:layout_marginEnd="0dp" />

    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="16dp"
        android:text="Button 2"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        android:layout_marginStart="8dp"
        app:layout_constraintEnd_toEndOf="parent"
        android:layout_marginEnd="8dp"
        app:layout_constraintBottom_toBottomOf="parent"
        android:layout_marginBottom="8dp"
        app:layout_constraintTop_toTopOf="parent"
        android:layout_marginTop="8dp"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintVertical_bias="0.5" />

    <Button
        android:id="@+id/button3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="16dp"
        android:text="Button 3"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        android:layout_marginStart="8dp"
        app:layout_constraintEnd_toEndOf="parent"
        android:layout_marginEnd="8dp"
        app:layout_constraintTop_toTopOf="parent"
        android:layout_marginTop="8dp"
        app:layout_constraintBottom_toBottomOf="parent"
        android:layout_marginBottom="8dp"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintVertical_bias="0.223" />
</android.support.constraint.ConstraintLayout>

আমরা নিম্নলিখিতগুলি করতে পারি:


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        button1.setOnClickListener {
            val params = button1.layoutParams as ConstraintLayout.LayoutParams
            params.leftToRight = button2.id
            params.topToTop = button2.id
            params.bottomToBottom = button2.id
            button1.requestLayout()
        }
    }


আমার বন্ধু, আমি আপনার কোড পাই না .. কী layoutParamsএবং valকী? এটি কি জাভা?
একাকী

42
স্যার, এটি কোটলিন প্রোগ্রামিংয়ের ভাষা। জাভা সমতুল্য হবেConstraintLayout.LayoutParams params = (ConstraintLayout.LayoutParams) button1.getLayoutParams();
আজিজবিকিয়ান

1
আমার মনে হয় আপনি লিখতে ভুলে গেছি button1.layoutParams = প্যারাম
সুমিত sonawane

1
@ সুমিতসোওয়ানে, এটির দরকার নেই, কারণ আমরা সেই দৃষ্টান্তটি পরিবর্তন করছি এবং এরপরে আমরা এমন কর্ম সম্পাদন করব button1.requestLayout()যা তখন LayoutParamsআমরা পরিবর্তিত হয়েছি insp
আজিজবিকিয়ান

2
@ জিজিবেকিয়ান, হ্যাঁ, আমার জন্য চূড়ান্ত সমাধানটি requestLayout()কলকে প্রতিস্থাপন করা setLayoutParams()এবং তারপরে এটি কার্যকর হয়। কেবল রূপান্তরকরণ layoutParamsএবং বিন্যাসের অনুরোধটি নিজেই কৌশলটি মনে হচ্ছে না।
কিওয়ার্টিফিংগার

2

কোটলিনে আপনি ConstraintSetক্লাস প্রসারিত করতে পারেন এবং কোটলিনে ডিএসএল সুবিধা গ্রহণ করতে আরও কিছু পদ্ধতি যুক্ত করতে পারেন এবং আরও পাঠযোগ্য কোড তৈরি করতে পারেন। এটার মত

class KotlinConstraintSet : ConstraintSet() {

    companion object {
        inline fun buildConstraintSet(block:KotlinConstraintSet.()->Unit) =
            KotlinConstraintSet().apply(block)
    }
    //add this if you plan on using the margin param in ConstraintSet.connect
    var margin: Int? = null
        get() {
            val result = field
            margin = null //reset it to work with other constraints
            return result
        }

    inline infix fun Unit.and(other: Int) = other // just to join two functions

    inline infix fun Int.topToBottomOf(bottom: Int) =
        margin?.let {
            connect(this, TOP, bottom, BOTTOM, it)
        } ?: connect(this, TOP, bottom, BOTTOM)

    inline fun margin(margin: Int) {
        this.margin = margin
    }

    inline infix fun Int.bottomToBottomOf(bottom: Int) =
        margin?.let {
            connect(this, BOTTOM, bottom, BOTTOM, it)
        } ?: connect(this, BOTTOM, bottom, BOTTOM)

    inline infix fun Int.topToTopOf(top: Int) =
        margin?.let {
            connect(this, TOP, top, TOP, it)
        } ?: connect(this, TOP, top, TOP)

    inline infix fun Int.startToEndOf(end: Int) =
        margin?.let {
            connect(this, START, end, END, it)
        } ?: connect(this, START, end, END)

            ...
    //TODO generate other functions depending on your needs

    infix fun Int.clear(constraint: Constraints) =
        when (constraint) {
            Constraints.TOP -> clear(this, TOP)
            Constraints.BOTTOM -> clear(this, BOTTOM)
            Constraints.END -> clear(this, END)
            Constraints.START -> clear(this, START)
        }

    //inline infix fun clearTopCon
    inline infix fun appliesTo(constraintLayout: ConstraintLayout) =
        applyTo(constraintLayout)

    inline infix fun clones(constraintLayout: ConstraintLayout) =
        clone(constraintLayout)

    inline fun constraint(view: Int, block: Int.() -> Unit) =
        view.apply(block)
}

enum class Constraints {
    TOP, BOTTOM, START, END //you could add other values to use with the clear fun like LEFT
}

এবং এটি ব্যবহার করুন

        buildConstraintSet {
            this clones yourConstraintLayout
            constraint(R.id.view1) {
                margin(value:Int) and this topToBottomOf R.id.view2
                margin(30) and this bottomToBottomOf ConstraintSet.PARENT_ID
            }
            constraint(R.id.view2) {
                this clear Constraints.BOTTOM
                margin(0) and this topToTopOf R.id.topGuide
            }
            constraint(R.id.view4) {
                this topToTopOf R.id.view2
                this bottomToBottomOf R.id.view3
                this startToEndOf R.id.view2
            }
            //or you could simply do
            R.id.view1 startToEndOf R.view2
            R.id.view1 toptToBottomOf R.view3
            R.id.view3 bottomtToBottomOf R.view2
            R.id.view3 clear Constraints.END

            // and finally call applyTo()
            this appliesTo yourConstraintLayout
        }

2

আমি জানি আমার উত্তরটি অনেক দেরিতে এসেছে, তবুও আমি নিশ্চিত যে এটি অন্যদেরকে এখানে অনেকটা থামিয়ে দেওয়াতে সহায়তা করবে। এই নিবন্ধটি আমার নয় তবে আমি কয়েকটি পরিবর্তন করেছি, যা বলা হচ্ছে, আপনার এখানে সম্পূর্ণ নিবন্ধটি পরীক্ষা করার চেষ্টা করা উচিত

সীমাবদ্ধতা সেট

জাভা কোডে সীমাবদ্ধতার সাথে কাজ করার মূল চাবিকাটি হ'ল কনস্ট্রেন্টসেট ক্লাস। এই শ্রেণিতে বিভিন্ন পদ্ধতি রয়েছে যা কনস্ট্রেন্টলয়েট ইভেন্টে সীমাবদ্ধতা তৈরি, কনফিগারেশন এবং প্রয়োগের মতো কাজের অনুমতি দেয়। তদ্ব্যতীত, কনস্ট্রেন্টলয়েট উদাহরণের জন্য বর্তমান সীমাবদ্ধতাগুলি কনস্ট্রেন্টসেট বস্তুতে অনুলিপি করা যেতে পারে এবং একই বিন্যাসগুলি অন্যান্য বিন্যাসে (সংশোধনী সহ বা ছাড়াই) প্রয়োগ করতে ব্যবহৃত হতে পারে।

কোনও অন্য জাভা অবজেক্টের মতোই কনস্ট্রেন্টসেট উদাহরণ তৈরি করা হয়েছে:

ConstraintSet set = new ConstraintSet();

একবার প্রতিবন্ধকতা সেট তৈরি হয়ে গেলে, বিভিন্ন ধরণের কাজ সম্পাদনের জন্য উদাহরণগুলিতে কল করা যেতে পারে। নিম্নলিখিত কোডটি একটি সীমাবদ্ধতা সেট কনফিগার করে যাতে একটি বোতামের ভিউয়ের বাম-হাতটি d০dp এর মার্জিন সহ একটি সম্পাদনা পাঠের ডান হাতের সাথে যুক্ত থাকে:

set.connect(button1.getId(), ConstraintSet.LEFT, 
        editText1.getId(), ConstraintSet.RIGHT, 70);

একটি বিন্যাসে সীমাবদ্ধতা প্রয়োগ করা একবার প্রতিবন্ধকতা সেট কনফিগার হয়ে গেলে, কার্যকর হওয়ার আগে এটি অবশ্যই কনস্ট্রেন্টলয়েট ইভেন্টে প্রয়োগ করতে হবে। একটি বাধা সেট প্রয়োগের () পদ্ধতিতে একটি কলের মাধ্যমে প্রয়োগ করা হবে, সেটিংস প্রয়োগ করতে হবে এমন লেআউট অবজেক্টের একটি রেফারেন্স পেরিয়ে:

set.applyTo(myLayout);

ConstraintSetএপিআই দিয়ে আরও অনেক স্টাফ রয়েছে যা আপনি আনুভূমিক এবং উল্লম্ব পক্ষপাত নির্ধারণ করতে পারেন , অনুভূমিকভাবে এবং উল্লম্বভাবে কেন্দ্র স্থাপন করে চেইনগুলি এবং আরও অনেক কিছুর হেরফের করে।

সত্যিই সুন্দর পড়া।

আবার এটি কেবল একটি অভিযোজন।


0

আজিজবিকিয়ানের উত্তর ছাড়াও , আমি দুটি বিষয় উল্লেখ করতে পারি:

  1. যদি বাম / ডান কাজ না করে তবে এইভাবে শুরু / শেষের চেষ্টা করুন:

params.startToEnd = button2.id

  1. আপনি যদি কোনও প্রতিবন্ধকতা সরাতে চান তবে ইউএনএসইটি পতাকাটি এটি ব্যবহার করুন:

params.startToEnd = ConstraintLayout.LayoutParams.UNSET

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