2015-11-16 9 views
11

Die Github wiki page zeigen dieses Beispiel in Activity Beispiel verwendet werden:Wie benutzt man Anko DSL in einem Fragment?

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

Wie das gleiche in einem Fragment zu tun?

Ich habe versucht, verticalLayout Block in onCreateView zu setzen, aber die Methode kann nicht gelöst werden. Ich habe anko-support-v4 Abhängigkeit hinzugefügt, aber immer noch kein Glück.

+0

versuchen, auf die 'verticalLayout' Methode zu navigieren . Meine Vermutung ist, dass es auf "Aktivität" definiert ist, also funktioniert es in ihm, aber nicht außerhalb. – voddan

+0

Wenn das, was ich gesagt habe, wahr ist, dann wäre eine Lösung, das Layout einer geeigneten Eigenschaft zuzuweisen. In Ihrem Beispiel hängt es irgendwie in der Luft – voddan

+0

@voddan ja, es ist nur in 'Activity' verfügbar. Schließlich habe ich eine Problemumgehung gefunden, werde die Antwort bald – akhyar

Antwort

9

Nach dem Graben anko-support-v4 Quellcode plus einige Test-und Fehler, habe ich eine Workaround gefunden, obwohl ich nicht sicher bin, ob es der richtige/empfohlene Weg ist. Es scheint ein wenig undokumentiert zu sein.

Eine Probe von meinem Fragment Code:

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

ich Layout DSL bin Rückkehr in Fragment.onCreateView(...) in UI { ... }.toView() gewickelt

+0

posten Ich empfehle Ihnen, fragen Sie mehr über die beabsichtigte Verwendung von API auf dem Slack-Kanal, #anko Thread: http://kotlinslackin.herokuapp.com/. Weil diese Inkonsistenz für mich wie ein Käfer aussieht, aber die Leute dort wissen es sicher. – voddan

+3

Ja, es ist der richtige Weg für die aktuelle Version von Anko (0.7.3). – yanex

+1

@yanex und was ist der richtige Weg für Anko 0.8.1? – netimen

14

Mit Anko 0.8 können Sie auch eine AnkoComponent, wenn Sie verwenden möchten Halten Sie Ihre Benutzeroberfläche in einer separaten Klasse, damit Sie sie woanders wiederverwenden können.

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

Sie können es in Ihrem Fragment nennen onCreateView() von

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

Ab Anko 0.8.1 der richtige Code wäre:

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