Android: раздувать исключение после попытки добавить другой язык в мое приложение

Мое приложение для Android работало на английском языке, и я также должен предоставить пользователям арабскую версию. Я сделал следующее,

  1. Добавил папку layout-ar и поместил туда мои файлы макетов.
  2. Добавил папку drawable-ar и разместил там мои изображения.
  3. Добавил папку values-ar и перевел мои строковые ресурсы в strings.xml
  4. Изменены настройки языка в моем эмуляторе на арабский для тестирования

Хотя английская версия моего приложения работала нормально, моя арабская версия теперь вылетает со следующей трассировкой журнала

06-20 10:08:13.153: E/AndroidRuntime(623): FATAL EXCEPTION: main
06-20 10:08:13.153: E/AndroidRuntime(623): java.lang.RuntimeException: Unable to start activity ComponentInfo{org.digitalhealthagency.elaj.gui/org.digitalhealthagency.elaj.gui.SplashScreen}: android.view.InflateException: Binary XML file line #7: Error inflating class android.widget.ImageView
06-20 10:08:13.153: E/AndroidRuntime(623):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1956)
06-20 10:08:13.153: E/AndroidRuntime(623):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
06-20 10:08:13.153: E/AndroidRuntime(623):  at android.app.ActivityThread.access$600(ActivityThread.java:123)
06-20 10:08:13.153: E/AndroidRuntime(623):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
06-20 10:08:13.153: E/AndroidRuntime(623):  at android.os.Handler.dispatchMessage(Handler.java:99)
06-20 10:08:13.153: E/AndroidRuntime(623):  at android.os.Looper.loop(Looper.java:137)
06-20 10:08:13.153: E/AndroidRuntime(623):  at android.app.ActivityThread.main(ActivityThread.java:4424)
06-20 10:08:13.153: E/AndroidRuntime(623):  at java.lang.reflect.Method.invokeNative(Native Method)
06-20 10:08:13.153: E/AndroidRuntime(623):  at java.lang.reflect.Method.invoke(Method.java:511)
06-20 10:08:13.153: E/AndroidRuntime(623):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
06-20 10:08:13.153: E/AndroidRuntime(623):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
06-20 10:08:13.153: E/AndroidRuntime(623):  at dalvik.system.NativeStart.main(Native Method)
06-20 10:08:13.153: E/AndroidRuntime(623): Caused by: android.view.InflateException: Binary XML file line #7: Error inflating class android.widget.ImageView
06-20 10:08:13.153: E/AndroidRuntime(623):  at android.view.LayoutInflater.createView(LayoutInflater.java:606)
06-20 10:08:13.153: E/AndroidRuntime(623):  at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56)
06-20 10:08:13.153: E/AndroidRuntime(623):  at android.view.LayoutInflater.onCreateView(LayoutInflater.java:653)
06-20 10:08:13.153: E/AndroidRuntime(623):  at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:678)
06-20 10:08:13.153: E/AndroidRuntime(623):  at android.view.LayoutInflater.rInflate(LayoutInflater.java:739)
06-20 10:08:13.153: E/AndroidRuntime(623):  at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
06-20 10:08:13.153: E/AndroidRuntime(623):  at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
06-20 10:08:13.153: E/AndroidRuntime(623):  at android.view.LayoutInflater.inflate(LayoutInflater.java:352)
06-20 10:08:13.153: E/AndroidRuntime(623):  at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:251)
06-20 10:08:13.153: E/AndroidRuntime(623):  at android.app.Activity.setContentView(Activity.java:1835)
06-20 10:08:13.153: E/AndroidRuntime(623):  at org.digitalhealthagency.elaj.gui.SplashScreen.onCreate(SplashScreen.java:16)
06-20 10:08:13.153: E/AndroidRuntime(623):  at android.app.Activity.performCreate(Activity.java:4465)
06-20 10:08:13.153: E/AndroidRuntime(623):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
06-20 10:08:13.153: E/AndroidRuntime(623):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)
06-20 10:08:13.153: E/AndroidRuntime(623):  ... 11 more
06-20 10:08:13.153: E/AndroidRuntime(623): Caused by: java.lang.reflect.InvocationTargetException
06-20 10:08:13.153: E/AndroidRuntime(623):  at java.lang.reflect.Constructor.constructNative(Native Method)
06-20 10:08:13.153: E/AndroidRuntime(623):  at java.lang.reflect.Constructor.newInstance(Constructor.java:417)
06-20 10:08:13.153: E/AndroidRuntime(623):  at android.view.LayoutInflater.createView(LayoutInflater.java:586)
06-20 10:08:13.153: E/AndroidRuntime(623):  ... 24 more
06-20 10:08:13.153: E/AndroidRuntime(623): Caused by: java.lang.OutOfMemoryError
06-20 10:08:13.153: E/AndroidRuntime(623):  at android.graphics.Bitmap.nativeCreate(Native Method)
06-20 10:08:13.153: E/AndroidRuntime(623):  at android.graphics.Bitmap.createBitmap(Bitmap.java:605)
06-20 10:08:13.153: E/AndroidRuntime(623):  at android.graphics.Bitmap.createBitmap(Bitmap.java:551)
06-20 10:08:13.153: E/AndroidRuntime(623):  at android.graphics.Bitmap.createScaledBitmap(Bitmap.java:437)
06-20 10:08:13.153: E/AndroidRuntime(623):  at android.graphics.BitmapFactory.finishDecode(BitmapFactory.java:524)
06-20 10:08:13.153: E/AndroidRuntime(623):  at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:499)
06-20 10:08:13.153: E/AndroidRuntime(623):  at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:351)
06-20 10:08:13.153: E/AndroidRuntime(623):  at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:773)
06-20 10:08:13.153: E/AndroidRuntime(623):  at android.content.res.Resources.loadDrawable(Resources.java:1935)
06-20 10:08:13.153: E/AndroidRuntime(623):  at android.content.res.TypedArray.getDrawable(TypedArray.java:601)
06-20 10:08:13.153: E/AndroidRuntime(623):  at android.widget.ImageView.<init>(ImageView.java:119)
06-20 10:08:13.153: E/AndroidRuntime(623):  at android.widget.ImageView.<init>(ImageView.java:109)
06-20 10:08:13.153: E/AndroidRuntime(623):  ... 27 more

