¿Cómo controlar la navegación por medio del recurso de string predeterminado en RecyclerView?
He completado con éxito una navegación en RecyclerViewAdapter
para navegar por muchos destinos mediante recursos de string
. Debido a que tengo muchas listas y cada TextView
está en un fragmento
separado.
Es maravilloso hacerlo. Pero tengo un pequeño problema. Es que tengo 2 recursos de string
, “en” en inglés como predeterminado y “ar” como segundo idioma.
Mi aplicación funciona bien cuando la uso en localización en inglés. Pero se bloquea cuando la uso en localización en árabe.
Lo que quiero es:
Controlar o forzar a que la aplicación, al convertirse en árabe, siga utilizando el recurso predeterminado en inglés.
Aquí está el bloque de código RecyclerViewAdapter:
override fun onBindViewHolder(holder: SubSectionListHolder, position: Int) {
val item = dataset[position]
holder.subSectionView.text = context.resources.getString(item.subSectionSrcID)
holder.subSectionView.setOnClickListener {
val stringConvertToId = it.resources.getIdentifier(
context.resources.getString(item.subSectionSrcID).replace("\\s".toRegex(), ""),
"id",
context.packageName)
it.findNavController().navigate(stringConvertToId)
}
}
Aquí hay un ejemplo de la etiqueta navGraph
:
<fragment
android:id="@+id/CreateOrder"
android:name=".PoCreateOrderFragment"
android:label="@string/btnStr_crtOrder"
tools:layout="@layout/fragment_po_create_order">
</fragment>
<fragment
android:id="@+id/ReceivedPreOrders"
android:name=".PoRcOrdersFragment"
android:label="@string/str_whPo_rcvdPrm"
tools:layout="@layout/fragment_po_rc_orders">
</fragment>
<fragment
android:id="@+id/DeferredPreOrders"
android:name=".PoDfOrdersFragment"
android:label="@string/str_whPo_dfrdPrm"
tools:layout="@layout/fragment_po_df_orders">
</fragment>
Aquí hay un ejemplo de la etiqueta de recurso de string
predeterminada:
<string name="btnStr_crtOrder">Crear pedido</string>
<string name="str_whPo_rcvdPrm">Pedidos recibidos</string>
<string name="str_whPo_dfrdPrm">Pedidos diferidos</string>
Aquí hay un ejemplo de la etiqueta de recurso de string
en árabe:
<string name="btnStr_crtOrder">إنشاء طلب</string>
<string name="str_whPo_rcvdPrm">الطلبيات المستلمة</string>
davy.ai
El problema que está enfrentando es que cuando la aplicación se cambia al idioma árabe, intenta cargar la versión árabe de los recursos de cadena. Sin embargo, algunos de los recursos de cadena podrían faltar o no estar disponibles en árabe, lo que lleva a un fallo.
Para resolver este problema y forzar a la aplicación a que use el recurso de cadena predeterminado en inglés, puede crear un nuevo archivo de recurso específicamente para el idioma árabe, que utilizará las cadenas en inglés como alternativa. Aquí están los pasos:
res/values-ar/
. Nómbrelostrings.xml
. Este será el archivo de recurso para el idioma árabe.En el nuevo archivo de recurso, defina los recursos de cadena que desea usar en árabe. Para las cadenas que falten, puede hacer referencia a las cadenas en inglés utilizando el atributo “translatable”. Aquí hay un ejemplo:
El atributo “translatable = false” evita que la cadena se traduzca, por lo que siempre se usará la versión en inglés.
Finalmente, en el método
onBindViewHolder
de suRecyclerViewAdapter
, modifique la línea que obtiene el ID del recurso de cadena para utilizar elcontexto
del idioma inglés. Aquí está el código actualizado:Este código crea un nuevo
contexto
con la configuración de idioma inglés y lo utiliza para obtener el ID del recurso de cadena. La partereplace ("\\ s". ToRegex(), "")
elimina cualquier carácter de espacio en blanco de la cadena antes de usarlo como ID de recurso.Con estos cambios, su aplicación siempre debería utilizar los recursos de cadena en inglés, incluso al utilizar el idioma árabe.