Я пытаюсь настроить проект Wear OS. У меня есть некоторый опыт обычной разработки для Android, но Wear OS для меня новинка.
Я привык иметь только один MainActivity
и несколько фрагментов. Но я пытаюсь заставить это работать для Wear OS, но безуспешно. Он продолжает падать, когда я хочу использовать viewBinding
в OverviewFragment.kt
.
Я получил следующий проект сейчас:
Activity_main.xml
<?xml version = "1.0" encoding = "utf-8"?>
<androidx.wear.widget.BoxInsetLayout 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"
android:padding = "@dimen/box_inset_layout_padding"
tools:context = ".MainActivity"
tools:deviceIds = "wear">
<FrameLayout
android:layout_width = "match_parent"
android:layout_height = "match_parent"
android:padding = "@dimen/inner_frame_layout_padding"
app:layout_boxedEdges = "left|right">
<include
layout = "@layout/content_main"
android:layout_width = "match_parent"
android:layout_height = "match_parent" />
</FrameLayout>
</androidx.wear.widget.BoxInsetLayout>
content_main.xml
<?xml version = "1.0" encoding = "utf-8"?>
<androidx.wear.widget.BoxInsetLayout xmlns:android = "http://schemas.android.com/apk/res/android"
xmlns:app = "http://schemas.android.com/apk/res-auto"
android:layout_width = "match_parent"
android:layout_height = "match_parent"
app:layout_behavior = "@string/appbar_scrolling_view_behavior">
<fragment
android:id = "@+id/nav_host_fragment"
android:name = "androidx.navigation.fragment.NavHostFragment"
android:layout_width = "match_parent"
android:layout_height = "match_parent"
app:defaultNavHost = "true"
app:layout_constraintBottom_toBottomOf = "parent"
app:layout_constraintLeft_toLeftOf = "parent"
app:layout_constraintRight_toRightOf = "parent"
app:layout_constraintTop_toTopOf = "parent"
app:navGraph = "@navigation/nav_graph" />
</androidx.wear.widget.BoxInsetLayout>
фрагмент_обзор.xml
<?xml version = "1.0" encoding = "utf-8"?>
<FrameLayout xmlns:android = "http://schemas.android.com/apk/res/android"
xmlns:tools = "http://schemas.android.com/tools"
android:layout_width = "match_parent"
android:layout_height = "match_parent"
tools:context = ".ui.OverviewFragment">
<TextView
android:id = "@+id/tvOverview"
android:layout_width = "match_parent"
android:layout_height = "match_parent"
android:clickable = "true"
android:text = "overview"
android:textAlignment = "center" />
</FrameLayout>
MainActivity.kt
class MainActivity : FragmentActivity() {
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
}
}
ОбзорFragment.kt
class OverviewFragment : Fragment() {
private var _binding: FragmentOverviewBinding? = null
private val binding get() = _binding!!
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
return inflater.inflate(R.layout.fragment_overview, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.tvOverview.setOnClickListener {
println("great")
}
}
}
Простой дизайн, но ему не нравится часть binding.tvOverview.setOnClickListener
в OverviewFragment.kt
. Он просто продолжает падать.
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.krakert.tracker, PID: 7261
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.krakert.tracker/com.krakert.tracker.MainActivity}: android.view.InflateException: Binary XML file line #17: Binary XML file line #8: Error inflating class fragment
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2817)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892)
at android.app.ActivityThread.-wrap11(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6541)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
Caused by: android.view.InflateException: Binary XML file line #17: Binary XML file line #8: Error inflating class fragment
Caused by: android.view.InflateException: Binary XML file line #8: Error inflating class fragment
Caused by: java.lang.NullPointerException
at com.krakert.tracker.ui.OverviewFragment.getBinding(OverviewFragment.kt:15)
at com.krakert.tracker.ui.OverviewFragment.onViewCreated(OverviewFragment.kt:28)
Мне нужна помощь здесь, настройка проекта. Действительно новичок в Wear OS
Спасибо!
Не уверен, как это может работать, и подозреваю, что отсюда исходит исключение NullPointerException.
private var _binding: FragmentOverviewBinding? = null
private val binding get() = _binding!!
сравните с примером на https://developer.android.com/topic/libraries/view-binding#fragments
который устанавливает _binding
в onCreateView
Спасибо, простая ошибка, в других своих проектах я тоже так делаю, в шаблоне для Android Studio его не было.