es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

context.getTheme().resolveAttribute() devuelve un valor de color incorrecto en Android 12 cuando cambia UIMode.

Para evitar recrear la interfaz de usuario, agregué este código a mi proyecto.

AndroidManifest.xml

...
<activity
    android:windowsoftinputmode="adjustresize"
    android:configchanges="keyboardhidden|orientation|screensize|uimode"
...

activity

@override
public void onconfigurationchanged(@nonnull configuration newconfig) {
    super.onconfigurationchanged(newconfig);
    if (isnightmode != exampleutil.isnightmode()) {
        isnightmode = !isnightmode;
        onuimodechanges();
        setuptheme();
    }
}

@override
public void onuimodechanges() {
    int colorbgd = exampleutil.getcolorint(this, android.r.attr.colorbackground);
    int colorscrim = exampleutil.getcolorint(this, r.attr.scrimbackground);
    int colorprimary = exampleutil.getcolorint(this, r.attr.colorprimary);
    int coloronprimary = exampleutil.getcolorint(this, r.attr.coloronprimary);
    int colorsurface = exampleutil.getcolorint(this, r.attr.colorsurface);
    int coloronsurface = exampleutil.getcolorint(this, r.attr.coloronsurface);
    // utilizando estos colores para actualizar los elementos de la interfaz de usuario.
}

exampleutil.java

public static boolean isnightmode() {
    return isnightmode(resources.getsystem().getconfiguration());
}

public static boolean isnightmode(configuration configuration) {
    return (configuration.uimode & configuration.ui_mode_night_mask) == configuration.ui_mode_night_yes;
}

public static int getcolorint(context context, @attrres int resid) {
    typedvalue tv = new typedvalue();
    context.gettheme().resolveattribute(resid, tv, true);
    if (tv.type == typedvalue.type_string) return contextcompat.getcolor(context, tv.resourceid);
    return tv.data;
}

en primer lugar, estoy bastante seguro de que exampleutil.isnightmode() devuelve el valor correcto.

antes de android 12, funciona bien (en todos los dispositivos que tengo).

pero cuando se trata de android 12, solo es efectivo una vez (probado en el emulador apple m1 android y en mi google pixel 3).

depuré el código y encontré que a partir del segundo cambio de modo de interfaz de usuario, la función exampleutil.getcolorint() siempre devuelve el mismo resultado.

