在Android Studio 3.0.1中找不到资源异常(android.content.res.resources $ notfoundexception)

时间:2018-01-02 20:14:02

标签: android android-studio resources

我是Android开发的新手,最近我开始使用Android Studio。我正在处理整个项目,我需要将所有文本翻译成英语和西班牙语。 (我来自iOS)

所以这是我完成这项工作的一步:

像我这样设置my values / strings.xml和es / strings.xml:

enter image description here

并尝试在我的课堂上使用它:

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

3 个答案:

答案 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()