简体   繁体   中英

android - java.lang.IllegalStateException: Fragment not attached to a context

What im doing

Im creating an app, which has a RecyclerView as a menu. Since my app has loacalization, i need to use strings, saved in strings.xml.

Whats the problem?

Trying to pass strings value into the parameter causes the app to crash

What have i tried

  1. using getString() to get the needed value causes the illigalStateException error
  2. trying to create a separate string using getString, and using the created string crashes the app
  3. context?.getString() crashes the app

Code:

frgSettings.kt

class frgSettings : Fragment() {

    var settingsList = listOf(
        dataItemsSettings(PUT STRING 1 HERE, PUT STRING 2 HERE, R.drawable.ic_colored_color_lens),
        dataItemsSettings(PUT STRING 1 HERE, PUT STRING 2 HERE, R.drawable.ic_colored_view_carousel),
    )

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        retainInstance = true
    }

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? = inflater.inflate(R.layout.fragment_settings, container, false)

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        rvSettings.apply {
            layoutManager = LinearLayoutManager(activity)
            adapter = adapterSettings(settingsList)
        }
    }
}

adapterSettings.kt

class adapterSettings(
    var settingsList: List<dataItemsSettings>
) : RecyclerView.Adapter<adapterSettings.SettingsViewHolder>() {

    inner class SettingsViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView)

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SettingsViewHolder {
        val view = LayoutInflater.from(parent.context).inflate(R.layout.item_settings, parent, false)
        return SettingsViewHolder(view)
    }

    override fun getItemCount(): Int {
        return settingsList.size
    }

    override fun onBindViewHolder(holder: SettingsViewHolder, position: Int) {
        holder.itemView.apply {
            rvTitle.text = settingsList[position].stringTitle
            rvDescription.text = settingsList[position].stringDescription
            rvIcon.setImageResource(settingsList[position].itemIcon)
        }
    }
}

dataSettings.kt

data class dataItemsSettings (
    var stringTitle: String,
    var stringDescription: String,
    val itemIcon: Int
)

Try to initialize settingsList variable in onViewCreated method:

//...
lateinit var settingsList: List<dataItemsSettings>

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    settingsList = listOf(
            dataItemsSettings(PUT STRING 1 HERE, PUT STRING 2 HERE, R.drawable.ic_colored_color_lens),
            dataItemsSettings(PUT STRING 1 HERE, PUT STRING 2 HERE, R.drawable.ic_colored_view_carousel),
    )
    rvSettings.apply {
        layoutManager = LinearLayoutManager(activity)
        adapter = adapterSettings(settingsList)
    }
}

// ...

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM