7

Anko を使用する最大のメリットは、その再利用性にあると読みました。しかし、その正確な例を見つけることができませんでした。

現在、新しい Android レイアウト システムでは、ボイラー プレートは次のようになっています。

DrawerLayout (with some setup)
   CoordinatorLayout (with some setup)
      AppBarLayout (with some setup)
         ToolBar
      <The Main Content>
   NavigationView (with header inflated)

上記のレイアウト構造から、<The Main Content>varry のみです。そして、多くの場合、これらの儀式のセットアップは、ほとんどすべての活動で繰り返されました.

そのため、ここでAnkoと一緒に、その問題について再利用可能な解決策があるかどうかを考えています. 汎用レイアウトで再利用できるとは思っていませんが、少なくともプロジェクトの儀式用コードを最小限に抑えることができます。多分私は次のようなものが必要です:

class MainUI: AnkoComponent<MainActivity> {
  override fun createView(ui: AnkoContext<MainActivity>): View{
     return with(ui) {
        myCustomRootLayout {
           //here is what <The Main Content> will be
        }
     }
  }
}

上記のコードから、myCustomRootLayout(DrawerLayout、CoordinatorLayout など) などのルート レイアウトのすべての儀式的なセットアップが行われることを期待しています。

それは可能ですか?

編集 私の質問は次のとおりだと思います:他のコンポーネントをホストできるカスタムコンポーネントを作成する方法

4

2 に答える 2

4

コードを再利用する 1 つの方法は、次のように単純myCustomRootLayoutに拡張メソッドに抽出することです。

class MainUI: AnkoComponent<MainActivity> {
    override fun createView(ui: AnkoContext<MainActivity>): View {
        return with(ui) {
            myCustomRootLayout {
               recyclerView()
            }
        }
    }
}

fun <T> AnkoContext<T>.myCustomRootLayout(customize: AnkoContext<T>.() -> Unit = {}): View {
    return relativeLayout {
        button("Hello")
        textView("myFriend")
        customize()
    }
}

ただし、ドキュメントに記載されているように

追加のクラスを作成せずに DSL を (他の場所でも) 直接使用することもできますがonCreate()、別のクラスに UI を配置すると便利なことがよくあります。提供されている AnkoComponent インターフェイスを使用すると、DSL レイアウトのプレビュー機能も無料で利用できます。

再利用可能な部分を個別に抽出することをお勧めしますAnkoComponent

class MainUI : AnkoComponent<MainActivity> {
    override fun createView(ui: AnkoContext<MainActivity>): View {
        return with(ui) {
            MyCustomRootLayout<MainActivity>({
                recyclerView()
            }).createView(ui)
        }
    }
}


class MyCustomRootLayout<T : Context>(val customize: AnkoContext<T>.() -> Unit = {}) : AnkoComponent<T> {
    override fun createView(ui: AnkoContext<T>) = with(ui) {
        relativeLayout {
            button("Hello")
            textView("myFriend")
            customize()
        }
    }
}
于 2016-10-17T04:47:15.530 に答える