Ограничение ширины TextView не работает динамически - PullRequest
0 голосов
/ 03 января 2019

Почему TextView отказывается двигаться, хотя я добавил ограничения для него?Все, что я хочу, это чтобы текст в TextView обернулся с его родителем CardView.Я уже добавил следующее, но все еще не изменилось:

  • ConstraintSet.MATCH_CONSTRAINT_WRAP
  • Параметры макета

enter image description here

class MonFragment : androidx.fragment.app.Fragment() {
    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        return inflater.inflate(R.layout.fragment_sv_cl, container, false)
    }

    override fun onActivityCreated(savedInstanceState: Bundle?) {
        val v = view
        val mCLMain = v!!.findViewById<ConstraintLayout>(R.id.my_constraintLayout_SV)
        val mCLWarning = ConstraintLayout(context)

        // Layout Parameters
        val rlpIVWarning = ConstraintLayout.LayoutParams(ConstraintLayout.LayoutParams.WRAP_CONTENT, ConstraintLayout.LayoutParams.WRAP_CONTENT)
        val rlpTVWarning = ConstraintLayout.LayoutParams(ConstraintLayout.LayoutParams.WRAP_CONTENT, ConstraintLayout.LayoutParams.WRAP_CONTENT)

        // Values for DP (density independent pixels) measuring
        val r = context!!.resources
        val fourDp = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 4f, r.displayMetrics).toInt()
        val tenDp = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 10f, r.displayMetrics).toInt()


        /*
         * Creating 'Warning' CardView items
         */
        // 'Warning' icon
        val ivWarning = ImageView(context)
        ivWarning.setImageResource(R.drawable.ic_warning)
        ivWarning.layoutParams = rlpIVWarning

        // 'Warning' text
        val tvWarning = TextView(context)
        tvWarning.text = "1 is not the first prime number."
        TextViewCompat.setTextAppearance(tvWarning, android.R.style.TextAppearance_Medium)
//        tvWarning.width = 0
        tvWarning.layoutParams = rlpTVWarning

        // Creating CardViews
        val cvWarning = context?.let { CardView(it) }
        when {
            cvWarning != null -> {
                cvWarning.radius = fourDp.toFloat()
                cvWarning.setContentPadding(tenDp, tenDp, tenDp, tenDp)
                cvWarning.useCompatPadding = true
                cvWarning.cardElevation = fourDp.toFloat()
            }
        }

        // Generated IDs for views
        cvWarning!!.id = View.generateViewId()
        ivWarning.id = View.generateViewId()
        tvWarning.id = View.generateViewId()

        // Add views to appropriate views
        mCLMain.addView(cvWarning)
        cvWarning.addView(mCLWarning)
        mCLWarning.addView(ivWarning)
        mCLWarning.addView(tvWarning)

        // Constraint Set 1 (for main ConstraintLayout)
        val mConstraintSet1 = ConstraintSet()
        mConstraintSet1.clone(mCLMain)
        mConstraintSet1.connect(cvWarning.id, ConstraintSet.TOP, mCLMain.id, ConstraintSet.TOP, 0)
        mConstraintSet1.connect(cvWarning.id, ConstraintSet.BOTTOM, tvTitle.id, ConstraintSet.TOP, 0)
        mConstraintSet1.connect(tvTitle.id, ConstraintSet.TOP, cvWarning.id, ConstraintSet.BOTTOM, 0)
        mConstraintSet1.connect(tvTitle.id, ConstraintSet.START, mCLMain.id, ConstraintSet.START, tenDp)
        mConstraintSet1.connect(tvTitle.id, ConstraintSet.END, mCLMain.id, ConstraintSet.END, 0)
        mConstraintSet1.applyTo(mCLMain)

        // Constraint set 2 (for 'Warning' CardView)
        val mConstraintSet2 = ConstraintSet()
        mConstraintSet2.clone(mCLWarning)
        mConstraintSet2.constrainDefaultWidth(ivWarning.id, ConstraintSet.MATCH_CONSTRAINT_WRAP)
        mConstraintSet2.connect(ivWarning.id, ConstraintSet.START, mCLWarning.id, ConstraintSet.START, 0)
        mConstraintSet2.connect(ivWarning.id, ConstraintSet.END, tvWarning.id, ConstraintSet.START, tenDp)
        mConstraintSet2.connect(tvWarning.id, ConstraintSet.START, ivWarning.id, ConstraintSet.END, tenDp)
        mConstraintSet2.connect(tvWarning.id, ConstraintSet.END, mCLWarning.id, ConstraintSet.END, 0)
        mConstraintSet2.applyTo(mCLWarning)

        super.onActivityCreated(savedInstanceState)
    }
}

1 Ответ

0 голосов
/ 03 января 2019

LayoutParams для вашего предупреждения выглядело неправильно для меня.Вы установили ширину WRAP_CONTENT, но вместо этого вы, вероятно, хотите, чтобы она была MATCH_CONSTRAINT.Таким образом, вы можете ограничить края предупреждающим изображением и стороной карты.

Кроме того, почему вы используете ConstraintLayout для этого?Кажется, что это было бы значительно проще, чем CardView, содержащий LinearLayout, содержащий ImageView + TextView.

...