如何修复scrollview崩溃的Android应用程序?

如何修复scrollview崩溃的Android应用程序?,android,android-scrollview,Android,Android Scrollview,新的应用开发者在这里。几天前我开始开发一个应用程序。它工作得非常好,直到我替换了默认的滚动视图。我正在尝试制作一个类似reddit设计的滚动视图,一个固定大小的无穷无尽的盒子。更改代码后,我希望在scrollview中有多个大小相同的框。相反,它在启动时会立即崩溃 我试着在scrollview上更改维度,并尝试添加子元素,但它仍然不适合我 我在日志中收到以下错误消息: **2019-11-23 20:41:40.155 10846-10846/com.john.chanapi E/Androi

新的应用开发者在这里。几天前我开始开发一个应用程序。它工作得非常好,直到我替换了默认的滚动视图。我正在尝试制作一个类似reddit设计的滚动视图,一个固定大小的无穷无尽的盒子。更改代码后,我希望在scrollview中有多个大小相同的框。相反,它在启动时会立即崩溃

我试着在scrollview上更改维度,并尝试添加子元素,但它仍然不适合我

我在日志中收到以下错误消息:

 **2019-11-23 20:41:40.155 10846-10846/com.john.chanapi E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.john.chanapi, PID: 10846
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.john.chanapi/com.john.chanapi.MainActivity}: java.lang.IllegalStateException: Activity com.john.chanapi.MainActivity@1850938 does not have a NavController set on 2131230867
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3047)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3182)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1916)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6898)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:537)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
Caused by: java.lang.IllegalStateException: Activity com.john.chanapi.MainActivity@1850938 does not have a NavController set on 2131230867
at androidx.navigation.Navigation.findNavController(Navigation.java:61)
at androidx.navigation.ActivityKt.findNavController(Activity.kt:30)
at com.john.chanapi.MainActivity.onCreate(MainActivity.kt:33)
at android.app.Activity.performCreate(Activity.java:7149)
at android.app.Activity.performCreate(Activity.java:7140)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1288)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3027)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3182) 
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78) 
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108) 
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1916) 
at android.os.Handler.dispatchMessage(Handler.java:106) 
at android.os.Looper.loop(Looper.java:193) 
at android.app.ActivityThread.main(ActivityThread.java:6898) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:537) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858) 
My content_main.xml文件:

<?xml version="1.0" encoding="utf-8"?>
    <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    tools:showIn="@layout/app_bar_main">
    <ScrollView
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <LinearLayout
    android:id="@+id/scrollview1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:divider="#312F2F"
    android:orientation="vertical" >
    <TextView
    android:id="@+id/textView2"
    android:layout_width="match_parent"
    android:layout_height="124dp"
    android:text="TextView" />
    <Button
    android:id="@+id/button"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="Button" />
    </LinearLayout>
    </ScrollView>
    </androidx.constraintlayout.widget.ConstraintLayout>**

任何帮助或建议都会对我大有裨益。我已经被困在这个问题上好几个小时了。谢谢

根据日志,它正在
findNavController
崩溃,这是您的
main活动中的这一行:

val navController=findNavController(R.id.scrollview1)

该活动只是在
onCreate
中膨胀视图,当您尝试获取
NavController
时,它将失败

验证这一点的一个简单方法是在
onCreate
中对这一行后面的代码进行
注释
/
删除
并检查应用程序是否崩溃

如果这是问题所在,您可以将这些代码移动到
onViewCreated
中,其中所有视图都已膨胀

您可以尝试以下方法:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    val toolbar: Toolbar = findViewById(R.id.toolbar)
    setSupportActionBar(toolbar)
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    val fab: FloatingActionButton = findViewById(R.id.fab)
    fab.setOnClickListener { view ->
    Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
        .setAction("Action", null).show()
    }
    val drawerLayout: DrawerLayout = findViewById(R.id.drawer_layout)
    val navView: NavigationView = findViewById(R.id.nav_view)
    val navController = findNavController(R.id.scrollview1)
    // Passing each menu ID as a set of Ids because each
    // menu should be considered as top level destinations.
    appBarConfiguration = AppBarConfiguration(
        setOf(
            R.id.nav_home, R.id.nav_new, R.id.nav_rising,
            R.id.nav_top, R.id.nav_inbox, R.id.nav_message
        ), drawerLayout
    )
    setupActionBarWithNavController(navController, appBarConfiguration)
    navView.setupWithNavController(navController)
}

如果您想要无限的盒子,请使用
RecyclerView
。这里有一个很棒的教程:另外,我认为如果你学习Kotlin而不是Java来进行android开发会更好。对于ios和android的开发,你可以学习Flitter/它允许你使用相同的代码为ios和android编写一个应用程序。我来看看这个视频!我刚切换到RecyclerView。我计划学习kotlin,但我可能必须查看Flitter。从您的logcat上看,获取
NavController
似乎存在问题。您是否添加了
NavController
?我想我没有用于RecycleView的NavController设置。我对科特林了解不多。如何添加NavController?我注释掉了页面底部val NavController=findNavController(R.id.scrollview1)下面的代码,但它一直崩溃。我还尝试注释掉页面顶部onCreate下面的所有代码,它修复了崩溃,只是我的屏幕是白色的。您是否注释掉了这行内容:
val navController=findNavController(R.id.scrollview1)
?如果在
onCreate
中注释所有代码时应用程序没有崩溃,您可以将这些代码移动到
onViewCreated
,这是我们通常初始化视图的地方,因为在
onCreate
中视图尚未膨胀。我没有在MainActivity中创建onViewCreated。是否将onCreate替换为页面顶部创建的OnViewCreate?对不起,如果我在理解上有困难。我是开发应用程序的新手。
onViewCreated
是另一个可以从
活动
覆盖的功能。我建议您阅读更多有关
活动
生命周期的信息。我会用代码更新我的答案,因为它更容易理解。
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    val toolbar: Toolbar = findViewById(R.id.toolbar)
    setSupportActionBar(toolbar)
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    val fab: FloatingActionButton = findViewById(R.id.fab)
    fab.setOnClickListener { view ->
    Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
        .setAction("Action", null).show()
    }
    val drawerLayout: DrawerLayout = findViewById(R.id.drawer_layout)
    val navView: NavigationView = findViewById(R.id.nav_view)
    val navController = findNavController(R.id.scrollview1)
    // Passing each menu ID as a set of Ids because each
    // menu should be considered as top level destinations.
    appBarConfiguration = AppBarConfiguration(
        setOf(
            R.id.nav_home, R.id.nav_new, R.id.nav_rising,
            R.id.nav_top, R.id.nav_inbox, R.id.nav_message
        ), drawerLayout
    )
    setupActionBarWithNavController(navController, appBarConfiguration)
    navView.setupWithNavController(navController)
}