【问题标题】:Streamlined Adding and Replacing Fragments in Kotlin在 Kotlin 中简化添加和替换片段
【发布时间】:2017-10-09 15:44:37
【问题描述】:

我正在开发一个只有几个屏幕的小型应用程序,我想将其实现为一个调用多个片段的单个 Activity。我在 Java for Android 方面有一些经验,但使用 Kotlin 是一个新领域。 我已经了解如何在 Kotlin 中添加片段,但我想以可重用的方式进行。 我遇到了here 提到的解决方案,它可以工作,但有些东西我不太明白。到目前为止,我的以下 MainActivity 有效,但我必须像我在这里所做的那样在 onCreate 方法中创建 var welcomeFragment:

class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelectedListener {

    override fun onCreate(savedInstanceState: Bundle?) {

        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        setSupportActionBar(toolbar)

        val toggle = ActionBarDrawerToggle(
                this, drawer_layout, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close)
        drawer_layout.addDrawerListener(toggle)
        toggle.syncState()

        nav_view.setNavigationItemSelectedListener(this)

        var welcomeFragment = Fragment.instantiate(this@MainActivity,
                WelcomeFragment::class.java!!.getName())

        addFragment( welcomeFragment, welcome)

    }

    inline fun android.support.v4.app.FragmentManager.inTransaction(func:               android.support.v4.app.FragmentTransaction.() -> android.support.v4.app.FragmentTransaction) {
    beginTransaction().func().commit()
    }


    fun AppCompatActivity.addFragment(fragment: Fragment, frameId: Int){
        supportFragmentManager.inTransaction { add(frameId, fragment) }
    }

    fun AppCompatActivity.replaceFragment(fragment: Fragment, frameId: Int) {
        supportFragmentManager.inTransaction{replace(frameId, fragment)}
    }




    }

我似乎不明白为什么我不能声明该属性并稍后分配它。可以使用 lateinit 声明它,但是当我尝试像这样分配它时:

var welcomeFragment = Fragment.instantiate(this@MainActivity,
                WelcomeFragment::class.java!!.getName())

我收到“类型不匹配 - 必需:片段,找到:WelcomeFragment!” 另外,如果我尝试这样做:

addFragment(WelcomeFragment, welcome)

Android Studio 抱怨 WelcomeFragment '(现在只是空的,除了一个 TextView 说“欢迎”)没有伴随对象。我试图做一个,但我真的不明白它必须做什么。阅读文档对我也没有帮助。

所以我的问题是:我如何正确地进行实例化,或者当我的大部分片段都只是一个实例时,我是否必须这样做。我可以通过在我的片段中正确添加伴随对象来避免这种情况吗?看起来怎么样?

对此的任何帮助、对我在这里的误解的暗示或指出的一般愚蠢将不胜感激!

【问题讨论】:

  • 我现在花了一段时间习惯了 Kotlin,我想当我问这个问题时我只是不明白如何正确地做这些事情。所以现在我认为这不是一个有用的问题。

标签: android android-fragments kotlin


【解决方案1】:

请小心导入,有时我们有android.support.v4.app.Fragment 然后我们就不能在里面使用android.app.Fragment.instantiate函数了。

【讨论】:

  • 你到底是什么意思?我可以把他们混在一起吗?我所有的导入都是 android.support.v4.app.Fragment 类的。
  • “类型不匹配 - 必需:片段,找到:WelcomeFragment!”是尝试访问 Fragment.instantiate 并传递另一个类时的典型错误。我只是说。我会尝试重现你的错误
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多