Журнал ошибок ссылается на строку 16 в моем Java-файле SplashScreen, который устанавливает представление содержимого setContentView(R.layout.splash_screen);

И мой файл splash_screen.xml выглядит следующим образом

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <ImageView
        android:id="@+id/splash_screen"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="center"
        android:src="@drawable/splash_screen" />

</LinearLayout>

Этот вопрос очень похож на мой Android: как отследить происхождение InflateException? но исправление стиля не решает проблему.

Заранее спасибо!

РЕДАКТИРОВАТЬ

После уменьшения размера изображений, предложенного Алексом Г., изображение загружается нормально, но теперь я получаю похожую ошибку в другом месте.

06-20 14:27:22.157: E/AndroidRuntime(623): FATAL EXCEPTION: main
06-20 14:27:22.157: E/AndroidRuntime(623): java.lang.RuntimeException: Unable to start activity ComponentInfo{org.digitalhealthagency.elaj.gui/org.digitalhealthagency.elaj.gui.AppointmentReservationActivity}: android.view.InflateException: Binary XML file line #99: Error inflating class <unknown>
06-20 14:27:22.157: E/AndroidRuntime(623):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1956)
06-20 14:27:22.157: E/AndroidRuntime(623):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
06-20 14:27:22.157: E/AndroidRuntime(623):  at android.app.ActivityThread.access$600(ActivityThread.java:123)
06-20 14:27:22.157: E/AndroidRuntime(623):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
06-20 14:27:22.157: E/AndroidRuntime(623):  at android.os.Handler.dispatchMessage(Handler.java:99)
06-20 14:27:22.157: E/AndroidRuntime(623):  at android.os.Looper.loop(Looper.java:137)
06-20 14:27:22.157: E/AndroidRuntime(623):  at android.app.ActivityThread.main(ActivityThread.java:4424)
06-20 14:27:22.157: E/AndroidRuntime(623):  at java.lang.reflect.Method.invokeNative(Native Method)
06-20 14:27:22.157: E/AndroidRuntime(623):  at java.lang.reflect.Method.invoke(Method.java:511)
06-20 14:27:22.157: E/AndroidRuntime(623):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
06-20 14:27:22.157: E/AndroidRuntime(623):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
06-20 14:27:22.157: E/AndroidRuntime(623):  at dalvik.system.NativeStart.main(Native Method)
06-20 14:27:22.157: E/AndroidRuntime(623): Caused by: android.view.InflateException: Binary XML file line #99: Error inflating class <unknown>
06-20 14:27:22.157: E/AndroidRuntime(623):  at android.view.LayoutInflater.createView(LayoutInflater.java:606)
06-20 14:27:22.157: E/AndroidRuntime(623):  at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56)
06-20 14:27:22.157: E/AndroidRuntime(623):  at android.view.LayoutInflater.onCreateView(LayoutInflater.java:653)
06-20 14:27:22.157: E/AndroidRuntime(623):  at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:678)
06-20 14:27:22.157: E/AndroidRuntime(623):  at android.view.LayoutInflater.rInflate(LayoutInflater.java:739)
06-20 14:27:22.157: E/AndroidRuntime(623):  at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
06-20 14:27:22.157: E/AndroidRuntime(623):  at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
06-20 14:27:22.157: E/AndroidRuntime(623):  at android.view.LayoutInflater.inflate(LayoutInflater.java:352)
06-20 14:27:22.157: E/AndroidRuntime(623):  at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:251)
06-20 14:27:22.157: E/AndroidRuntime(623):  at android.app.Activity.setContentView(Activity.java:1835)
06-20 14:27:22.157: E/AndroidRuntime(623):  at org.digitalhealthagency.elaj.gui.AppointmentReservationActivity.onCreate(AppointmentReservationActivity.java:88)
06-20 14:27:22.157: E/AndroidRuntime(623):  at android.app.Activity.performCreate(Activity.java:4465)
06-20 14:27:22.157: E/AndroidRuntime(623):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
06-20 14:27:22.157: E/AndroidRuntime(623):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)
06-20 14:27:22.157: E/AndroidRuntime(623):  ... 11 more
06-20 14:27:22.157: E/AndroidRuntime(623): Caused by: java.lang.reflect.InvocationTargetException
06-20 14:27:22.157: E/AndroidRuntime(623):  at java.lang.reflect.Constructor.constructNative(Native Method)
06-20 14:27:22.157: E/AndroidRuntime(623):  at java.lang.reflect.Constructor.newInstance(Constructor.java:417)
06-20 14:27:22.157: E/AndroidRuntime(623):  at android.view.LayoutInflater.createView(LayoutInflater.java:586)
06-20 14:27:22.157: E/AndroidRuntime(623):  ... 24 more
06-20 14:27:22.157: E/AndroidRuntime(623): Caused by: java.lang.OutOfMemoryError
06-20 14:27:22.157: E/AndroidRuntime(623):  at android.graphics.Bitmap.nativeCreate(Native Method)
06-20 14:27:22.157: E/AndroidRuntime(623):  at android.graphics.Bitmap.createBitmap(Bitmap.java:605)
06-20 14:27:22.157: E/AndroidRuntime(623):  at android.graphics.Bitmap.createBitmap(Bitmap.java:551)
06-20 14:27:22.157: E/AndroidRuntime(623):  at android.graphics.Bitmap.createScaledBitmap(Bitmap.java:437)
06-20 14:27:22.157: E/AndroidRuntime(623):  at android.graphics.BitmapFactory.finishDecode(BitmapFactory.java:524)
06-20 14:27:22.157: E/AndroidRuntime(623):  at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:499)
06-20 14:27:22.157: E/AndroidRuntime(623):  at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:351)
06-20 14:27:22.157: E/AndroidRuntime(623):  at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:773)
06-20 14:27:22.157: E/AndroidRuntime(623):  at android.content.res.Resources.loadDrawable(Resources.java:1935)
06-20 14:27:22.157: E/AndroidRuntime(623):  at android.content.res.Resources.getDrawable(Resources.java:664)
06-20 14:27:22.157: E/AndroidRuntime(623):  at android.graphics.drawable.StateListDrawable.inflate(StateListDrawable.java:173)
06-20 14:27:22.157: E/AndroidRuntime(623):  at android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:867)
06-20 14:27:22.157: E/AndroidRuntime(623):  at android.graphics.drawable.Drawable.createFromXml(Drawable.java:804)
06-20 14:27:22.157: E/AndroidRuntime(623):  at android.content.res.Resources.loadDrawable(Resources.java:1920)
06-20 14:27:22.157: E/AndroidRuntime(623):  at android.content.res.TypedArray.getDrawable(TypedArray.java:601)
06-20 14:27:22.157: E/AndroidRuntime(623):  at android.view.View.<init>(View.java:2785)
06-20 14:27:22.157: E/AndroidRuntime(623):  at android.widget.TextView.<init>(TextView.java:449)
06-20 14:27:22.157: E/AndroidRuntime(623):  at android.widget.Button.<init>(Button.java:108)
06-20 14:27:22.157: E/AndroidRuntime(623):  at android.widget.Button.<init>(Button.java:104)
06-20 14:27:22.157: E/AndroidRuntime(623):  ... 27 more

