【问题标题】:Kottlin app closes right after launching - App ErrorKotlin 应用程序在启动后立即关闭 - 应用程序错误
【发布时间】:2021-01-19 17:46:00
【问题描述】:

我正在用 kotlin 开发我的第一个应用程序。我偶然发现了这个错误,我的应用程序在启动后立即关闭。我已经实现了一个菜单,现在正在为主页创建一个带有一些图像的网格视图。我不知道是什么导致了这个错误,但我知道它与网格视图代码有关,因为我首先实现了菜单并且应用程序运行良好。可能是因为我试图在片段中而不是直接在 MainActivity 视图中执行网格视图吗?

MainActivity.kt


val TAG = "MainActivity"

    lateinit var gridView: GridView
    private var gridImageNames = arrayOf(
        "Golden Bridge", "Tampa Bay Buccaneers", "Chevrolet Camaro",
        "Vegetable Casserole", "Sweet and Sour Chicken", "Design Vector",
        "Pork Loin", "Sidney's Opera House", "Pasta Dish",
        "Dope Setup", "Singapore", "Tacos Dish",
        "Toquio", "Warm Salad Dish")
    private var gridImages = intArrayOf(
        R.drawable.bridge, R.drawable.buccaneers, R.drawable.camaro,
        R.drawable.casserole, R.drawable.chicken, R.drawable.design,
        R.drawable.lombo, R.drawable.operahouse, R.drawable.pasta,
        R.drawable.setup, R.drawable.singapore, R.drawable.tacos,
        R.drawable.toquio, R.drawable.warmsalad)

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

        val bottom_navigation: BottomNavigationView = findViewById(R.id.bottom_navigation)
        gridView = findViewById(R.id.home_grid)
        val mainAdapter = MainAdapter(this@MainActivity, gridImageNames, gridImages)
        gridView.adapter = mainAdapter

        val homeFragment = HomeFragment()
        val listsFragment = ListsFragment()
        val searchFragment = SearchFragment()

        bottom_navigation.setOnNavigationItemSelectedListener {
            when (it.itemId) {
                R.id.nav_home -> {
                    setCurrentFragment(homeFragment)
                    Log.i(TAG, "Home Selected")
                }
                R.id.nav_lists -> {
                    setCurrentFragment(listsFragment)
                    Log.i(TAG, "My Lists Selected")
                }
                R.id.nav_search -> {
                    setCurrentFragment(searchFragment)
                    Log.i(TAG, "Search Selected")
                }
            }
            true
        }

        gridView.onItemClickListener = AdapterView.OnItemClickListener { _, _, position, _ ->
            Toast.makeText(
                applicationContext, "You Clicked " + gridImageNames[+position],
                Toast.LENGTH_SHORT
            ).show()
        }
    }

    private fun setCurrentFragment(fragment : Fragment) =
        supportFragmentManager.beginTransaction().apply {
            replace(R.id.fl_wrapper, fragment)
            commit()
        }

MyAdapter.kt


internal class MainAdapter(
    private val context: Context,
    private val imageNames: Array<String>,
    private val images: IntArray
) : BaseAdapter(){
    private var layoutInflater: LayoutInflater? = null
    private lateinit var imageView: ImageView

    override fun getCount(): Int {
        return imageNames.size
    }

    override fun getItem(position: Int): Any? {
        return null
    }

    override fun getItemId(position: Int): Long {
        return 0
    }

    override fun getView(position: Int, convertView: View?, parent: ViewGroup): View? {
        var convertView = convertView
        if (layoutInflater == null) {
            layoutInflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
        }
        if (convertView == null){
            convertView = layoutInflater!!.inflate(R.layout.home_grid_row, null)
        }

        imageView = convertView!!.findViewById(R.id.grid_image)
        imageView.setImageResource(images[position])
        return convertView
    }
}

home_grid_row.xml


<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/colorPrimary">
    
        <ImageView
            android:id="@+id/grid_image"
            android:layout_width="100dp"
            android:layout_height="100dp"/>

</RelativeLayout>

fragment_home.xml


<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/colorPrimary">

    <GridView
        android:id="@+id/home_grid"
        android:numColumns="3"
        android:verticalSpacing="1dp"
        android:horizontalSpacing="1dp"
        android:background="@color/colorPrimary"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

</RelativeLayout>

Logcat 错误信息:


