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