diadia

興味があることをやってみる。自分のメモを残しておきます。

kotlin android studio 動的にlayoutファイルを作成する

はじめに

レイアウトファイルに記述するのではなく、Activityにて動的にレイアウトファイルを記述する方法をこのページにまとめた。このほかあらゆるViewを動的に生成するには、検索方法にコツが必要になる。コツとしては、ImageView width set programaticalyのようにprogramaticalyとすれば知りたい情報が出てきやすい。

動的にレイアウトファイルを作成する

資料:https://www.javadrive.jp/android/linearlayout/index3.html
http://programming-beginner-memo.com/?p=854
https://qiita.com/shun-shun123/items/7fab7ad3c6b040803f52

イメージ

まず子Viewを追加したいLinearLayoutオブジェクトを取得する。

TextViewのオブジェクトを作成する。

LayoutParamsオブジェクトを作成する。

TextViewオブジェクトにLayoutParamsを設置する。

LinearLayoutオブジェクト.addView(TextViewオブジェクト)

これで追加することができる。

具体的なコード

class MainActivity : AppCompatActivity() {
 
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        
        //子Viewを追加したいLinearLayoutオブジェクトを取得する。
        val linearlayout = findViewById<LinearLayout>(R.id.linearlayout_id)
        
        //TextViewオブジェクトを作成する。
        val textview_obj = TextView(this)
        textview_obj.text = "新しいオブジェクト"
        
        //LayoutParamsオブジェクトを作成する。
        va textview_params = LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT)
        
        //TextViewオブジェクトにLayoutParamsを設置する。
        textview_obj.layoutParams = textview_params
        
        //子Viewオブジェクトを追加する
        linearlayout.addView(textview_obj)
        
        

LinearLayoutオブジェクトにvertical, horaizonal属性を設置する方法

LinearLayoutはval ll_obj = LinearLayout(this)で生成する事ができる。問題はそのオブジェクトの属性値をどのように定めるか。
layout_height, layout_widthは以下の方法で設定できる。

  • LinearLayout.LayoutParams.WRAP_CONTENT
  • LinearLayout.LayoutParams.MATCH_PARENT

ll_objにandroid:orientationを設定するにはorientationアトリビュートを使う。

  • ll_obj.orientation = LinearLayout.VERTICAL
  • ll_obj.orientation = LinearLayout.HORIZONTAL

参考:https://www.androidly.net/114/android-viewgroups-linearlayout-relativelayout

Viewオブジェクトにwidth, heightを設定する方法

基本的な構造は以下の通りである。

Viewオブジェクト.layoutParams.widthまたはheight = INT
//使用例
iv_test.layoutParams.width = 200

ちなみにこれを設定する時にエラーが出てしまった。これはaddViewで行った後じゃないと設定できなかった。

動的に生成したwidgetにidを付す場合

val radio_btn = RadioButton(this)
radio_btn.setId(generateViewId())

android/view/View.html#setid

android/view/View.html#generateviewid

ちなみに動的に作成したwidgetに付したidを取得するにはgetId()メソッドを使えばよい。

val radio_btn_id:Int = radio_btn.getId()

android/view/View.html#getId())