2017-11-13 1 views
0

Mein ultimatives Ziel ist es, meine Content-Widgets in eine benutzerdefinierte Ansicht zu verschieben und diese Ansicht in einem Anko-Layout in meiner MainView zu instanziieren. Ich dachte, ich hätte das an einem Punkt, aber ich kann es nicht reproduzieren.Warum wird CreateView nie aufgerufen?

Als ich mit dem folgenden Code ausführen, wird der Inhalt in den createView der MainContextView nie angezeigt und ich habe nie die Meldung „Erstellen Hauptkontextansicht“ sehen, aber ich tun, um die Meldung „Hauptinhalt Ansicht“ zu sehen.

Ich beginne mit einer MainContextView

class MainContextView(context: Context) : ViewGroup(context), AnkoComponent<Context> { 

    lateinit var textBox: EditText 
    lateinit var button: Button 
    lateinit var clickCount: TextView 

    override fun createView(ui: AnkoContext<Context>) = with(ui) { 
     println("creating main context view") 
     verticalLayout { 
      themedEditText { 
       hint = "hi from main context" 
      } 
      button = themedButton { 
       text = "ok" 
      } 
      textBox = themedEditText { 
       hint = "hi" 
      } 
      clickCount = themedTextView { 
       text = "0" 
      } 
     } 
    } 

    override fun onLayout(p0: Boolean, p1: Int, p2: Int, p3: Int, p4: Int) { 
     println("onLayout called") 
    } 

} 

zu schaffen und nennen es aus meiner Hauptansicht

class MainView : AnkoComponent<MainActivity> { 

    lateinit var mainCtx: MainContextView 
    lateinit var textBox: EditText 
    lateinit var button: Button 
    lateinit var clickCount: TextView 
    lateinit var mainMenu: Menu 
    lateinit var settingItem: MenuItem 
    lateinit var otherItem: MenuItem 
    lateinit var floatingActionButton: FloatingActionButton 

    override fun createView(ui: AnkoContext<MainActivity>) = with(ui) { 
     coordinatorLayout { 
      verticalLayout { 
       themedAppBarLayout { 
        themedToolbar(theme = R.style.Base_ThemeOverlay_AppCompat_Dark_ActionBar) { 
         title = resources.getString(R.string.app_name) 
         popupTheme = R.style.AppTheme 
         mainMenu = menu 
         settingItem = mainMenu.add("My Settings") 
         otherItem = mainMenu.add("My Other") 
        } 
       }.lparams(width = matchParent, height = wrapContent) 

       // ************************************ 
       // HERE IS THE CALL TO THE CONTEXT VIEW 
       mainCtx = mainContextView { println("main content view ") } 
       // ************************************* 

      }.lparams(width = matchParent, height = wrapContent) { 
      } 
      floatingActionButton = floatingActionButton { 
       imageResource = android.R.drawable.ic_dialog_email 
      }.lparams { 
       margin = dip(10) 
       gravity = Gravity.BOTTOM or Gravity.END 
      } 
     } 
    } 
} 

Die Mainview genannt wird als der Inhalt Blick von der MainActivity

gesetzt
class MainActivity : AppCompatActivity() { 

    private lateinit var presenter: MainPresenter 

    override fun onCreate(savedInstanceState: Bundle?) { 
     super.onCreate(savedInstanceState) 
     val mainView = MainView() 
     mainView.setContentView(this) 
     presenter = MainPresenter(mainView) 

    } 

} 

Und schließlich die ViewManger-Erweiterungen

Antwort

0

Ich fand mein Problem, es hatte damit zu tun, dass meine Unteransicht als eine Unterklasse von View/ViewGroup definiert wurde, aber keine der Methoden wirklich implementierte.

Wie sich herausstellt, war das nicht wirklich die richtige Richtung. Die Lösung basiert auf einem Kommentar zu diesem issue

Hier sind einige der wichtigsten Teile der Lösung, ich habe auch eine Gist mit dem vollständigen Code erstellt. Die Erweiterungsfunktion erstellt eine Instanz der Klasse "SubView" und ruft dann die Methode createView() in der Methode ankoView() auf. Außerdem übergibt es die erstellte Instanz an den Abschluss, der an die Erweiterungsfunktion übergeben wird. Dies ist der Schlüssel, da der Zugriff auf die in der Ansicht enthaltenen Widgets ermöglicht wird.

Die "Inhaltsansicht" erstellt das Layout und enthält einen Verweis auf die Widgets.

class MainContentView : AnkoComponent<Context> { 

    lateinit var textBox: EditText 
    lateinit var button: Button 
    lateinit var clickCount: TextView 

    override fun createView(ui: AnkoContext<Context>) = with(ui) { 
     verticalLayout { 
      button = themedButton { 
       text = "ok" 
      } 
      textBox = themedEditText { 
       hint = "hi" 
      } 
      clickCount = themedTextView { 
       text = "0" 
      } 
     } 
    } 
} 

in der Hauptansicht habe ich Felder zu den Widgets in der „Subview“ zu bezeichnen, die ich dann in der Schließung der mainContentView Instanz übergeben initialisieren.

lateinit var textBox: EditText 
lateinit var button: Button 
lateinit var clickCount: TextView 
private lateinit var mainMenu: Menu 
lateinit var settingItem: MenuItem 
lateinit var otherItem: MenuItem 
private lateinit var floatingActionButton: FloatingActionButton 


override fun createView(ui: AnkoContext<MainActivity>) = with(ui) { 
    coordinatorLayout { 
     verticalLayout { 
      themedAppBarLayout { 
       themedToolbar(theme = R.style.Base_ThemeOverlay_AppCompat_Dark_ActionBar) { 
        title = resources.getString(R.string.app_name) 
        popupTheme = R.style.AppTheme 
        mainMenu = menu 
        settingItem = mainMenu.add("My Settings") 
        otherItem = mainMenu.add("My Other") 
       } 
      }.lparams(width = matchParent, height = wrapContent) 
      mainContentView { 
       button = it.button 
       textBox = it.textBox 
       clickCount = it.clickCount 
      }.lparams(width = matchParent, height = wrapContent) 
     }.lparams(width = matchParent, height = wrapContent) 
     floatingActionButton = floatingActionButton { 
      imageResource = android.R.drawable.ic_dialog_email 
     }.lparams { 
      margin = dip(10) 
      gravity = Gravity.BOTTOM or Gravity.END 
     } 
    } 
} 
Verwandte Themen