Digamos que, en mi llamada a la API tengo un parámetro que se llama color. Es posible editar o modificar una existente R.colors.color para asignar el color de la API resultado?

Como un ejemplo:

Puedo hacer una llamada a mi API y devuelve green, ahora quiero cargar mi aplicación con el yo.e (verde Toolbar, verde TextView color, etc.), es eso posible?

Mi primer pensamiento fue:

Crear un elemento en colors.xml llamado demo, a continuación, asignar un color predeterminado, a continuación, utilizar esta demo color donde yo quiero (Button, TextView, etc.) Entonces pensé que podría ser posible cambiar este valor mediante programación con el resultado de la API, así que no necesitamos para crear un SharedPreferences o algo así y para evitar más código.

Como @Y. S. me dijo

Por desgracia, TENDRÁ que establecer el color del texto o en vista manualmente en todas partes … 🙁

Me gustaría si hay otra manera de hacerlo, ya no sé cuántos Activities mi proyecto contendrá, por lo que si es que hay otra forma de hacerlo me alegra escuchar otras conjeturas.

EDITAR

Estoy tratando de @Jared Rummler respuesta y tal vez estoy haciendo algo mal… he creado un sencillo Json y me puse mi Activos de analizar la Json y me puso en una GlobalConstant luego me hizo un «simple aplicación».

Primero de todo tengo un TextView y un Button que contiene el «your_special_color», y el retorno de los que puse el GlobalConstant int de la siguiente manera :

case "your_special_color":                
            return GlobalConstant.color; 

A continuación, lo que he intentado es mi primer Activity tiene 1 TextView y 1 Button como he dicho antes y tienen el color «your_special_color» que yo no quiero cambiar, PERO tengo una Intent en mi Button para abrir la otra Activity que contiene la misma, pero con la GlobalConstant.color y no cambia.

He intentado hacer esto (mi segunda Actividad):

public class Main2Activity extends AppCompatActivity {
private Res res;
@Override public Resources getResources() {
    if (res == null) {
        res = new Res(super.getResources());
    }
    return res;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main2);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
}

¿ Me olvido de algo?

Oh.. me lo imaginé supongo que está haciendo esto en mi MainActivity2 ?

 Button btn = (Button)findViewById(R.id.button2);
 btn.setBackgroundColor(res.getColor(R.color.your_special_color));
  • sacaste alguna solución a eso ?
  • Hey! ¿Finalmente resolver esto? Estoy frente a un problema similar!
  • Siga las Jared solución funciona supongo
  • Echa un vistazo Cyanea para cambiar dinámicamente primaria y los colores de acento: github.com/jaredrummler/Cyanea

