我对片段中的 spinneradapter 有问题
I have problem with spinneradapter in fragment
我正在使用 kotlin 开发 android 应用程序。我使用 AddDebtFragment 中的 3 个微调器和资源文件中的 3 个字符串数组设置了选定值。但是当我尝试从我的 HomeFragment 导航到这个片段时,应用程序被终止并且它在片段 Logcat 上显示问题
这是我在 fragment_add_debt.xml
中的微调器
<Spinner
android:id="@+id/debtCategorySpinner"
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="@style/SpinnerStyle"
android:spinnerMode="dialog"
android:entries="@array/debtCategoryList"/>
<Spinner
android:id="@+id/financialNameSpinner"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:spinnerMode="dialog"
style="@style/SpinnerStyle"
android:entries="@array/financialNameList"/>
<Spinner
android:id="@+id/rateTypeSpinner"
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="@style/SpinnerStyle"
android:spinnerMode="dialog"
android:entries="@array/rateTypeList"/>
资源文件中的字符串数组
<string-array name="financialNameList">
<item>Bangkok Bank</item>
<item>Kasikorn Bank</item>
<item>Krung Thai Bank</item>
<item>The Siam Commercial Bank</item>
<item>TMB Bank</item>
<item>Bank of Ayudhya</item>
</string-array>
<string-array name="debtCategoryList">
<item>Personal Loan</item>
<item>Vehicle Loan</item>
<item>Indonesia</item>
<item>Mortgage</item>
<item>Student Loan</item>
<item>Credit Card</item>
</string-array>
<string-array name="rateTypeList">
<item>Effective Rate</item>
<item>Flat Rate</item>
<item>Fixed Rate</item>
<item>MRR</item>
<item>MOR</item>
<item>MLR</item>
<item>Student Rate</item>
<item>Credit Card</item>
<item>Ceiling</item>
<item>Default</item>
</string-array>
AddDebtFragment
import android.os.Bundle
import android.util.Log
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.AdapterView
import android.widget.ArrayAdapter
import com.example.debtrearragement.R
import kotlinx.android.synthetic.main.fragment_add_debt.*
class AddDebtFragment : Fragment(), AdapterView.OnItemSelectedListener {
private val financialSpinner = financialNameSpinner
private val debtSpinner = debtCategorySpinner
private val rateSpinner = rateTypeSpinner
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
return inflater.inflate(R.layout.fragment_add_debt, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
ArrayAdapter.createFromResource(context, R.array.financialNameList, android.R.layout.simple_spinner_item)
.also { adapter ->
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
financialSpinner.adapter
financialSpinner.onItemSelectedListener
}
ArrayAdapter.createFromResource(this.context, R.array.debtCategoryList, android.R.layout.simple_spinner_dropdown_item)
.also { adapter ->
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
debtSpinner.adapter
debtSpinner.onItemSelectedListener
}
ArrayAdapter.createFromResource(this.context, R.array.rateTypeList, android.R.layout.simple_spinner_dropdown_item)
.also { adapter ->
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
rateSpinner.adapter
rateSpinner.onItemSelectedListener
}
}
override fun onNothingSelected(parent: AdapterView<*>) {
}
override fun onItemSelected(parent: AdapterView<*>, view: View,position: Int, id: Long) {
}
}
编辑:1 - 这是 Logcat
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.debtrearragement, PID: 29305
java.lang.IllegalStateException: financialSpinner must not be null
at com.example.debtrearragement.view.ui.debt.AddDebtFragment.onViewCreated(AddDebtFragment.kt:34)
at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:892)
at androidx.fragment.app.FragmentManagerImpl.addAddedFragments(FragmentManagerImpl.java:2097)
at androidx.fragment.app.FragmentManagerImpl.executeOpsTogether(FragmentManagerImpl.java:1871)
at androidx.fragment.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManagerImpl.java:1827)
at androidx.fragment.app.FragmentManagerImpl.execPendingActions(FragmentManagerImpl.java:1727)
at androidx.fragment.app.FragmentManagerImpl.run(FragmentManagerImpl.java:150)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6669)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
I/Process: Sending signal. PID: 29305 SIG: 9
Application terminated.
编辑:2 - 我刚刚看到它也在编译器上显示。
您不需要为 Spinners 声明新变量,因为您正在使用 kotlin 合成属性。只需删除
private val financialSpinner = financialNameSpinner
private val debtSpinner = debtCategorySpinner
private val rateSpinner = rateTypeSpinner
并在您的代码中将 financialSpinner
替换为 financialNameSpinner
,将 debtSpinner
替换为 debtCategorySpinner
,将 rateSpinner
替换为 rateTypeSpinner
。
您可以从 docs
中找到有关 Kotlin Android 扩展的更多信息
修复警告
您收到此警告是因为 ArrayAdapter.createFromResource
需要一个 Context 对象,而 context
(From getContext) returns 一个可为 null 的 Context 对象。您可以做的是使用 !!
将可空对象转换为非空对象
ArrayAdapter.createFromResource(context!!, R.array.financialNameList, android.R.layout.simple_spinner_item)
阅读这篇文章doc 了解更多关于 Kotlin 中的 Null 安全性
我正在使用 kotlin 开发 android 应用程序。我使用 AddDebtFragment 中的 3 个微调器和资源文件中的 3 个字符串数组设置了选定值。但是当我尝试从我的 HomeFragment 导航到这个片段时,应用程序被终止并且它在片段 Logcat 上显示问题
这是我在 fragment_add_debt.xml
中的微调器<Spinner
android:id="@+id/debtCategorySpinner"
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="@style/SpinnerStyle"
android:spinnerMode="dialog"
android:entries="@array/debtCategoryList"/>
<Spinner
android:id="@+id/financialNameSpinner"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:spinnerMode="dialog"
style="@style/SpinnerStyle"
android:entries="@array/financialNameList"/>
<Spinner
android:id="@+id/rateTypeSpinner"
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="@style/SpinnerStyle"
android:spinnerMode="dialog"
android:entries="@array/rateTypeList"/>
资源文件中的字符串数组
<string-array name="financialNameList">
<item>Bangkok Bank</item>
<item>Kasikorn Bank</item>
<item>Krung Thai Bank</item>
<item>The Siam Commercial Bank</item>
<item>TMB Bank</item>
<item>Bank of Ayudhya</item>
</string-array>
<string-array name="debtCategoryList">
<item>Personal Loan</item>
<item>Vehicle Loan</item>
<item>Indonesia</item>
<item>Mortgage</item>
<item>Student Loan</item>
<item>Credit Card</item>
</string-array>
<string-array name="rateTypeList">
<item>Effective Rate</item>
<item>Flat Rate</item>
<item>Fixed Rate</item>
<item>MRR</item>
<item>MOR</item>
<item>MLR</item>
<item>Student Rate</item>
<item>Credit Card</item>
<item>Ceiling</item>
<item>Default</item>
</string-array>
AddDebtFragment
import android.os.Bundle
import android.util.Log
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.AdapterView
import android.widget.ArrayAdapter
import com.example.debtrearragement.R
import kotlinx.android.synthetic.main.fragment_add_debt.*
class AddDebtFragment : Fragment(), AdapterView.OnItemSelectedListener {
private val financialSpinner = financialNameSpinner
private val debtSpinner = debtCategorySpinner
private val rateSpinner = rateTypeSpinner
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
return inflater.inflate(R.layout.fragment_add_debt, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
ArrayAdapter.createFromResource(context, R.array.financialNameList, android.R.layout.simple_spinner_item)
.also { adapter ->
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
financialSpinner.adapter
financialSpinner.onItemSelectedListener
}
ArrayAdapter.createFromResource(this.context, R.array.debtCategoryList, android.R.layout.simple_spinner_dropdown_item)
.also { adapter ->
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
debtSpinner.adapter
debtSpinner.onItemSelectedListener
}
ArrayAdapter.createFromResource(this.context, R.array.rateTypeList, android.R.layout.simple_spinner_dropdown_item)
.also { adapter ->
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
rateSpinner.adapter
rateSpinner.onItemSelectedListener
}
}
override fun onNothingSelected(parent: AdapterView<*>) {
}
override fun onItemSelected(parent: AdapterView<*>, view: View,position: Int, id: Long) {
}
}
编辑:1 - 这是 Logcat
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.debtrearragement, PID: 29305
java.lang.IllegalStateException: financialSpinner must not be null
at com.example.debtrearragement.view.ui.debt.AddDebtFragment.onViewCreated(AddDebtFragment.kt:34)
at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:892)
at androidx.fragment.app.FragmentManagerImpl.addAddedFragments(FragmentManagerImpl.java:2097)
at androidx.fragment.app.FragmentManagerImpl.executeOpsTogether(FragmentManagerImpl.java:1871)
at androidx.fragment.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManagerImpl.java:1827)
at androidx.fragment.app.FragmentManagerImpl.execPendingActions(FragmentManagerImpl.java:1727)
at androidx.fragment.app.FragmentManagerImpl.run(FragmentManagerImpl.java:150)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6669)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
I/Process: Sending signal. PID: 29305 SIG: 9
Application terminated.
编辑:2 - 我刚刚看到它也在编译器上显示。
您不需要为 Spinners 声明新变量,因为您正在使用 kotlin 合成属性。只需删除
private val financialSpinner = financialNameSpinner
private val debtSpinner = debtCategorySpinner
private val rateSpinner = rateTypeSpinner
并在您的代码中将 financialSpinner
替换为 financialNameSpinner
,将 debtSpinner
替换为 debtCategorySpinner
,将 rateSpinner
替换为 rateTypeSpinner
。
您可以从 docs
中找到有关 Kotlin Android 扩展的更多信息修复警告
您收到此警告是因为 ArrayAdapter.createFromResource
需要一个 Context 对象,而 context
(From getContext) returns 一个可为 null 的 Context 对象。您可以做的是使用 !!
ArrayAdapter.createFromResource(context!!, R.array.financialNameList, android.R.layout.simple_spinner_item)
阅读这篇文章doc 了解更多关于 Kotlin 中的 Null 安全性