Строка 88, к которой относится трассировка журнала,

setContentView(R.layout.appointment_reservation);

И строка #99 в assign_reservation.xml - это

    <Button android:id="@+id/reserve_button"
        android:text="@string/reserve_button"
        android:layout_width="120dp"
        android:layout_height="40dp"
        android:layout_marginTop="10dp"
        android:layout_marginLeft="20dp"
        android:paddingRight="15dp"
        android:layout_gravity="left"
        style="@style/buttonStyle"
        android:background="@drawable/button_selector" />

Я даю кнопке XML-файл button_selector, который находится в моей папке для рисования. Селектор переключается между двумя изображениями (общий размер 6 КБ).

Заранее спасибо!

1 ответ

Решение

Если вы загляните в конец журнала, то увидите, что основной причиной проблемы является:

Caused by: java.lang.OutOfMemoryError
 at android.graphics.Bitmap.nativeCreate(Native Method)
 at android.graphics.Bitmap.createBitmap(Bitmap.java:605)
 at android.graphics.Bitmap.createBitmap(Bitmap.java:551)
 at android.graphics.Bitmap.createScaledBitmap(Bitmap.java:437)
 at android.graphics.BitmapFactory.finishDecode(BitmapFactory.java:524)
 at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:499)
 at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:351)
 at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:773)
 at android.content.res.Resources.loadDrawable(Resources.java:1935)
 at android.content.res.TypedArray.getDrawable(TypedArray.java:601)
 at android.widget.ImageView.<init>(ImageView.java:119)
 at android.widget.ImageView.<init>(ImageView.java:109)
 ... 27 more

Поскольку это происходит на вашем заставке, я предполагаю, что загружаемое изображение слишком велико. Сравните размеры изображений в английской и арабской версиях, чтобы увидеть, не намного ли арабский файл больше английского. Попробуйте оптимизировать изображение, возможно, уменьшите его, чтобы уменьшить размер...

РЕДАКТИРОВАТЬ: На второй ошибки:

Опять же, это ошибка OutOfMemory. Если у вас есть такие ошибки, всегда смотрите на самый нижний Caused by часть. В этом случае у вас есть:

Caused by: java.lang.OutOfMemoryError
 at android.graphics.Bitmap.nativeCreate(Native Method)
 at android.graphics.Bitmap.createBitmap(Bitmap.java:605)
 at android.graphics.Bitmap.createBitmap(Bitmap.java:551)
 at android.graphics.Bitmap.createScaledBitmap(Bitmap.java:437)
 at android.graphics.BitmapFactory.finishDecode(BitmapFactory.java:524)
 at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:499)
 at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:351)
 at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:773)
 at android.content.res.Resources.loadDrawable(Resources.java:1935)
 at android.content.res.TypedArray.getDrawable(TypedArray.java:601)
 at android.widget.ImageView.<init>(ImageView.java:119)
 at android.widget.ImageView.<init>(ImageView.java:109)
 ... 27 more

Если вы уменьшили размер своего изображения, как вы указали, то это означает, что где-то есть другое большое изображение.

Обратите внимание, что важен не размер файла JPG или PNG, а объем памяти, необходимый для внутреннего декодирования этого файла изображения. Один из способов приблизительной оценки объема памяти, необходимого для внутреннего декодирования файла изображения, состоит в том, чтобы открыть этот файл в редакторе изображений и сохранить его как несжатый файл TIFF. Размер файла TIFF приблизительно равен тому, сколько памяти занимает декодированное изображение в работающем приложении Android. В качестве теста я просто сохранил 750KB JPG в формате TIFF - и оказалось, что оно составляет 5,8 МБ.

Другие вопросы по тегам