2015-11-16 13 views
11

Github wiki pageActivityインスタンスで使用されるように、この例を示します。Anko DSLを断片の中で使うには?

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依存関係を追加しましたが、まだ運がありません。

+0

は 'verticalLayout'メソッドに移動してみてください。私の推測では、それは 'Activity'で定義されているため、内部では動作しますが、外部では動作しません。 – voddan

+0

私が言ったことが真実なら、解決策は適切なプロパティにレイアウトを割り当てることです。あなたの例では、それは空気中でハングします – voddan

+0

@voddanはい、それは 'Activity'でのみ利用可能です。最後に、私は回避策を見つけました。すぐに答えを投稿します。 – akhyar

答えて

9

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() 
} 

私はFragment.onCreateView(...)したい場合にも、AnkoComponentを使用することができアンコ0.8で

+0

余裕のあるチャンネルで、APIの意図された使い方について、#ankoスレッドhttp://kotlinslackin.herokuapp.com/にもっと尋ねることをお勧めします。私にとって、この不一致はバグのようだが、そこにいる人は確かに分かっている。 – voddan

+3

はい、現在のバージョンのAnko(0.7.3)は正しい方法です。 – yanex

+1

@yanexとAnko 0.8.1の正しい方法は何ですか? – netimen

14

UI { ... }.toView()に包まれたレイアウトDSLを返しますよUIを別のクラスに保持して、別のクラスに再利用できるようにします。

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

あなたは正しいコードは次のようになりあんこ0.8.1のとおり

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

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

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