210202

[동적버튼 생성] 코틀린으로 동적버튼 생성, margin값 dp로 설정 본문

Android/기능구현

[동적버튼 생성] 코틀린으로 동적버튼 생성, margin값 dp로 설정

dev210202 2020. 6. 27. 13:59

동적으로 버튼을 생성하려면 코드상에서 View를 만들어서 추가해주어야한다.

 

동적으로 버튼을 생성하는 방법은 다음과 같다.

 

1. 생성할 액티비티에서 onCreate안에 버튼을 생성해준다.

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

        val dynamicButton = Button(this)
}

여기서는 dynamicButton으로 생성해주었다.

 

2. dynamicButton의 속성을 설정해준다.

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

        val dynamicButton = Button(this)
        val layoutParams = LinearLayout.LayoutParams(
            LinearLayout.LayoutParams.MATCH_PARENT,
            LinearLayout.LayoutParams.WRAP_CONTENT
        )
        dynamicButton.layoutParams = layoutParams
}

여기서 layoutParams를 만들어서 설정해준다. LinearLayout.~ 로 생성한 이유는 내가 쓰려고하는 버튼을 LinearLayout으로 배치하기 위함이고 다른것으로 바꿔도 된다. 그 다음 witdth, height를 자신이 설정하고자하는 크기에 맞춘다.

나는 width는 match_parent, height는 wrap_content로 설정하기 위해 다음과 같이 설정했다. 

 

3. 버튼이 들어갈 View에 추가

<LinearLayout
    android:id="@+id/buttonview"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <Button
      android:id="@+id/serachlocationbutton1"
      style="@style/MainSearchLocationButton"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:text="1번 위치를 입력해주세요"></Button>

    <Button
      android:id="@+id/serachlocationbutton2"
      style="@style/MainSearchLocationButton"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:text="2번 위치를 입력해주세요"></Button>

</LinearLayout>

나는 xml 상에서 id가 buttonview라고 되어있는 view에 넣을 것이다.

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

	val buttonview = findViewById<LinearLayout>(R.id.buttonview)
        
        val dynamicButton = Button(this)
        val layoutParams = LinearLayout.LayoutParams(
            LinearLayout.LayoutParams.MATCH_PARENT,
            LinearLayout.LayoutParams.WRAP_CONTENT
        )
        dynamicButton.layoutParams = layoutParams
        buttonview.addView(dynamicButton)
}

이렇게 추가하면 동적으로 생성이 된다.

 

+ margin값 설정(dp로)

layoutParams.setMargins(0, 0, 0, 0)

위의 코드로 left, top, right, bottom margin을 줄 수 있는데 여기서는 Int로 설정되어있다. 따라서 dp로 변환하는 작업이 필요하다.

 

dp로 바꾸는 방법은 다음과 같다.

var displayMetrics = resources.displayMetrics
var dp = Math.round(value * displayMetrics.density)

여기서 value자리에 원하는 값을 넣으면 dp로 바뀐다. 쉽게 사용하려면 다음과 같이 함수로 바꿔서 사용할 수 있다.

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

	val buttonview = findViewById<LinearLayout>(R.id.buttonview)
        
        val dynamicButton = Button(this)
        val layoutParams = LinearLayout.LayoutParams(
            LinearLayout.LayoutParams.MATCH_PARENT,
            LinearLayout.LayoutParams.WRAP_CONTENT
        )
        dynamicButton.layoutParams = layoutParams
        layoutParams.setMargins(changeDP(10), changeDP(20), changeDP(10), 0)
        buttonview.addView(dynamicButton)
}

private fun changeDP(value : Int) : Int{
        var displayMetrics = resources.displayMetrics
        var dp = Math.round(value * displayMetrics.density)
        return dp
}

changeDP 함수로 값을 넣으면 자동으로 dp로 바뀐값이 리턴되게해서 쓰면 쉽다. 

Comments