如何解决错误:java.lang.UnsupportedOperationException:无法解析索引 6 处的属性:TypedValue{t=0x2/d=0x101009b a=1}
我正在尝试显示 AlertDialog,但有时它会崩溃并在 crashlytics 中显示此错误消息
Caused by java.lang.UnsupportedOperationException: Failed to resolve attribute at index 6: TypedValue{t=0x2/d=0x101009b a=1}
at android.content.res.TypedArray.getColorStateList(TypedArray.java:540)
at android.widget.TextView.<init>(TextView.java:906)
at android.widget.TextView.<init>(TextView.java:820)
at android.widget.TextView.<init>(TextView.java:816)
at com.android.internal.widget.DialogTitle.<init>(DialogTitle.java:41)
at java.lang.reflect.Constructor.newInstance0(Constructor.java)
at java.lang.reflect.Constructor.newInstance(Constructor.java:334)
at android.view.LayoutInflater.createView(LayoutInflater.java:651)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:794)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:734)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:867)
at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:828)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:870)
at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:828)
at android.view.LayoutInflater.parseInclude(LayoutInflater.java:999)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:863)
at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:828)
at android.view.LayoutInflater.inflate(LayoutInflater.java:519)
at android.view.LayoutInflater.inflate(LayoutInflater.java:427)
at android.view.LayoutInflater.inflate(LayoutInflater.java:374)
at com.android.internal.policy.PhoneWindow.setContentView(PhoneWindow.java:419)
at com.android.internal.app.AlertController.installContent(AlertController.java:257)
at android.app.AlertDialog.onCreate(AlertDialog.java:425)
at android.app.Dialog.dispatchOnCreate(Dialog.java:403)
at android.app.Dialog.show(Dialog.java:302)
at android.app.AlertDialog$Builder.show(AlertDialog.java:1114)
at de.geylankalafmohe.dasgedenken.ui.settings.SettingsFragment$handleLanguages$1.onClick(SettingsFragment.kt:100)
at android.view.View.performClick(View.java:6311)
at android.view.View$PerformClick.run(View.java:24833)
at android.os.Handler.handleCallback(Handler.java:794)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:173)
at android.app.ActivityThread.main(ActivityThread.java:6653)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:821)
这就是我展示 AlertDialog
的方式:
binding.changeLanguageButton.setOnClickListener {
if (context == null || activity == null || (context as Activity).isFinishing) {
return@setOnClickListener
}
val builderSingle: AlertDialog.Builder = AlertDialog.Builder(context)
builderSingle.setTitle(getString(R.string.waehle_sprache))
val arrayAdapter = ArrayAdapter<String>(requireContext(),android.R.layout.select_dialog_singlechoice)
languagesAvailable.forEach { (languageName,_) -> arrayAdapter.add(languageName) }
val checkedLanguage = ArrayList<String>(languagesAvailable.values).indexOf(currentLanguage.language);
builderSingle.setSingleChoiceItems(arrayAdapter,checkedLanguage,DialogInterface.OnClickListener { dialog,which ->
val languageName = arrayAdapter.getItem(which)
val languageCode = languagesAvailable[languageName ?: return@OnClickListener] ?: return@OnClickListener
mainActivity.setLanguage(languageCode)
})
builderSingle.setNegativeButton(requireContext().getString(R.string.abbrechen),which -> dialog.dismiss() })
builderSingle.show()
}
这些是我遇到的其他错误:
解决方法
假设 languagesAvailable
是一个 ENUM
。
enum class Language(val language:String,val languageCode: String){
ENGLISH(" English","en"),BENGALI("Bengali","bn"),JAPANESE("Japanese","ja"),SPANISH("Spanish","es"),RUSSIAN("Russian","ru"),HINDI("Hindi","hi"),FRENCH("French","fr")
}
然后必须调用下面的方法来显示对话框。
private fun showLanguageSelectionDialog(currentLanguage: String){
val builderSingle: AlertDialog.Builder = AlertDialog.Builder(context)
builderSingle.setTitle(getString(R.string.waehle_sprache))
val languagesAvailable = Language.values()
val arrayAdapter = ArrayAdapter<String>(requireContext(),android.R.layout.select_dialog_singlechoice)
languagesAvailable.forEach {
arrayAdapter.add(it.language)
}
// val checkedLanguage = ArrayList<Language>(languagesAvailable.values).indexOf(currentLanguage.language)
val checkedLanguage = languagesAvailable.indexOfFirst { currentLanguage == it.language }
if (checkedLanguage >= 0){
builderSingle.setSingleChoiceItems(arrayAdapter,checkedLanguage,DialogInterface.OnClickListener { dialog,which ->
val languageName = arrayAdapter.getItem(which)
//val languageCode = languagesAvailable[languageName ?: return@OnClickListener] ?: return@OnClickListener
val languageIndex = languagesAvailable.indexOfFirst { languageName == it.language }
if (languageIndex >= 0){
val languageCode = languagesAvailable[languageIndex].languageCode
mainActivity.setLanguage(languageCode)
Log.d("TAG==>>","Selected Language Code = $languageCode And Language Name = $languageName")
}else{
Log.d("TAG==>>","Selected Language does not exist in Languages list.")
}
})
builderSingle.setNegativeButton(requireContext().getString(R.string.abbrechen),which -> dialog.dismiss() })
builderSingle.show()
}else{
Log.d("TAG==>>","Current Language does not exist in Languages list.")
}
}
然后在按钮上调用上面的方法点击喜欢:
binding.changeLanguageButton.setOnClickListener {
// You might have saved the current language code in shared preference or database.
val defaultLanguageCode = "hi" // Just putting default one. Replace with the code stored in database or Shared Preference.
showLanguageSelectionDialog(defaultLanguageCode)
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。