कांस्टेंटलिंयूट: प्रोग्राम में बाधाएं बदलें


110

मैं के साथ मदद की जरूरत है ConstraintSet। मेरा लक्ष्य कोड में दृश्य की बाधाओं को बदलना है, लेकिन मुझे यह पता नहीं है कि यह कैसे करना है।

मेरे पास 4 TextViews और एक है 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"

यदि दूसरा उत्तर सही है, तो मुझे इसके लिए बाधाओं को निर्धारित करने की आवश्यकता 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)यह चर क्या है और मुझे यह कहाँ से मिलता है?
leonheess

8
@ReejeshPK @ MiXT4PE हाँ यह मूल लेआउट है, अर्थातConstraintLayout constraintLayout = findViewById(R.id.parent_layout);
मुहम्मद मुज़म्मिल

1
@leonheess मुझे लगता है कि एक वैरिएबल होना चाहिए जो आपके
कॉन्स्ट्रेक्ट

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? क्या यह जावा भी है?
leonheess

42
महोदय, यह कोटलिन प्रोग्रामिंग भाषा है। जावा समतुल्य होगाConstraintLayout.LayoutParams params = (ConstraintLayout.LayoutParams) button1.getLayoutParams();
azizbekian

1
मुझे लगता है कि आप लिखना भूल button1.layoutParams = params
सुमित सोनवणे

1
@sumitsonawane, इसकी आवश्यकता नहीं है, क्योंकि हम उस उदाहरण को बदल रहे हैं और उसके बाद हम प्रदर्शन करते हैं button1.requestLayout(), फिर LayoutParamsहम उस उदाहरण का निरीक्षण करेंगे जिसे हमने उत्परिवर्तित किया है।
अजीजबेकिन

2
@azizbekian, हाँ, मेरे लिए अंतिम समाधान 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

मुझे पता है कि मेरा उत्तर बहुत देर से आया है, फिर भी मुझे यकीन है कि यह दूसरों की मदद करेगा जो यहाँ बहुत रोकते हैं। यह लेख मेरा नहीं है, लेकिन मैंने कुछ बदलाव किए हैं, कहा जा रहा है कि आपको यहां पूरा लेख देखने की कोशिश करनी चाहिए

बाधा सेट

जावा कोड में बाधा सेट के साथ काम करने की कुंजी कांस्ट्रेसेटसेट क्लास है। इस वर्ग में कई विधियाँ सम्‍मिलित हैं, जो एक कॉन्‍ट्रैट्रिनलाईट उदाहरण के लिए अवरोध बनाने, कॉन्फ़िगर करने और लागू करने जैसे कार्यों की अनुमति देती हैं। इसके अलावा, एक ConstraintLayout उदाहरण के लिए वर्तमान बाधाओं को एक constraintSet ऑब्जेक्ट में कॉपी किया जा सकता है और अन्य बाधाओं (संशोधनों के साथ या बिना) के लिए समान बाधाओं को लागू करने के लिए उपयोग किया जाता है।

किसी अन्य जावा ऑब्जेक्ट की तरह एक कॉन्स्टेंटसेट उदाहरण बनाया जाता है:

ConstraintSet set = new ConstraintSet();

एक बार एक बाधा निर्धारित किए जाने के बाद, कार्य की एक विस्तृत श्रृंखला को निष्पादित करने के लिए तरीकों को उदाहरण पर बुलाया जा सकता है। निम्न कोड एक बाधा सेट को कॉन्फ़िगर करता है जिसमें बटन दृश्य के बाईं ओर 70dp के मार्जिन के साथ एक EditText दृश्य के दाहिने हाथ से जुड़ा होता है:

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

बाधा को एक लेआउट में लागू करना एक बार जब बाधा सेट को कॉन्फ़िगर किया जाता है, तो इसे लागू होने से पहले इसे एक ConstraintLayout उदाहरण पर लागू किया जाना चाहिए। एक बाधा सेट को कॉल के माध्यम से applyTo () पद्धति पर लागू किया जाता है, लेआउट ऑब्जेक्ट के संदर्भ से गुजर रहा है जिसमें सेटिंग्स लागू की जानी हैं:

set.applyTo(myLayout);

वहाँ बहुत अधिक सामान आप के साथ कर सकते हैं ConstraintSetएपीआई के , क्षैतिज और ऊर्ध्वाधर पूर्वाग्रह की स्थापना, क्षैतिज और लंबवत रूप से केंद्र, चेन और बहुत अधिक हेरफेर।

वास्तव में अच्छा पढ़ा।

फिर, यह सिर्फ एक अनुकूलन है।


0

एज़िज़बेकियन के जवाब के अलावा , मुझे दो बातों की ओर इशारा करते हैं:

  1. यदि बाएं / दाएं काम नहीं किया, तो इस तरह से शुरू / समाप्त करने का प्रयास करें:

params.startToEnd = button2.id

  1. यदि आप एक बाधा को दूर करना चाहते हैं, तो इस तरह UNSET ध्वज का उपयोग करें:

params.startToEnd = ConstraintLayout.LayoutParams.UNSET

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.