我是Android开发的新手,最近我开始使用Android Studio。我正在处理整个项目,我需要将所有文本翻译成英语和西班牙语。 (我来自iOS)
所以这是我完成这项工作的一步:
像我这样设置my values / strings.xml和es / strings.xml:
并尝试在我的课堂上使用它:
import android.content.res.Resources;
public class MainMenuItem {
int image;
String title;
Class activity;
public MainMenuItem(int image, String title, Class activity) {
this.image = image;
this.title = title;
this.activity = activity;
}
public int getImage() {
return image;
}
public String getTitle() {
return title;
}
public Class getActivity() {
return activity;
}
public static List<MainMenuItem> getItems() {
List<MainMenuItem> items = new ArrayList<>();
items.add(new MainMenuItem(R.drawable.icon_qr_code, Resources.getSystem().getString(R.string.mainMenuItem_validar_voucher), QrcodeActivity.class)); //this line is how i try to use.
items.add(new MainMenuItem(R.drawable.icon_get_money,"Solicitar pago", SolicitarPagoActivity.class));
items.add(new MainMenuItem(R.drawable.icon_promotions, "Promociones", ListaPromosActivity.class));
return items;
}
}
但是,当我运行项目时会出现此错误:
android.content.res.Resources$NotFoundException: String resource ID #0x7f0800ad
答案 0 :(得分:2)
我知道这有点晚了,但我正在努力解决类似的问题。在我的例子中,问题源自项目视图中res文件夹中的不同drawable目录。我在“drawable-hdpi”中放置了一些资源,这些资源在一般的“drawable”目录中不可用。因此,每次我尝试在低分辨率设备(如某些平板电脑)上运行应用程序时,我都会收到资源未找到的错误。始终确保所有资源都可用于默认目录。希望有所帮助。
答案 1 :(得分:-1)
我建议你只需将字符串Validar Voucher
作为items.add()
中的第二个参数,但是如果你坚持想要使用资源,那么你需要只是使用getResources().getText(R.string.mainMenuItem_validar_voucher)
。
引用资源的语法是[<package_name>.]R.<resource_type>.<resource_name>
如果有帮助,请告诉我
答案 2 :(得分:-1)
R.string.mainMenuItem_validar_voucher
是您应用的资源而不是系统资源的资源标识符。您将不得不使用应用提供的Context来解决它。
由于您应该通过XML资源提供所有UI字符串(为了便于翻译),我建议您修改MainMenuItem
类:
public class MainMenuItem {
@DrawableRes private final int imageId;
@StringRes private final int titleId;
@NonNull private final Class<Activity> activity;
public MainMenuItem(@DrawableRes int imageId, @StringRes int titleId, @NonNull Class<Activity> activity) {
this.imageId = imageId;
this.titleId = titleId;
this.activity = activity;
}
@StringRes
public int getTitleId() {
return titleId;
}
// Helper method to directly resolve the title.
public String getTitle(Context context) {
return context.getString(title);
}
@DrawableRes
public int getImageId() {
return imageId;
}
// Helper method to directly resolve the image.
public Drawable getImage(Context context) {
return ContextCompat.getDrawable(context, image);
}
@NonNull
public Class<Activity> getActivity() {
return activity;
}
}
这里是更新的项目清单定义:
public class MainMenuItem {
private static List<MainMenuItem> ITEMS;
// It's more efficient to precompute the item list once
// than to create it every time you call `getItems()`.
// Notice how only resource IDs to both image and title are stored.
static {
List<MainMenuItem> items = new ArrayList<>();
items.add(new MainMenuItem(R.drawable.icon_qr_code, R.string.mainMenuItem_validar_voucher, QrcodeActivity.class));
items.add(new MainMenuItem(R.drawable.icon_get_money, R.string.mainMenuItem_solicitar_pago, SolicitarPagoActivity.class));
items.add(new MainMenuItem(R.drawable.icon_promotions, R.string.mainMenuItem_promociones, ListaPromosActivity.class));
ITEMS = Collections.unmodifiableList(items);
}
public static List<MainMenuItem> getItems() {
return ITEMS;
}
}
现在,只要您需要图片或标题,就可以分别致电item.getImage(context)
或item.getTitle(context)
context
this
中Activity
view.getContext()