1

I am trying to show an AlertDialog but sometimes it crashes and it shows this error message in 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)

This is how I show the 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), DialogInterface.OnClickListener { dialog, which -> dialog.dismiss() })
    builderSingle.show()
}

These are the other errors I get with it:

enter image description here

a_local_nobody
  • 7,947
  • 5
  • 29
  • 51
SwiftiSwift
  • 7,528
  • 9
  • 56
  • 96
  • 1
    I'm not sure what exactly the issue is but I have a few questions: 1. Does it happen on all devices or only some? 2. Based on the exception it looks like a problem with the title or one of the items, is there a chance the language is null, or for some reason, you are missing a translation for the waehle_sprache string? – Gil Goldzweig Apr 04 '21 at 09:48
  • @GilGoldzweig Exactly, I agree with you. Even though I'm a bit rusty with Android Development right now, the problem has do to with some of the assets when they're being loaded. – Gaurav Mall Apr 04 '21 at 11:45
  • By the way, how many lines do you have in your main file? The `.java` file I mean. – Gaurav Mall Apr 04 '21 at 11:51
  • _DialogTitle_ is looking for the Android attribute [textColorLink](https://android.googlesource.com/platform/frameworks/base/+/master/core/res/res/values/public.xml#183) which is missing or an incorrect value. It should be a _ColorStateList_ or integer color. Check the styles including `textAppearance` that would be used for the configuration(s) in use at the time of the crash. The other errors just cascade from the first. More info such as API level could be helpful. – Cheticamp Apr 05 '21 at 13:20
  • Could you post languagesAvailable, please ? Is it ENUM ? – NRUSINGHA MOHARANA Apr 09 '21 at 05:26
  • it is an enum like in your answer @NRUSINGHAMOHARANA – SwiftiSwift Apr 13 '21 at 16:07
  • did you find the root cause? do you think this is related to https://issuetracker.google.com/issues/37118322 ? – stallianz Apr 25 '23 at 13:33

1 Answers1

0

Assuming languagesAvailable is a 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")
 }

Then below method has to be called to show dialog.

  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), DialogInterface.OnClickListener { dialog, which -> dialog.dismiss() })
    builderSingle.show()
  }else{
    Log.d("TAG==>>","Current Language does not exist in Languages list.")
  }
}

And then call above method on button click Like:

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)
}
NRUSINGHA MOHARANA
  • 1,489
  • 8
  • 13