Ben widget xml
gibi başka bir şey yapmadan önce bir dosyadan dizeleri okumak istiyorum setText
, bu yüzden aramak getResources()
için bir etkinlik nesnesi olmadan nasıl yapabilirim ?
Ben widget xml
gibi başka bir şey yapmadan önce bir dosyadan dizeleri okumak istiyorum setText
, bu yüzden aramak getResources()
için bir etkinlik nesnesi olmadan nasıl yapabilirim ?
Yanıtlar:
Application
Örneğin, bir alt sınıf oluşturunpublic class App extends Application {
android:name
niteliğini yeni sınıfınızı gösterecek şekilde ayarlayın , ör.<application>
AndroidManifest.xml
android:name=".App"
onCreate()
your bağlamda (örn tasarrufu uygulama örneğinin yöntemi this
adında bir statik alana) mContext
ve statik yöntemini oluşturmak olduğunu döndürür bu alan, örneğin getContext()
:İşte böyle görünmeli:
public class App extends Application{
private static Context mContext;
@Override
public void onCreate() {
super.onCreate();
mContext = this;
}
public static Context getContext(){
return mContext;
}
}
Şimdi şunu kullanabilirsiniz: App.getContext()
bir bağlam elde etmek istediğinizde ve sonra getResources()
(veya App.getContext().getResources()
).
Yalnızca sistem kaynakları için!
kullanım
Resources.getSystem().getString(android.R.string.cancel)
Bunları uygulamanızın her yerinde, statik sabit bildirimlerinde bile kullanabilirsiniz!
Toast
, örneğin bir alma SharedPreference
benim Latince dil öğretmeni söylediği gibi, bir veritabanı açın örneği: vesaire ).
Kotlin çözümüm statik bir Uygulama bağlamı kullanmaktır:
class App : Application() {
companion object {
lateinit var instance: App private set
}
override fun onCreate() {
super.onCreate()
instance = this
}
}
Ve her yerde kullandığım Strings sınıfı:
object Strings {
fun get(@StringRes stringRes: Int, vararg formatArgs: Any = emptyArray()): String {
return App.instance.getString(stringRes, *formatArgs)
}
}
Böylece kaynak dizgileri elde etmenin temiz bir yoluna sahip olabilirsiniz
Strings.get(R.string.some_string)
Strings.get(R.string.some_string_with_arguments, "Some argument")
Lütfen bu cevabı silmeyin, bir tane bırakayım.
Strings
, yardımcı oldu.
Başka bir olasılık daha var. OpenGl gölgelendiricileri böyle kaynaklardan yüklüyorum:
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);
}
Gördüğünüz gibi , sınıfınızın /res/...
Değiştir yolundaki herhangi bir kaynağa erişebilirsiniz aClass
. Bu aynı zamanda testlerde kaynakları nasıl yüklerim (androidTests)
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;
}
}
Application
Alt sınıfınızdaki Singleton'u başlatın :
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);
}
}
Eğer yanılmıyorsam, bu, her yerde applicationContext'e bir kanca verir, onu arayın ApplicationContextSingleton.getInstance.getApplicationContext();
, Uygulama kapandığında olduğu gibi, herhangi bir noktada bunu temizlemeniz gerekmemelidir.
AndroidManifest.xml
Bu Application
alt sınıfı kullanmak için güncellemeyi unutmayın :
<?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"
>
Artık ApplicationContextSingleton.getInstance (). GetApplicationContext (). GetResources () öğesini her yerden, ayrıca uygulama alt sınıflarının yapamayacağı çok az yerde kullanabilmeniz gerekir.
Burada yanlış bir şey görürseniz lütfen bize bildirin, teşekkür ederim. :)
Başka bir çözüm:
Statik olmayan bir dış sınıfta statik bir alt sınıfınız varsa, alt sınıfın içindeki kaynaklara, dış sınıfın oluşturulmasında başlattığınız dış sınıftaki statik değişkenler aracılığıyla erişebilirsiniz. Sevmek
public class Outerclass {
static String resource1
public onCreate() {
resource1 = getString(R.string.text);
}
public static class Innerclass {
public StringGetter (int num) {
return resource1;
}
}
}
Ben I8N nedeniyle yararlı FragmentActivity içinde statik FragmentPagerAdapter getPageTitle (int konumu) İşlevi için kullandım.
Kullandığım App.getRes()
yerine App.getContext().getResources()
(@Cristian cevap olarak)
Kodunuzun herhangi bir yerinde kullanmak çok basit!
İşte size kaynaklara istediğiniz yerden erişebileceğiniz benzersiz bir çözümUtil class
.
(1) Application
Sınıfınızı oluşturun veya düzenleyin .
import android.app.Application;
import android.content.res.Resources;
public class App extends Application {
private static App mInstance;
private static Resources res;
@Override
public void onCreate() {
super.onCreate();
mInstance = this;
res = getResources();
}
public static App getInstance() {
return mInstance;
}
public static Resources getResourses() {
return res;
}
}
(2) manifest.xml
<application
Etiketinize ad alanı ekleyin . (veya zaten varsa bunu atla)
<application
android:name=".App"
...
>
...
</application>
Şimdi gitmekte fayda var.
App.getRes().getString(R.string.some_id)
herhangi bir yerde kullanın .Bence daha fazla yol mümkün. Ama bazen, bu çözümü kullanıyorum. (tam 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();
Statik fonksiyondan openGL ES için gölgelendirici yüklüyorum.
Dosya ve dizin adınız için küçük harf kullanmanız gerektiğini unutmayın, aksi takdirde işlem başarısız olur
public class MyGLRenderer implements GLSurfaceView.Renderer {
...
public static int loadShader() {
// Read file as input stream
InputStream inputStream = MyGLRenderer.class.getResourceAsStream("/res/raw/vertex_shader.txt");
// Convert input stream to string
Scanner s = new Scanner(inputStream).useDelimiter("\\A");
String shaderCode = s.hasNext() ? s.next() : "";
}
...
}
public Static Resources mResources;
@Override
public void onCreate()
{
mResources = getResources();
}
API düzey 27 kullanıyorum ve yaklaşık iki gün boyunca mücadele ettikten sonra en iyi çözümü buldum. Etkinlik veya Uygulamadan türetilmemiş bir sınıftan bir xml dosyasını okumak istiyorsanız, aşağıdakileri yapın.
Testdata.xml dosyasını varlıklar dizinine yerleştirin.
Test veri belgesinin ayrıştırılması için aşağıdaki kodu yazın.
InputStream inputStream = this.getClass().getResourceAsStream("/assets/testdata.xml");
// create a new DocumentBuilderFactory
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// use the factory to create a documentbuilder
DocumentBuilder builder = factory.newDocumentBuilder();
// create a new document from input stream
Document doc = builder.parse(inputStream);
Statik işlevi uyguladığınız sınıfınızda, bu sınıftan private \ public yöntemini çağırabilirsiniz . Private \ public yöntemi getResources dosyasına erişebilir .
Örneğin:
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));
}
}
ve diğer \ etkinlik \ sınıfından şunları arayabilirsiniz:
Text.setColor('some EditText you initialized');
bir bağlamınız varsa, yani içeride;
public void onReceive(Context context, Intent intent){
}
kaynakları almak için bu kodu kullanabilirsiniz:
context.getResources().getString(R.string.app_name);