[英]Spinner is always null in Kotlin
编辑:为了澄清事情,因为它们有点混乱,我的微调器在 signUpFragment class 中,这是 class 的片段,该片段位于名为 sign_up_login 的片段内的 viewPager 内,我将 viewcontent 设置为 sign_up_login从我的主要活动。 我在 signUpFragment.kt 中的微调器上收到错误,它是 country_list,上面写着“null object refrence”
我的 Spinner 在另一个片段内的 ViewPager 中的片段中,微调器的代码是:
class signupFragment : Fragment() {
val values: Array<String> = arrayOf("Test1", "Test2", "Test3")
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val adapter = ArrayAdapter(requireContext(),
android.R.layout.simple_spinner_item, values)
country_list.adapter = adapter
country_list.onItemSelectedListener = object : AdapterView.OnItemSelectedListener{
override fun onItemSelected(p0: AdapterView<*>?, p1: View?, p2: Int, p3: Long) {
Toast.makeText(requireContext(), "Selected "+ values[p2], Toast.LENGTH_SHORT).show()
}
override fun onNothingSelected(p0: AdapterView<*>?) {
}
}
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_signup, container, false)
}
}
该片段位于框架布局中,该框架布局位于视图寻呼机中的片段内,该片段包含在另一个名为 fragment_sign_up_login 的片段中。 signUpFragment 的 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"
tools:context=".signupFragment">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/lastNameInput"
android:layout_width="150dp"
android:layout_height="50dp"
android:layout_marginTop="30dp"
android:layout_marginEnd="56dp"
android:hint="Last Name"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@+id/passwordSignUp" />
<EditText
android:id="@+id/email_signUp"
android:layout_width="300dp"
android:layout_height="50dp"
android:layout_marginTop="10dp"
android:ems="10"
android:hint="Email"
android:inputType="textEmailAddress"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/firstNameInput"
android:layout_width="150dp"
android:layout_height="50dp"
android:layout_marginTop="30dp"
android:hint="First Name"
app:layout_constraintEnd_toStartOf="@+id/lastNameInput"
app:layout_constraintTop_toBottomOf="@+id/passwordSignUp" />
<EditText
android:id="@+id/editTextNumber"
android:layout_width="70dp"
android:layout_height="48dp"
android:layout_marginStart="54dp"
android:layout_marginTop="30dp"
android:ems="10"
android:hint="Age"
android:inputType="number"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/firstNameInput" />
<Spinner
android:id="@+id/country_list"
android:layout_width="200dp"
android:layout_height="48dp"
android:layout_marginTop="30dp"
android:layout_marginEnd="56dp"
android:background="@android:drawable/btn_dropdown"
android:backgroundTint="@color/lightWhite"
android:spinnerMode="dropdown"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@+id/lastNameInput" />
<EditText
android:id="@+id/passwordSignUp"
android:layout_width="300dp"
android:layout_height="50dp"
android:layout_marginTop="30dp"
android:layout_marginEnd="56dp"
android:ems="10"
android:hint="Password"
android:inputType="textPassword"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@+id/email_signUp" />
<Button
android:id="@+id/signUpButton"
android:layout_width="120dp"
android:layout_height="50dp"
android:layout_marginStart="8dp"
android:layout_marginTop="40dp"
android:backgroundTint="@color/white"
android:text="Sign up"
android:textAllCaps="false"
android:textColor="@color/black"
app:layout_constraintStart_toStartOf="@+id/country_list"
app:layout_constraintTop_toBottomOf="@+id/country_list" />
</androidx.constraintlayout.widget.ConstraintLayout>
我的主要活动是:
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.fragment_sign_up_login)
tabBarSL()
}
override fun onCreateView(name: String, context: Context, attrs: AttributeSet): View? {
return super.onCreateView(name, context, attrs)
}
fun replaceFragment(fragment: Fragment){
val fragmentManager = supportFragmentManager.beginTransaction()
fragmentManager.replace(R.id.frameLayout, fragment).commit()
}
fun tabBarSL(){
viewPagerSL.adapter = TPA(this,tabLayoutSL.tabCount)
viewPagerSL.registerOnPageChangeCallback(object: ViewPager2.OnPageChangeCallback(){
override fun onPageSelected(position: Int) {
tabLayoutSL.selectTab(tabLayoutSL.getTabAt(position))
}
})
tabLayoutSL.addOnTabSelectedListener(object: TabLayout.OnTabSelectedListener{
override fun onTabSelected(tab: TabLayout.Tab) {
viewPagerSL.currentItem = tab.position
}
override fun onTabUnselected(tab: TabLayout.Tab?) {
}
override fun onTabReselected(tab: TabLayout.Tab?) {
}
})
}
}
signUpLogin 片段的 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"
tools:context=".SignUpLoginFragment"
android:background="@drawable/backgroundsl">
<FrameLayout
android:id="@+id/frameLayoutSignLogin"
android:layout_width="match_parent"
android:layout_height="450dp"
android:layout_marginTop="205dp"
app:layout_constraintTop_toTopOf="parent"
tools:layout_editor_absoluteX="-45dp">
<androidx.viewpager2.widget.ViewPager2
android:id="@+id/viewPagerSL"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</FrameLayout>
<com.google.android.material.tabs.TabLayout
android:id="@+id/tabLayoutSL"
android:layout_width="236dp"
android:layout_height="46dp"
android:layout_marginTop="124dp"
android:layout_marginEnd="88dp"
android:background="@color/transparent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent">
<com.google.android.material.tabs.TabItem
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Sign up"
/>
<com.google.android.material.tabs.TabItem
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Log in" />
</com.google.android.material.tabs.TabLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
我在我的微调器 country_list 上不断收到错误null object 参考,这是完整的错误 output :
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.viegera, PID: 10039
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Spinner.setAdapter(android.widget.SpinnerAdapter)' on a null object reference
at com.example.viegera.signupFragment.onCreate(signupFragment.kt:33)
at androidx.fragment.app.Fragment.performCreate(Fragment.java:2949)
at androidx.fragment.app.FragmentStateManager.create(FragmentStateManager.java:475)
at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:278)
at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:2189)
at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:2100)
at androidx.fragment.app.FragmentManager.execSingleAction(FragmentManager.java:1971)
at androidx.fragment.app.BackStackRecord.commitNow(BackStackRecord.java:305)
at androidx.viewpager2.adapter.FragmentStateAdapter.placeFragmentInViewHolder(FragmentStateAdapter.java:341)
at androidx.viewpager2.adapter.FragmentStateAdapter.onViewAttachedToWindow(FragmentStateAdapter.java:276)
at androidx.viewpager2.adapter.FragmentStateAdapter.onViewAttachedToWindow(FragmentStateAdapter.java:67)
at androidx.recyclerview.widget.RecyclerView.dispatchChildAttached(RecyclerView.java:7556)
at androidx.recyclerview.widget.RecyclerView$5.addView(RecyclerView.java:860)
at androidx.recyclerview.widget.ChildHelper.addView(ChildHelper.java:107)
at androidx.recyclerview.widget.RecyclerView$LayoutManager.addViewInt(RecyclerView.java:8601)
at androidx.recyclerview.widget.RecyclerView$LayoutManager.addView(RecyclerView.java:8559)
at androidx.recyclerview.widget.RecyclerView$LayoutManager.addView(RecyclerView.java:8547)
at androidx.recyclerview.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1641)
at androidx.recyclerview.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1587)
at androidx.recyclerview.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:665)
at androidx.recyclerview.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:4134)
at androidx.recyclerview.widget.RecyclerView.dispatchLayout(RecyclerView.java:3851)
at androidx.recyclerview.widget.RecyclerView.onLayout(RecyclerView.java:4404)
at android.view.View.layout(View.java:23717)
at android.view.ViewGroup.layout(ViewGroup.java:6413)
at androidx.viewpager2.widget.ViewPager2.onLayout(ViewPager2.java:527)
at android.view.View.layout(View.java:23717)
at android.view.ViewGroup.layout(ViewGroup.java:6413)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:332)
at android.widget.FrameLayout.onLayout(FrameLayout.java:270)
at android.view.View.layout(View.java:23717)
at android.view.ViewGroup.layout(ViewGroup.java:6413)
at androidx.constraintlayout.widget.ConstraintLayout.onLayout(ConstraintLayout.java:1873)
at android.view.View.layout(View.java:23717)
at android.view.ViewGroup.layout(ViewGroup.java:6413)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:332)
at android.widget.FrameLayout.onLayout(FrameLayout.java:270)
at android.view.View.layout(View.java:23717)
at android.view.ViewGroup.layout(ViewGroup.java:6413)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1829)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1673)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1582)
at android.view.View.layout(View.java:23717)
at android.view.ViewGroup.layout(ViewGroup.java:6413)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:332)
at android.widget.FrameLayout.onLayout(FrameLayout.java:270)
at android.view.View.layout(View.java:23717)
at android.view.ViewGroup.layout(ViewGroup.java:6413)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1829)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1673)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1582)
at android.view.View.layout(View.java:23717)
E/AndroidRuntime: at android.view.ViewGroup.layout(ViewGroup.java:6413)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:332)
at android.widget.FrameLayout.onLayout(FrameLayout.java:270)
at com.android.internal.policy.DecorView.onLayout(DecorView.java:797)
at android.view.View.layout(View.java:23717)
at android.view.ViewGroup.layout(ViewGroup.java:6413)
at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:3892)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:3282)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:2278)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:8933)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1230)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1238)
at android.view.Choreographer.doCallbacks(Choreographer.java:898)
at android.view.Choreographer.doFrame(Choreographer.java:831)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1213)
at android.os.Handler.handleCallback(Handler.java:942)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loopOnce(Looper.java:201)
at android.os.Looper.loop(Looper.java:288)
at android.app.ActivityThread.main(ActivityThread.java:7892)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936)
微调器是 null,因为微调器本身没有初始化。 Spinner 仅在创建片段视图时才会被初始化。 当它是 null 时,您正在尝试访问微调器。
您需要将此代码从onCreate
移动到onViewCreated
或onCreateView
。 因为只有在调用onCreateView
时才会创建视图。 onCreate
在onCreateView
之前调用。 您可以在此处查看以了解有关片段生命周期的更多信息。
此外,不推荐使用 Kotlin 合成,因为 Android kotlin 扩展 Z8ED1A771BC236C2877AD93C699 插件已弃用。 所以建议迁移到viewBinding
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val adapter = ArrayAdapter(requireContext(),
android.R.layout.simple_spinner_item, values)
country_list.adapter = adapter
country_list.onItemSelectedListener = object : AdapterView.OnItemSelectedListener{
override fun onItemSelected(p0: AdapterView<*>?, p1: View?, p2: Int, p3: Long) {
Toast.makeText(requireContext(), "Selected "+ values[p2], Toast.LENGTH_SHORT).show()
}
override fun onNothingSelected(p0: AdapterView<*>?) {
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.