5 Comentarios

  1. 25

    Si usted echa un vistazo a la El Acceso A Los Recursos documento, lo que dice es que …

    Una vez que proporcionar un recurso en su aplicación, usted puede aplicar por la referencia a su IDENTIFICADOR de recurso. Todos los Identificadores de recursos que son definidos en su proyecto R de clase, que la aapt herramienta genera automáticamente.

    Además,

    Cuando su aplicación es compilado, aapt genera la R clase,
    que contiene los Identificadores de recursos para todos los recursos de su res/
    directorio. Para cada tipo de recurso, hay un R subclase (para
    ejemplo, R.drawable para todos los dibujable recursos), y para cada
    recurso de ese tipo, no es estático de un número entero (por ejemplo,
    R.drawable.icon). Este entero es el ID de recurso que se puede utilizar
    para recuperar sus recursos.

    Lo que esto está diciendo, en esencia, es que casi todo lo celebró como un de recursos en el res/ directorio se compila y se hace referencia como una constante inmutable. Es por esta razón que los valores de los elementos de recursos no se puede cambiar mediante programación/en tiempo de ejecución, debido a que son compilado. En contraposición a lo local/global variables & SharedPreferences, elementos y recursos están representados en la memoria de programa como algo fijo, inmutable objetos. Se celebran en un especial de sólo lectura región de la memoria de programa. En este sentido, véase también la Cambio de valor de R. de la Cadena de Programación.

    Lo que puede hacer es, para evitar usar el mismo código en mil lugares en su proyecto, crear una función común que cambia el valor del color en la SharedPreferences y el uso de este método en todas partes. Estoy seguro de que sabía que esto ya, por supuesto.

    Para reducir la cantidad de código necesario para añadir al proyecto, hay una alternativa. Anteriormente he utilizado el la caligrafía de la biblioteca que me permitió corregir el estilo de la fuente & de color en toda la aplicación. Esto puede ser de buen uso para ti, échale un vistazo …

    • Así que usted está diciendo a mí que no es posible hacer eso…? Entonces voy a tener que crear en cada uno de los fragmentos en cada actividad el color a la vista?
    • Eso es correcto, usted no puede hacer eso. Pero usted no tiene que crear el color varias veces, usted puede crear en una clase base común y mantener el valor de una variable global que se puede utilizar en todas partes. Por desgracia, SE tiene que establecer el color del texto o en vista manualmente en todas partes … 🙁
    • Sí, eso a lo que me refería… que puedo guardar el valor en sharedpref, a continuación, crear un globalclaas a declarar el color, pero luego… Todo el setcolor de fondo son necesarios bueno… voy a tratar de encontrar otra solución en algún lugar si no encuentro voy a hacer lo que dice @Y. S.
    • Me acabo de acordar de algo … por favor, consulte editar … podría ser útil …
    • Con esto de la api puedo conseguir una fuente así?
    • Por favor explique …
    • ¿Quiere decir que puedo asignar un tipo de letra de la aplicación y, a continuación, declarar el color?
    • Ver el uso de la caligrafía de la biblioteca … se le ve a la fuente personalizada en XML (esto no es posible por defecto en Android). Y le permite definir las fuentes de un Activity sin llamar setTypeFace() en todas partes. Esto puede ayudar a hacer que su trabajo sea más fácil.
    • Empecé una recompensa para ver si tienen otra forma de hacerlo… de lo contrario, la recompensa es para ti 😉
    • Gracias y buena suerte 🙂 …. Hablar con usted pronto …
    • ver la respuesta que @Jared Rummler dio a mí, es así de bueno?
    • Es una idea interesante, aunque a primera vista no le puedo decir cómo ayuda a resolver este problema … 😛
    • Voy a probarlo, he visto que has publicado un comentario en la respuesta que yo estaba preguntando lo mismo… vamos a ver si él repeticiones a tu pregunta 🙂
    • Te enteraste de la variante de construir?
    • Supongo que te refieres a construir la variante de … Sí, eso es un enfoque, pero que no es lo mismo que el cambio de valores en tiempo de ejecución …
    • Yo amo @Y. S. si usted tiene el tiempo, hágamelo saber si usted tiene alguna pista acerca de this
    • Hey Skizo … por supuesto que voy a ver a esa pregunta … 🙂 lo Siento por no responder a tu último comentario … ¿que me envíe un recordatorio de la tarde de hoy si se me olvida … definitivamente respuesta … 🙂
    • Bueno gracias, creo que juntos podemos resolver el problema 🙂
    • Recordatorio ^_^ 😀
    • Agrega una recompensa 😀
    • Lo siento por el retraso, Skizo … estoy buscando a esa pregunta ahora … 🙂
    • ¿cuánto tiempo puede usted intente ayudarme en este issue? 😀
    • Marque esta question se trata de servicios por favor 😀

  2. 56

    Puede crear una clase que herede de Resources y reemplazar los métodos getColor(int) y getColor(int, Theme).

    Ejemplo:

    colors.xml

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <color name="your_special_color">#FF0099CC</color>
    </resources>

    Res.java

    public class Res extends Resources {
    
        public Res(Resources original) {
            super(original.getAssets(), original.getDisplayMetrics(), original.getConfiguration());
        }
    
        @Override public int getColor(int id) throws NotFoundException {
            return getColor(id, null);
        }
    
        @Override public int getColor(int id, Theme theme) throws NotFoundException {
            switch (getResourceEntryName(id)) {
                case "your_special_color":
                    //You can change the return value to an instance field that loads from SharedPreferences.
                    return Color.RED; //used as an example. Change as needed.
                default:
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                        return super.getColor(id, theme);
                    }
                    return super.getColor(id);
            }
        }
    }

    BaseActivity.java

    public class BaseActivity extends AppCompatActivity {
    
        ...
    
        private Res res;
    
        @Override public Resources getResources() {
            if (res == null) {
                res = new Res(super.getResources());
            }
            return res;
        }
    
        ...
    
    }

    Este es el enfoque que he utilizado en una de mis aplicaciones, Raíz De Comprobar. Si reemplaza getResources en sus actividades y la clase principal de la aplicación se puede cambiar el tema de la programación (aunque los temas son inmutables). Si quieres, descargar la aplicación y ver cómo se puede establecer la primaria, el acento, los colores del fondo y de las preferencias.

    • gracias por tu respuesta tio! Voy a leer detenidamente y tratar de ver si es lo que necesito, con esto creo que si puedo obtener un color (int) a partir de una llamada a la API y lo uso en todos mis fondos, estilos, etc… mi color por defecto se mostrará el color de la API?
    • Me he descargado, la he usado antes didnd no saber el dev de esta aplicación aquí :P, increíble animación en el inicio… y sí, vi cómo cambiar los colores, pero se volverá negro la pantalla por un segundo? Sólo necesito hacer esto en el inicio de la APLICACIÓN…
    • No lo entiendo … ¿cómo primordial getColor() ayudar a cambiar los valores fijos de los elementos y recursos en tiempo de ejecución ?
    • Si miramos el código, es la comprobación de que el nombre del recurso. Si es cierto id, usted puede tener getColor retorno de un color diferente valor. Usted también podría hacer esto para getDrawable o incluso getString.
    • cierto, pero no usted todavía tiene que llamar getColor() para obtener diferentes vistas/widgets ?
    • Quiero decir que puedo usar esto : el retorno de Color.ROJO; como resultado de mi int color de la llamada a la api?
    • si usted sigue mi respuesta getResources().getColor(R.color.your_special_color) volverá de color rojo en vez de lo que se establece en res/colors.xml. Si quieres, yo probablemente podría publicar un pequeño ejemplo de GitHub. Tu pregunta es un poco ambigua. Quieres un color de recursos para devolver un valor diferente de establecer mediante programación, ¿correcto?
    • Bueno, sí, creo que tienes porque es bastante simple, primero he creado mi aplicación con un default_value y lo he usado en toda la aplicación (ActionBar background, textColor, etc…) Así que ahora, yo quiero que si yo recibo de mi API el color Purple (por ejemplo), el default_value se convierten en purple, y me pregunto si voy a tener que hacerlo para cada vista en mi aplicación… Porque, como S. S. me dijo: cuando se compila la APLICACIÓN se compila la clase R, entonces el color está en ella….
    • Todos los puntos de vista utilizará getResources de su Activity para obtener el color a menos que se utiliza una costumbre ContextThemeWrapper (desde mi experiencia, esto sólo se utiliza en AlertDialog). Simplemente siga los pasos en la respuesta o puedo publicar una muestra. Yo estaba pensando de código abierto el tema cambio de la biblioteca estoy usando en mi aplicación.
    • Pero digamos que tengo mis estilos con mi color personalizado (barra de herramientas, pestañas, etc..) y mi color de texto de los botones de mi, tengo que tener para getResources a partir de todos esos widgets? @JaredRummler
    • Has leído mi comentario?
    • He leído sus comentarios. Es difícil entender exactamente lo que usted está buscando para hacer. ¿Probar mi respuesta?
    • Voy a tratar de explicarlo mejor… desde mi API puedo obtener un «rojo» de color, y en MainActivity puedo obtener esta «red» de color, a partir de aquí todo bien? ok, entonces en mi APLICACIÓN que se utiliza para el uso de «default» color para todos mis widgets/puntos de vista, y me gustaría cambiar el «default» a «rojo» (HEX, obviamente).
    • Quiero decir que si me la int de una llamada a la API que se llama en MainActivity ¿cómo puedo return Color.RED; devolver el color correcto?
    • Por favor, ver a mi Editar estoy tratando de su respuesta….
    • No voy a estar disponible para otras 6 horas. Siéntase libre de enviarme un correo electrónico y voy a ayudarte. [email protected]
    • He enviado por correo electrónico, no has contestado a mi pregunta…. 🙁
    • Te voy a responder más tarde esta noche
    • No puedo agradecer lo suficiente!
    • He reemplazado el método en mi actividad y aplicación. He <item name="colorAccent">@color/colorAccent</item>, en mi tema. Yo uso ?attr/colorAccent en xml, pero no tiene ningún efecto. Tengo anulada por caso:»colorAccent» en el método que usted pidió
    • Lo siento chicos, pero es que ahora DEPECRATED
    • ¿me pueden enviar el código de ejemplo para cambiar el color de tema? mi correo electrónico [email protected]
    • de cualquier manera alternativa? Ahora se ha quedado obsoleta
    • getColor(int, Tema) no llamar
    • u puede pls me envían con el ejemplo para esto de los cambios de color.
    • Escribí una biblioteca que cambia dinámicamente el fondo, primaria y colores de acento de una aplicación. La biblioteca no está abierta, pero espero poder compartir pronto. El código anterior no funciona en Android 6.0+ debido a que muchos de los cambios que se hicieron a los Recursos. También, yo ya no posee la Raíz de Verificación de la aplicación vinculado en la respuesta.
    • Echa un vistazo Cyanea para la dinámica de la tematización: github.com/jaredrummler/Cyanea
    • Hola, ¿ este método de trabajo? Yo creo que se ve prometedor y estoy tratando de hacer la prueba de interceptación de getColor(int id, Theme theme). Si he entendido bien, ¿your_special_color» corresponden a un nombre de color en colors.xml? También, hace que devuelve el color (en el ejemplo, el Color.Rojo), tiene que ser un valor codificado en algún lugar en colors.xml? Estoy tratando de cambiar el tema de color basado en una costumbre elección del usuario. Cualquier posibilidad de sustitución de la ResourceEntryName del valor hexadecimal tal vez?

  3. 10

    No se puede cambiar de una aplicación de recursos, todos ellos son constantes. En lugar usted puede guardar su color en SharedPrefences y el uso del color.

    Ver Cómo utilizar SharedPreferences en Android para almacenar, recuperar y editar los valores de.

    Si su aplicación ya tiene un R. de color.verde definido y sólo quiere el acceso se basa en lo que la API devuelve utilizar:

    int resourceID = getResources().getIdentifier("green", "color", getPackageName());
    • Yo sé acerca de SharedPreferences y creo que no me, me refería a que se puede crear un archivo llamado colors.xml derecho? y, a continuación, en crear artículos con los colores de la HEXAGONAL, entonces me gustaría saber si puedo moddify este valor mediante programación colocar en primer lugar la demo de color y, a continuación, el color real.
    • Usted no puede cambiar el contenido de colors.xml en tiempo de ejecución, en lugar usted puede mantener todos los colores posibles en el mismo y el uso getIdentifier para obtener el color devueltos por el API. Usted puede mantener el color elegido en SharedPref y recuperarlos más adelante, en el próximo período de sesiones hasta la llamada a la API de acabados
    • Ya, pero, ¿cómo establecer la textColor de un textView o botón? si tengo 10 Textviews y quiero ponerlos en texto verde que tengo que poner el setText(java) para cada uno de los responsable del centro y dándole el valor de SharedPreferences?…
    • Sí, ese es el único camino. Y además, el cambio de Recursos más adelante puede llevar a todo tipo de confusión en su aplicación
  4. 10

    R clase no se supone para ser editado. Simplemente contiene referencias a sus recursos.

    Usted tendrá que ajustar manualmente. Sin embargo, para reducir la carga de la configuración de forma manual puede intentar el uso de las bibliotecas especiales para la preferencia de ahorro, por ejemplo:

    (lista completa de bibliotecas similares https://android-arsenal.com/tag/75)


    Además, es posible que desee pensar en otra forma de aplicar estilos y paso de parámetros – considere usted quiere añadir algunos otros parámetros como la altura, la anchura, etc. Para ese propósito, usted puede definir el atributo personalizado en themes.xml/styles.xml:

    <attr name="demoColor" format="reference|color" />

    a continuación, definir estilos:

    <style name="BaseActivity">
    </style>
    <style name="GreenActivity" parent="@style/BaseActivity">
        <item name="demoColor">#00cd00</item>
    </style>
    <style name="RedActivity" parent="@style/BaseActivity">
        <item name="demoColor">#ff0000</item>
    </style>

    a continuación, usar ese color en el xml como este:

    ... android:background="?demoColor" ...

    y cambiar entre GreenActivity y RedActivity estilos en Activity.onCreate:

    setTheme(isGreenStyle() ? R.style.GreenActivity : R.style.RedActivity)
    setContentView(...)

    Con el enfoque anterior, usted será capaz de configurar fácilmente sus estilos de xml y debería ser menos código y más fácil para volver a producir en el futuro. (Usted todavía tendrá que tener una variable en preferencia a guardar si usted tiene el verde o el rojo de estilo)


    De otra manera, si desea mostrar demos de su aplicación con diferentes colores es el uso de crear variantes de /sabores por la carga de su aplicación con diferentes colores y estilos (es para construir el tiempo – no en tiempo de ejecución):

    app/src/main/res/colors.xml

    <resources>
        <color name="demoColor">#00cd00</color>
    </resources>

    app/src/buildVariant/res/colors.xml

    <resources>
        <color name="demoColor">#ff0000</color>
    </resources>

    Ahora usted puede cambiar rápidamente entre los «principales» y «buildVariant» en Construir Variantes de menú y el lanzamiento de su aplicación con diferentes «demo» de colores. De la misma manera que usted puede personalizar un montón de otros atributos.

    De la búsqueda para «Construir Variantes» aquí http://developer.android.com/tools/building/configuring-gradle.html

    • Oh no oír acerca de esto… Así que puedo cambiar el valor mediante programación si puedo usar el buildvariant?
    • construir las variantes de / sabores no son para cambiar el valor de programación – permiten generar y ejecutar la aplicación con diferentes estilos/colores/recursos. Parece que me perdí de «programación» parte de sus preguntas 🙂 voy a actualizar mi respuesta un poco. Sería de gran ayuda si pudieras especificar un uso real de la funcionalidad que usted está tratando de implementar. Tal vez hay una mejor manera de hacerlo.
    • Bueno, yo sólo quiero guardar el color, no el estilo.
    • Lo que yo veo. Añadido un par de preferencia de las bibliotecas, así que usted podría considerar el uso de ellos, ya que permiten enlazar preferencias – esto podría ayudar con la reducción de código.
    • Esto es exactamente lo que estaba buscando!!! Eres un genio! Esto le da la posibilidad de usar Colores en los diseños y en el código así. Aquí es un buen ejemplo para usarlo en el código: stackoverflow.com/questions/17277618/…
    • su respuesta, y este código : ?demoColor , me ayudan mucho . eso quiero .

  5. 3

    tienda hex códigos de color en sharedpreferences y, a continuación, utilizar parsecolor función de almacenar todos sus hexcodes de colores en las sesiones como una cadena y cada vez que usted quiere cambiar el color de particular botón ,textview..solo recupero de que el código de color de sesión y utilizar como

    para el ex.

    session.setString("white","#FFFFFF");
    String colorname=session.getString("white");yourtextview.setBackgroundColor(Color.parseColor(colorname);

    • ¿Qué es eso? Puede usted expain un poco tu código?

Dejar respuesta

Please enter your comment!
Please enter your name here