java - para - manual de programacion android pdf
¿Cómo puedo obtener un contenido de recursos de un contexto estático? (8)
- Cree una subclase de
Application
, por ejemplopublic class App extends Application {
- Establezca el atributo
android:name
de su etiqueta<application>
enAndroidManifest.xml
para que apunte a su nueva clase, por ejemplo,android:name=".App"
- En el método
onCreate()
de la instancia de su aplicación, guarde su contexto (por ejemplo,this
) en un campo estático llamadomContext
y cree un método estático que devuelva este campo, por ejemplo,getContext()
:
Así es como debería verse:
public class App extends Application{
private static Context mContext;
@Override
public void onCreate() {
super.onCreate();
mContext = this;
}
public static Context getContext(){
return mContext;
}
}
Ahora puede usar: App.getContext()
siempre que quiera obtener un contexto, y luego getResources()
(o App.getContext().getResources()
).
Quiero leer cadenas de un archivo xml
antes de hacer cualquier otra cosa como setText
en widgets, entonces, ¿cómo puedo hacer eso sin un objeto de actividad para llamar a getResources()
?
Creo que más camino es posible. Pero a veces, estoy usando esta solución. (completo global):
import android.content.Context;
import <your package>.R;
public class XmlVar {
private XmlVar() {
}
private static String _write_success;
public static String write_success() {
return _write_success;
}
public static void Init(Context c) {
_write_success = c.getResources().getString(R.string.write_success);
}
}
//After activity created:
cont = this.getApplicationContext();
XmlVar.Init(cont);
//And use everywhere
XmlVar.write_success();
En su clase, donde implementa la función estática , puede llamar a un método privado / público de esta clase. El método private / public puede acceder a getResources .
por ejemplo:
public class Text {
public static void setColor(EditText et) {
et.resetColor(); // it works
// ERROR
et.setTextColor(getResources().getColor(R.color.Black)); // ERROR
}
// set the color to be black when reset
private void resetColor() {
setTextColor(getResources().getColor(R.color.Black));
}
}
y de otra clase / actividad, puede llamar:
Text.setColor(''some EditText you initialized'');
Otra solución:
Si tiene una subclase estática en una clase externa no estática, puede acceder a los recursos desde dentro de la subclase a través de variables estáticas en la clase externa, que iniciará en la creación de la clase externa. Me gusta
public class Outerclass {
static String resource1
public onCreate() {
resource1 = getString(R.string.text);
}
public static class Innerclass {
public StringGetter (int num) {
return resource1;
}
}
}
Lo usé para la función getPageTitle (int position) del FragmentPagerAdapter estático dentro de mi FragmentActivity que es útil debido a I8N.
También hay otra posibilidad. Puedo cargar sombreadores OpenGl de recursos como este:
static private String vertexShaderCode;
static private String fragmentShaderCode;
static {
vertexShaderCode = readResourceAsString("/res/raw/vertex_shader.glsl");
fragmentShaderCode = readResourceAsString("/res/raw/fragment_shader.glsl");
}
private static String readResourceAsString(String path) {
Exception innerException;
Class<? extends FloorPlanRenderer> aClass = FloorPlanRenderer.class;
InputStream inputStream = aClass.getResourceAsStream(path);
byte[] bytes;
try {
bytes = new byte[inputStream.available()];
inputStream.read(bytes);
return new String(bytes);
} catch (IOException e) {
e.printStackTrace();
innerException = e;
}
throw new RuntimeException("Cannot load shader code from resources.", innerException);
}
Como puede ver, puede acceder a cualquier recurso en ruta /res/...
Cambiar una clase a su clase. También es así como cargo los recursos en las pruebas (androidTests)
The Singleton:
package com.domain.packagename;
import android.content.Context;
/**
* Created by Versa on 10.09.15.
*/
public class ApplicationContextSingleton {
private static PrefsContextSingleton mInstance;
private Context context;
public static ApplicationContextSingleton getInstance() {
if (mInstance == null) mInstance = getSync();
return mInstance;
}
private static synchronized ApplicationContextSingleton getSync() {
if (mInstance == null) mInstance = new PrefsContextSingleton();
return mInstance;
}
public void initialize(Context context) {
this.context = context;
}
public Context getApplicationContext() {
return context;
}
}
Inicialice Singleton en su subclase de Application
:
package com.domain.packagename;
import android.app.Application;
/**
* Created by Versa on 25.08.15.
*/
public class mApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
ApplicationContextSingleton.getInstance().initialize(this);
}
}
Si no estoy equivocado, esto le da un gancho a applicationContext en todas partes, llámalo con ApplicationContextSingleton.getInstance.getApplicationContext();
No debería necesitar aclarar esto en ningún momento, ya que cuando se cierra la aplicación, esto conlleva de todos modos.
Recuerde actualizar AndroidManifest.xml
para usar esta subclase de la Application
:
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="com.domain.packagename"
>
<application
android:allowBackup="true"
android:name=".mApplication" <!-- This is the important line -->
android:label="@string/app_name"
android:theme="@style/AppTheme"
android:icon="@drawable/app_icon"
>
Ahora debería poder usar ApplicationContextSingleton.getInstance (). GetApplicationContext (). GetResources () desde cualquier lugar, también los pocos lugares donde las subclases de aplicaciones no pueden.
Por favor, avíseme si ve algo mal aquí, gracias. :)
Utilizar
Resources.getSystem().getString(android.R.string.cancel)
¡Puedes usarlos en todas partes en tu aplicación, incluso en declaraciones constantes estáticas! ¡Pero solo para recursos del sistema!
si tienes un contexto, quiero decir adentro;
public void onReceive(Context context, Intent intent){
}
puedes usar este código para obtener recursos:
context.getResources().getString(R.string.app_name);