Câu trả lời:
Application
, ví dụpublic class App extends Application {
android:name
thuộc tính của <application>
thẻ của bạn trong AndroidManifest.xml
để trỏ đến lớp mới của bạn, ví dụ:android:name=".App"
onCreate()
phương thức ví dụ ứng dụng của bạn, hãy lưu ngữ cảnh của bạn (ví dụ this
) vào trường tĩnh có tên mContext
và tạo phương thức tĩnh trả về trường này, ví dụ getContext()
:Đây là cách nó sẽ trông:
public class App extends Application{
private static Context mContext;
@Override
public void onCreate() {
super.onCreate();
mContext = this;
}
public static Context getContext(){
return mContext;
}
}
Bây giờ bạn có thể sử dụng: App.getContext()
bất cứ khi nào bạn muốn có được một bối cảnh, và sau đó getResources()
(hoặc App.getContext().getResources()
).
Chỉ dành cho tài nguyên hệ thống!
Sử dụng
Resources.getSystem().getString(android.R.string.cancel)
Bạn có thể sử dụng chúng ở mọi nơi trong ứng dụng của mình, ngay cả trong các khai báo hằng tĩnh!
Toast
ví dụ, lấy SharedPreference
ví dụ, mở cơ sở dữ liệu, như giáo viên ngôn ngữ Latinh của tôi nói: et cetera ).
Giải pháp Kotlin của tôi là sử dụng bối cảnh Ứng dụng tĩnh:
class App : Application() {
companion object {
lateinit var instance: App private set
}
override fun onCreate() {
super.onCreate()
instance = this
}
}
Và lớp String, mà tôi sử dụng ở mọi nơi:
object Strings {
fun get(@StringRes stringRes: Int, vararg formatArgs: Any = emptyArray()): String {
return App.instance.getString(stringRes, *formatArgs)
}
}
Vì vậy, bạn có thể có một cách rõ ràng để có được chuỗi tài nguyên
Strings.get(R.string.some_string)
Strings.get(R.string.some_string_with_arguments, "Some argument")
Xin đừng xóa câu trả lời này, hãy để tôi giữ một câu.
Strings
rất hữu ích.
Ngoài ra còn có một khả năng khác. Tôi tải các shader OpenGl từ các tài nguyên như thế này:
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);
}
Như bạn có thể thấy, bạn có thể truy cập bất kỳ tài nguyên nào trong đường dẫn /res/...
Thay đổi aClass
lớp của bạn. Đây cũng là cách tôi tải tài nguyên trong các bài kiểm tra (androidTests)
Người độc thân:
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;
}
}
Khởi tạo Singleton trong Application
lớp con của bạ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);
}
}
Nếu tôi không sai, điều này mang lại cho bạn một liên kết với applicationContext ở mọi nơi, hãy gọi nó với ApplicationContextSingleton.getInstance.getApplicationContext();
Bạn không nên xóa điều này bất cứ lúc nào, vì khi ứng dụng đóng, dù sao thì nó cũng đi theo.
Hãy nhớ cập nhật AndroidManifest.xml
để sử dụng Application
lớp con này :
<?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"
>
Bây giờ bạn sẽ có thể sử dụng ApplicationContextSingleton.getInstance (). GetApplicationContext (). GetResource () từ bất cứ nơi nào, cũng như rất ít nơi mà các lớp con ứng dụng có thể xóa.
Xin vui lòng cho tôi biết nếu bạn thấy bất cứ điều gì sai ở đây, cảm ơn bạn. :)
Giải pháp khác:
Nếu bạn có một lớp con tĩnh trong lớp ngoài không tĩnh, bạn có thể truy cập các tài nguyên từ bên trong lớp con thông qua các biến tĩnh trong lớp bên ngoài, mà bạn khởi tạo khi tạo lớp ngoài. Giống
public class Outerclass {
static String resource1
public onCreate() {
resource1 = getString(R.string.text);
}
public static class Innerclass {
public StringGetter (int num) {
return resource1;
}
}
}
Tôi đã sử dụng nó cho Hàm getPageTitle (vị trí int) của FragmentPagerAd CHƯƠNG tĩnh trong FragmentActivity của tôi rất hữu ích vì I8N.
Tôi sử dụng App.getRes()
thay vì App.getContext().getResources()
(như @Cristian đã trả lời)
Nó rất đơn giản để sử dụng bất cứ nơi nào trong mã của bạn!
Vì vậy, đây là một giải pháp độc đáo mà bạn có thể truy cập tài nguyên từ bất cứ nơi nào như thế Util class
.
(1) Tạo hoặc chỉnh sửa Application
lớp của bạn .
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) Thêm trường tên vào manifest.xml
<application
thẻ của bạn . (hoặc Bỏ qua phần này nếu đã có)
<application
android:name=".App"
...
>
...
</application>
Bây giờ bạn tốt để đi.
App.getRes().getString(R.string.some_id)
bất cứ nơi nào trong mã.Tôi nghĩ rằng, nhiều cách là có thể. Nhưng đôi khi, tôi sử dụng giải pháp này. (toàn cầu):
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();
Tôi tải shader cho openGL ES từ hàm tĩnh.
Hãy nhớ rằng bạn phải sử dụng chữ thường cho tên tệp và thư mục của mình, nếu không thao tác sẽ không thành công
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();
}
Tôi đang sử dụng API cấp 27 và tìm thấy một giải pháp tốt nhất sau khi vật lộn khoảng hai ngày. Nếu bạn muốn đọc tệp xml từ một lớp không xuất phát từ Hoạt động hoặc Ứng dụng thì hãy làm như sau.
Đặt tệp testdata.xml trong thư mục tài sản.
Viết đoạn mã sau để lấy tài liệu testdata được phân tích cú pháp.
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);
Trong lớp của bạn, nơi bạn triển khai hàm tĩnh , bạn có thể gọi một phương thức private \ public từ lớp này. Phương thức private \ public có thể truy cập vào getResource .
ví dụ:
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));
}
}
và từ lớp \ hoạt động khác, bạn có thể gọi:
Text.setColor('some EditText you initialized');
nếu bạn có một bối cảnh, tôi có nghĩa là bên trong;
public void onReceive(Context context, Intent intent){
}
bạn có thể sử dụng mã này để lấy tài nguyên:
context.getResources().getString(R.string.app_name);