2017-11-13 13 views
0

私の究極の目標は、コンテンツウィジェットをカスタムビューに移動し、メインビューのAnkoレイアウトでそのビューをインスタンス化できるようにすることです。私はこれが一度に働いていると思ったが、それを再現することはできない。なぜcreateViewは呼び出されませんか?

私は次のコードを使用して実行すると、MainContextViewのcreateViewの内容が表示されることはありませんし、私は「メインのコンテキストビューを作成する」メッセージを見ることはありませんが、私はを行うは、メッセージ「メインコンテンツビュー」を参照してください。

私は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") 
    } 

} 

を作成することによって開始し、MAINVIEWがMainActivity

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) 

    } 

} 

からコンテンツビューとして設定呼ばれている私のメインビューから

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

それを呼び出します最後にViewMangerの拡張機能

inline fun ViewManager.mainContextView(theme: Int = 0) = mainContextView(theme) {} 

inline fun ViewManager.mainContextView(theme: Int = 0, init: MainContextView.() -> Unit): MainContextView { 
    return ankoView({ MainContextView(it) }, theme, init) 
} 

答えて

0

問題が見つかりました。サブビューはView/ViewGroupのサブクラスとして定義されていましたが、実際には実装されていませんでした。

本当に正しい方向ではありませんでした。解決策はこれに関するコメントに基づいていますissue

ここでは、ソリューションの重要な部分のいくつかを示します。Gistをフルコードで作成しました。

拡張機能は、 "SubView"クラスのインスタンスを作成し、次にankoView()メソッドのcreateView()メソッドを呼び出します。また、作成されたインスタンスをクロージャに渡します。このクロージャは、ビューに含まれるウィジェットへのアクセスを可能にする重要な拡張機能に渡されます。

「コンテンツビュー」はレイアウトを作成し、ウィジェットへの参照を保持します。メインビューで

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

私はその後mainContentViewインスタンスに渡されたクロージャで初期化する「サブビュー」のウィジェットを参照するフィールドを持ちます。

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 
     } 
    } 
} 
関連する問題