2021-01-19 18:08:10.127 6067-6067/cm.a12872_a18797.favlist E/AndroidRuntime: FATAL EXCEPTION: main
    Process: cm.a12872_a18797.favlist, PID: 6067
    java.lang.RuntimeException: Unable to start activity ComponentInfo{cm.a12872_a18797.favlist/cm.a12872_a18797.favlist.MainActivity}: java.lang.IllegalStateException: findViewById(R.id.home_grid) must not be null
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3782)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3961)
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:91)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:149)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:103)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2386)
        at android.os.Handler.dispatchMessage(Handler.java:107)
        at android.os.Looper.loop(Looper.java:213)
        at android.app.ActivityThread.main(ActivityThread.java:8178)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:513)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1101)
     Caused by: java.lang.IllegalStateException: findViewById(R.id.home_grid) must not be null
        at cm.a12872_a18797.favlist.MainActivity.onCreate(MainActivity.kt:38)
        at android.app.Activity.performCreate(Activity.java:8086)
        at android.app.Activity.performCreate(Activity.java:8074)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1313)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3755)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3961) 
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:91) 
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:149) 
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:103) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2386) 
        at android.os.Handler.dispatchMessage(Handler.java:107) 
        at android.os.Looper.loop(Looper.java:213) 
        at android.app.ActivityThread.main(ActivityThread.java:8178) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:513) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1101)

【问题讨论】:

  • 错误信息是什么?
  • 没有错误信息。该应用程序在启动后立即关闭
  • 能否请您从 logcat 发布相应的错误?
  • @S-Sh 我在问题末尾添加了logcat错误信息

标签: android android-layout kotlin


【解决方案1】:

您的代码正在寻找 ID 为 R.id.home_grid 的视图,但它不存在。检查您的 activity_main 布局文件并验证 R.id.home_grid 是否存在。

【讨论】:

  • 我的网格视图是在一个名为 fragment_home.xml 的片段中创建的。我将代码添加到问题中
  • @MachineTheGod 好吧,您在 MainActivity 中声明视图,使用 `gridView = findViewById(R.id.home_grid)`
  • 是的,因为我使用的是在 MainActivity 中显示片段的菜单,而不是使用其他活动。我也尝试在 HomeFragment kotlin 文件中编写属于 gridview 的代码,但我立即明白它不起作用,因为 MainActivity 没有显示的错误
  • @MachineTheGod 只需从您的主要活动中删除 gridView = findViewById(R.id.home_grid)。
  • 我删除了它,虽然它在 AS 上没有显示错误,但它仍然不起作用。
【解决方案2】:

当您尝试在 Activity 中使用findViewById 获取 ID 为 R.id.home_grid 的视图时。根据 XML,GridView 呈现在片段中,因此,我建议将 GridView 的所有设置移动到片段中:


    lateinit var gridView: GridView
    private var gridImageNames = arrayOf(
        "Golden Bridge", "Tampa Bay Buccaneers", "Chevrolet Camaro",
        "Vegetable Casserole", "Sweet and Sour Chicken", "Design Vector",
        "Pork Loin", "Sidney's Opera House", "Pasta Dish",
        "Dope Setup", "Singapore", "Tacos Dish",
        "Toquio", "Warm Salad Dish")
    private var gridImages = intArrayOf(
        R.drawable.bridge, R.drawable.buccaneers, R.drawable.camaro,
        R.drawable.casserole, R.drawable.chicken, R.drawable.design,
        R.drawable.lombo, R.drawable.operahouse, R.drawable.pasta,
        R.drawable.setup, R.drawable.singapore, R.drawable.tacos,
        R.drawable.toquio, R.drawable.warmsalad)

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        gridView = view.findViewById(R.id.home_grid)
        val mainAdapter = MainAdapter(this@MainActivity, gridImageNames, gridImages)
        gridView.adapter = mainAdapter

        gridView.onItemClickListener = AdapterView.OnItemClickListener { _, _, position, _ ->
            Toast.makeText(
                applicationContext, "You Clicked " + gridImageNames[+position],
                Toast.LENGTH_SHORT
            ).show()
        }
    }

并在Activity中设置片段:


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

        val homeFragment = HomeFragment()
        val listsFragment = ListsFragment()
        val searchFragment = SearchFragment()
        setCurrentFragment(homeFragment)

        // bottom navigaton setup, etc
    }

【讨论】:

  • @MachineTheGod 我已经更新了答案,请尝试让我知道结果
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-09
相关资源
最近更新 更多