eso es bastante extraño. android:windowsoftinputmode=”adjustResize” android:configchanges=”keyboardHidden|orientation|screenSize|uiMode” …=”” ="" activity=""java=”” @override=”” public=”” void=”” onconfigurationchanged(@nonnull=”” configuration=”” newconfig)=”” {=”” super.onconfigurationchanged(newconfig);=”” if=”” (isnightmode=”” !=”ExampleUtil.isNightMode())” {=”” isnightmode=”!isNightMode;” onuimodechanges();=”” setuptheme();=”” }=”” }=”” @override=”” public=”” void=”” onuimodechanges()=”” {=”” int=”” colorbgd=”ExampleUtil.getColorInt(this,” android.r.attr.colorbackground);=”” int=”” colorscrim=”ExampleUtil.getColorInt(this,” r.attr.scrimbackground);=”” int=”” colorprimary=”ExampleUtil.getColorInt(this,” r.attr.colorprimary);=”” int=”” coloronprimary=”ExampleUtil.getColorInt(this,” r.attr.coloronprimary);=”” int=”” colorsurface=”ExampleUtil.getColorInt(this,” r.attr.colorsurface);=”” int=”” coloronsurface=”ExampleUtil.getColorInt(this,” r.attr.coloronsurface);=”” utilizando=”” estos=”” colores=”” para=”” actualizar=”” los=”” elementos=”” de=”” la=”” interfaz=”” de=”” usuario.=”” }=”” ="" exampleutil.java=""java=”” public=”” static=”” boolean=”” isnightmode()=”” {=”” return=”” isnightmode(resources.getsystem().getconfiguration());=”” }=”” public=”” static=”” boolean=”” isnightmode(configuration=”” configuration)=”” {=”” return=”” (configuration.uimode=”” &=”” configuration.ui_mode_night_mask)=”=” configuration.ui_mode_night_yes;=”” }=”” public=”” static=”” int=”” getcolorint(context=”” context,=”” @attrres=”” int=”” resid)=”” {=”” typedvalue=”” tv=”new” typedvalue();=”” context.gettheme().resolveattribute(resid,=”” tv,=”” true);=”” if=”” (tv.type=”=” typedvalue.type_string)=”” return=”” contextcompat.getcolor(context,=”” tv.resourceid);=”” return=”” tv.data;=”” }=”” “`=”” en=”” primer=”” lugar,=”” estoy=”” bastante=”” seguro=”” de=”” que=”” exampleutil.isnightmode()=”” devuelve=”” el=”” valor=”” correcto.=”” antes=”” de=”” android=”” 12,=”” funciona=”” bien=”” (en=”” todos=”” los=”” dispositivos=”” que=”” tengo).=”” pero=”” cuando=”” se=”” trata=”” de=”” android=”” 12,=”” solo=”” es=”” efectivo=”” una=”” vez=”” (probado=”” en=”” el=”” emulador=”” apple=”” m1=”” android=”” y=”” en=”” mi=”” google=”” pixel=”” 3).=”” depuré=”” el=”” código=”” y=”” encontré=”” que=”” a=”” partir=”” del=”” segundo=”” cambio=”” de=”” modo=”” de=”” interfaz=”” de=”” usuario,=”” la=”” función=”” exampleutil.getcolorint()=”” siempre=”” devuelve=”” el=”” mismo=”” resultado.=”” eso=”” es=”” bastante=””></activity
android:windowsoftinputmode=”adjustresize”
android:configchanges=”keyboardhidden|orientation|screensize|uimode”


activity ```java @override public void onconfigurationchanged(@nonnull configuration newconfig) { super.onconfigurationchanged(newconfig); if (isnightmode != exampleutil.isnightmode()) { isnightmode = !isnightmode; onuimodechanges(); setuptheme(); } } @override public void onuimodechanges() { int colorbgd = exampleutil.getcolorint(this, android.r.attr.colorbackground); int colorscrim = exampleutil.getcolorint(this, r.attr.scrimbackground); int colorprimary = exampleutil.getcolorint(this, r.attr.colorprimary); int coloronprimary = exampleutil.getcolorint(this, r.attr.coloronprimary); int colorsurface = exampleutil.getcolorint(this, r.attr.colorsurface); int coloronsurface = exampleutil.getcolorint(this, r.attr.coloronsurface); // utilizando estos colores para actualizar los elementos de la interfaz de usuario. }

exampleutil.java

public static boolean isnightmode() {
    return isnightmode(resources.getsystem().getconfiguration());
}

public static boolean isnightmode(configuration configuration) {
    return (configuration.uimode & configuration.ui_mode_night_mask) == configuration.ui_mode_night_yes;
}

public static int getcolorint(context context, @attrres int resid) {
    typedvalue tv = new typedvalue();
    context.gettheme().resolveattribute(resid, tv, true);
    if (tv.type == typedvalue.type_string) return contextcompat.getcolor(context, tv.resourceid);
    return tv.data;
}

en primer lugar, estoy bastante seguro de que exampleutil.isnightmode() devuelve el valor correcto.

antes de android 12, funciona bien (en todos los dispositivos que tengo).

pero cuando se trata de android 12, solo es efectivo una vez (probado en el emulador apple m1 android y en mi google pixel 3).

depuré el código y encontré que a partir del segundo cambio de modo de interfaz de usuario, la función exampleutil.getcolorint() siempre devuelve el mismo resultado.

eso es bastante extraño.>

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Android 12 – Problema con los cambios de UIMode

    Como experto en TI especializado en Android, Android-12 y el tema oscuro de Android, me encontré con un problema relacionado con los cambios de UIMode en Android 12. Para evitar la recreación de la interfaz de usuario, agregué el siguiente código a mi proyecto:

    En AndroidManifest.xml

    ...
    <activity
        android:windowSoftInputMode="adjustResize"
        android:configChanges="keyboardHidden|orientation|screenSize|uiMode"
    ...
    

    En la actividad

    @Override
    public void onConfigurationChanged(@NonNull Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        if(isNightMode != ExampleUtil.isNightMode()){
            isNightMode = !isNightMode;
            onUIModeChanges();
            setupTheme();
        }
    }
    
    @Override
    public void onUIModeChanges() {
        int colorBgd = ExampleUtil.getColorInt(this, android.R.attr.colorBackground);
        int colorScrim = ExampleUtil.getColorInt(this, R.attr.scrimBackground);
        int colorPrimary = ExampleUtil.getColorInt(this, R.attr.colorPrimary);
        int colorOnPrimary = ExampleUtil.getColorInt(this, R.attr.colorOnPrimary);
        int colorSurface = ExampleUtil.getColorInt(this, R.attr.colorSurface);
        int colorOnSurface = ExampleUtil.getColorInt(this, R.attr.colorOnSurface);
       // utilizando estos colores de arriba para actualizar los widgets de la interfaz de usuario.
    }
    

    En ExampleUtil.java

    public static boolean isNightMode() {
        return isNightMode(Resources.getSystem().getConfiguration());
    }
    
    public static boolean isNightMode(Configuration configuration) {
        return (configuration.uiMode & Configuration.UI_MODE_NIGHT_MASK) == Configuration.UI_MODE_NIGHT_YES;
    }
    
    public static int getColorInt(Context context, @AttrRes int resId) {
        TypedValue tv = new TypedValue();
        context.getTheme().resolveAttribute(resId, tv, true);
        if (tv.type == TypedValue.TYPE_STRING) return ContextCompat.getColor(context, tv.resourceId);
        return tv.data;
    }
    

    Antes de Android 12, el fragmento de código anterior funcionaba bien en todos los dispositivos. Pero cuando lo probé en dispositivos con Android 12 como el emulador Apple M1 Android y el Google Pixel 3, me encontré con un problema en el que la función ExampleUtil.getColorInt() siempre devolvía el mismo valor a partir del segundo cambio de modo de interfaz de usuario. Era extraño y dejó de funcionar en dispositivos con Android 12.

    Tuve que depurar el código para encontrar el motivo y me di cuenta de que Android 12 tiene algunos cambios en el Administrador de recursos que causan este problema.

Comments are closed.