¡Hola, usuarios de StackOverflow!
Estoy tratando de hacer algo complicado (para un novato como yo XD) y tengo algunas dudas.
¿Cómo puedo configurar la posición de los botones de mi pantalla principal desde una pantalla de preferencias? Como, si tengo 2 botones para invertir su posición...
Traté de hacerlo con el siguiente código en kotlin (por favor, no me juzguen, ya les dije que soy un novato), pero quiero tener una idea de cómo hacer que esto funcione. XDD
findPreference<Preference>("buttonpositions")!!.onPreferenceChangeListener = Preference.OnPreferenceChangeListener { preference: Preference, _: Any? -> val checked = (preference as CheckBoxPreference).isChecked if(!checked) { val myBtn = R.id.cleanBtn as Button myBtn.setPadding(0, 100, 0, 0) } true }y los botones es algo como esto:
<com.google.android.material.button.MaterialButton style="@style/Widget.Material3.Button.UnelevatedButton" android:id="@+id/cleanBtn" android:layout_width="wrap_content" android:layout_height="wrap_content" app:layout_columnWeight="1" android:minWidth="0dp" app:layout_rowWeight="1" android:tooltipText="@string/tooltip_clean_button" app:iconGravity="top" app:icon="@drawable/ic_broom" app:iconTint="@android:color/system_accent1_400" android:textColor="@android:color/system_accent1_400" android:text="@string/clean"/> <com.google.android.material.button.MaterialButton style="@style/Widget.Material3.Button.UnelevatedButton" android:layout_width="wrap_content" android:layout_height="wrap_content" app:layout_columnWeight="1" app:layout_rowWeight="1" android:id="@+id/analyzeBtn" app:iconGravity="top" app:icon="@drawable/ic_search" android:tooltipText="@string/analyze_tooltip" app:iconTint="@android:color/system_accent1_700" android:textColor="@android:color/system_accent1_700" android:text="@string/analyze" android:minWidth="0dp" app:backgroundTint="@android:color/transparent"/>Primero. Estoy bastante seguro de que mi "código" no está bien compuesto + idk si necesito agregar algo a los botones.
Gracias por tu tiempo :D
Por qué su código no funcionará:
R.id.cleanBtn es un ID de Int, no un botón. Intentar lanzar un Int en un botón bloqueará la aplicación. (La transmisión no es lo mismo que la conversión; le promete al compilador que algo ya es otra cosa). Los ID se usan para buscar jerarquías de vista existentes para la vista real que desea usando algo como rootView.findViewById<Button>(R.id.cleanBtn) , pero esta estrategia no es práctica aquí ya que no tiene acceso directo a la jerarquía de vistas.La forma correcta de hacer esto no es en la pantalla de configuración, sino en la pantalla principal. Las preferencias que se configuran en una pantalla de preferencias de forma predeterminada se guardan en las preferencias compartidas "predeterminadas" y se guardan de forma persistente, por lo que se pueden leer desde cualquier otro lugar de su aplicación.
Yo lo que haría sería leer el valor actual de la preferencia en la función onResume() de la actividad o fragmento de tu pantalla principal. Se llamará a onResume() cada vez que vuelva a aparecer esa pantalla, por lo que le da la oportunidad de verificar y aplicar la configuración la primera vez que aparece la vista y cada vez que regresa de la pantalla de preferencias, donde el valor puede haber cambiado.
//in main screen class private var isButtonPositionFlipped = false // Only need this function if in a Fragment // Need to reset the property in case Fragment has recreated its view override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) //... isButtonPositionFlipped = false } override fun onResume() { super.onResume() val sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this) // use requireContext() instead of this if we're in a Fragment class val shouldFlipButtonPosition = sharedPreferences.getBoolean("buttonpositions", false) if (isButtonPositionFlipped != shouldFlipButtonPosition) { isButtonPositionFlipped = shouldFlipButtonPosition val cleanBtn = findViewById<Button>(R.id.cleanBtn) val analyzeBtn = findViewById<Button>(R.id.analyzeBtn) // use requireView().findViewByID if in a Fragment class if (isButtonPositionFlipped) { // swap the buttons here } else { // swap them back here } } }En cuanto a cómo intercambiarlos, eso depende del tipo de diseño en el que se encuentren. Si están en un ConstraintLayout, creo que será bastante complicado, pero no lo he probado antes. Puede intentar poner cada uno de los dos botones dentro de FrameLayouts. Luego, podría obtener las vistas de FrameLayout e intercambiar las vistas secundarias entre ellas.
Editar: en realidad, creo que sería más fácil en este caso simplemente hacer que sus botones tengan un nombre más genérico. En lugar de intercambiarlos, simplemente cambie su texto y haga clic en los oyentes a los opuestos.