Search code examples
androidkotlinandroid-linearlayout

Android - LinearView - Dynamic instanciation of views


I am trying to create functions that instanciate some views in a Linear Layout

private lateinit var layout: LinearLayout 
var par = LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.WRAP_CONTENT)

override fun onCreate(savedInstanceState: Bundle?) {
    //The init stuff with binding
    layout = binding.root.findViewById(R.id.gamelayout)
    lpar.setMargins(10,10,10,10)

    test()
}

private fun instanciateText(s:String)
{
    val tv = TextView(this)
    tv.text = s
    tv.layoutParams = par
    layout.addView(tv)
}

fun instanciateImage()
{
    val iv = ImageView(this)
    iv.setImageResource(R.drawable.start1)
    iv.layoutParams = par
    layout.addView(iv)
}

fun test(){
    instanciateText("Text 1 ")
    instanciateImage()
    instanciateText("Text 2 ")
}

It works fine with text, but whith images, the views are so far from each other, and i cannot find why

screenshot


Solution

  • If a stretchable ImageView is added, it is to be expanded to the maximum extent so the LinearLayout gets 100%-filled with children. It's right behavior. If you'd like to avoid that, specify ImageView.adjustViewBounds = true.

    fun instanciateImage()
    {
        val iv = ImageView(this)
        iv.setImageResource(R.drawable.start1)
        iv.layoutParams = par
    
        iv.adjustViewBounds = true
    
        layout.addView(iv)
    }