web-dev-qa-db-ja.com

フラグメント内でAnkoDSLを使用するにはどうすればよいですか?

Github wikiページActivityインスタンスで使用されるこの例を示します。

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    verticalLayout {
        padding = dip(30)
        editText {
            hint = "Name"
            textSize = 24f
        }
        editText {
            hint = "Password"
            textSize = 24f
        }
        button("Login") {
            textSize = 26f
        }
    }
}

Fragment内で同じことを行う方法は?

そのverticalLayoutブロックをonCreateViewに入れようとしましたが、メソッドを解決できません。私が追加しました anko-support-v4依存関係ですが、それでも運がありません。

14
akhy

_anko-support-v4_ソースコードといくつかの試行錯誤を掘り下げた後、それが正しい/推奨される方法かどうかはわかりませんが、回避策を見つけました。少し文書化されていないようです。

私のFragmentコードからのサンプル:

_override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? {

    return UI {
        verticalLayout {
            linearLayout {
                avatar = imageView().lparams(width = dip(48), height = dip (48))
                name = textView().lparams(width = 0, weight = 1f)
            }

            linearLayout {
                // ...
            }
        }
    }.toView()
} 
_

UI { ... }.toView()Fragment.onCreateView(...)にラップされたレイアウトDSLを返します

13
akhy

Anko 0.8では、UIを別のクラスに保持して他の場所で再利用できるようにする場合は、AnkoComponentを使用することもできます。

_class FragmentUi<T>: AnkoComponent<T> {
    override fun createView(ui: AnkoContext<T>) = with(ui) {
        verticalLayout {
            // ...
        }
    }
}
_

フラグメントonCreateView()でそれを呼び出すことができます

_override fun onCreateView(inflater: LayoutInflater, container: ViewGroup, savedInstanceState: Bundle?): View
        = FragmentUi<Fragment>().createView(AnkoContext.create(ctx, this))
_
21
Brucelet

Anko 0.8.1の時点で、正しいコードは次のようになります。

override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? {
    return UI {
        verticalLayout {
            linearLayout {
                // ...
            }
            linearLayout {
                // ...
            }
        }
    }.view
} 
7
Eefret