kotlin.TypeCastException:null无法强制转换为非null类型android.support.v7.widget.Toolbar

时间:2017-08-27 02:47:03

标签: android fragment kotlin

我是Android的新手。我的问题可能是什么情况?我试图将我的片段呈现给MainActivity。任何建议都会有帮助。感谢

主要活动类......

class NavigationActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelectedListener {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.fragment_schedule)

        val toolbar = findViewById(R.id.toolbar) as Toolbar
        setSupportActionBar(toolbar) // setup toolbar
        toolbar.setNavigationIcon(R.drawable.ic_map)

        val drawer = findViewById(R.id.drawer_layout) as DrawerLayout
        val toggle = ActionBarDrawerToggle(
                this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close)
        drawer.addDrawerListener(toggle) // navigation drawer
        toggle.syncState()

        val navigationView = findViewById(R.id.nav_view) as NavigationView
        navigationView.setNavigationItemSelectedListener(this) //setup navigation view

}

My Fragment Class ..

 class fragment_schedule : Fragment() {
 override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?,
                              savedInstanceState: Bundle?): View? {
   // Inflate the layout for this fragment
   return inflater!!.inflate(R.layout.fragment_schedule, container, false)
}

2 个答案:

答案 0 :(得分:0)

您的布局显然没有标识为R.id.toolbar的工具栏组件,这就是findViewById(...)返回null无法投放到Toolbar的原因。

Kotlin的一部分中,空安全很重要。它可以帮助您在开发的早期阶段揭示大多数NPE。在官方Kotlin网站上阅读more about null safety

如果工具栏组件的存在是必不可少的,那么永远不要让val toolbar变量为空。

在这种情况下,您当前的代码是正确的,不要更改它。而是纠正您的布局/错误的工具栏ID问题。

var toolbar: Toolbar? = null定义类型为Toolbar的可空变量,如果您的活动布局中没有工具栏组件,则不会出现异常,但如果您希望真正拥有此组件,则稍后会得到其他例外情况,甚至会导致您的程序无法预测,这会让您或应用用户感到惊讶

另一方面,您应该在使用可空变量

时进行空安全检查

在这种情况下,您的代码应该略有改变。重要的部分:

val toolbar = findViewById(R.id.toolbar) as Toolbar?

?表示如果findViewById返回null,那么此null将分配给val toolbar而非kotlin.TypeCastException: null cannot be cast to non-null type android.support.v7.widget.Toolbar例异常

完整代码块示例:

 val toolbar = findViewById(R.id.toolbar) as Toolbar? // toolbar now is nullable 

 if(toolbar != null) {
 // kotlin smart cast of toolbar as not nullable value
        setSupportActionBar(toolbar) // setup toolbar
        toolbar.setNavigationIcon(R.drawable.ic_map)

        val drawer = findViewById(R.id.drawer_layout) as DrawerLayout
        val toggle = ActionBarDrawerToggle(
                this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close)
        drawer.addDrawerListener(toggle) // navigation drawer
        toggle.syncState()
}

答案 1 :(得分:0)

另一个原因可能是您已将setContentView置于导致此异常的项目下面。至少这是我将其固定在我身边的方式。