Приложение падает после изменения ориентации без видимой причины - PullRequest
0 голосов
/ 30 июня 2011

РЕДАКТИРОВАТЬ-Модератор, не стесняйтесь удалить этот вопрос.Проблема заключалась в размере моего фонового изображения, а не в фактическом изменении ориентации.


Пожалуйста, потерпите меня - я не верю, что на этот вопрос / проблему был дан ответ в этом простомусловий.

У меня есть приложение с несколькими действиями и 2 ресурсами макета для каждого с одинаковым именем для файлов XML, которые хранятся в res / layout-land и res / layout-port.

Проблема в том, что когда я запускаю приложение на Nexus One (я использую Android 2.3), приложение запускается без проблем, но если я пытаюсь повернуть экран (изменить ориентацию), оно вылетает.Чтобы уточнить, если я запускаю Activity, удерживая ландшафтный стиль телефона, приложение показывает мне макет ресурса res / layout-land и наоборот, но если я пытаюсь изменить ориентацию во время выполнения, происходит сбой.

Я считаю, что если есть 2 XML-макета, сохраненные в папках -port и -land, Android должен уничтожить действие и воссоздать его с другим макетом с тем же именем, правильно?

Вот мой манифест, и я с удовольствием вставлю еще немного кода, если это необходимо.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="dominion.game"
      android:versionCode="1"
      android:versionName="1.0">
    <uses-sdk android:minSdkVersion="9" />
    <application android:icon="@drawable/icon" android:label="@string/app_name" debuggable="true">
        <activity android:name="dominion.game.DominionMenu"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name="dominion.game.CreateMenu"
                  android:label="@string/app_name">
        </activity>
        <activity android:name="dominion.game.AdvancedMenu"
                  android:label="@string/app_name">
        </activity>
        <activity android:name="dominion.game.ShuffleResult"
                  android:label="@string/app_name">
        </activity>
    </application>
</manifest>

Вот начало метода onCreate:

      @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.mainmenu);
    //...Lots of onClick listeners for the 4 buttons...
    }

В остальном это слушатели действий, и при нажатии на каждую кнопку запускается намерение к другому действию.Структура основного меню соответствует res / layout-land / mainmenu & res / layout-port / mainmenu, по крайней мере, в теории.

Я посмотрел на ошибки DDMS, но ничто не имеет ссылки на где-то в моем коде, где есть ошибка.

РЕДАКТИРОВАТЬ: журнал ошибок по запросу (все красные вещи, пока сила не закроется) -

07-01 00:23:41.082: ERROR/dalvikvm-heap(11182): 9864000-byte external allocation too large for this process.
07-01 00:23:41.109: ERROR/GraphicsJNI(11182): VM won't let us allocate 9864000 bytes
07-01 00:23:41.109: DEBUG/dalvikvm(11182): GC_FOR_MALLOC freed <1K, 52% free 2598K/5379K, external 19819K/19819K, paused 15ms
07-01 00:23:41.117: DEBUG/AndroidRuntime(11182): Shutting down VM
07-01 00:23:41.117: WARN/dalvikvm(11182): threadid=1: thread exiting with uncaught exception (group=0x40015560)
07-01 00:23:41.128: ERROR/AndroidRuntime(11182): FATAL EXCEPTION: main
07-01 00:23:41.128: ERROR/AndroidRuntime(11182): java.lang.RuntimeException: Unable to start activity ComponentInfo{dominion.game/dominion.game.DominionMenu}: android.view.InflateException: Binary XML file line #2: Error inflating class <unknown>
07-01 00:23:41.128: ERROR/AndroidRuntime(11182):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1622)
07-01 00:23:41.128: ERROR/AndroidRuntime(11182):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1638)
07-01 00:23:41.128: ERROR/AndroidRuntime(11182):     at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:2796)
07-01 00:23:41.128: ERROR/AndroidRuntime(11182):     at android.app.ActivityThread.access$1600(ActivityThread.java:117)
07-01 00:23:41.128: ERROR/AndroidRuntime(11182):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:932)
07-01 00:23:41.128: ERROR/AndroidRuntime(11182):     at android.os.Handler.dispatchMessage(Handler.java:99)
07-01 00:23:41.128: ERROR/AndroidRuntime(11182):     at android.os.Looper.loop(Looper.java:123)
07-01 00:23:41.128: ERROR/AndroidRuntime(11182):     at android.app.ActivityThread.main(ActivityThread.java:3647)
07-01 00:23:41.128: ERROR/AndroidRuntime(11182):     at java.lang.reflect.Method.invokeNative(Native Method)
07-01 00:23:41.128: ERROR/AndroidRuntime(11182):     at java.lang.reflect.Method.invoke(Method.java:507)
07-01 00:23:41.128: ERROR/AndroidRuntime(11182):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
07-01 00:23:41.128: ERROR/AndroidRuntime(11182):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
07-01 00:23:41.128: ERROR/AndroidRuntime(11182):     at dalvik.system.NativeStart.main(Native Method)
07-01 00:23:41.128: ERROR/AndroidRuntime(11182): Caused by: android.view.InflateException: Binary XML file line #2: Error inflating class <unknown>
07-01 00:23:41.128: ERROR/AndroidRuntime(11182):     at android.view.LayoutInflater.createView(LayoutInflater.java:518)
07-01 00:23:41.128: ERROR/AndroidRuntime(11182):     at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56)
07-01 00:23:41.128: ERROR/AndroidRuntime(11182):     at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:568)
07-01 00:23:41.128: ERROR/AndroidRuntime(11182):     at android.view.LayoutInflater.inflate(LayoutInflater.java:386)
07-01 00:23:41.128: ERROR/AndroidRuntime(11182):     at android.view.LayoutInflater.inflate(LayoutInflater.java:320)
07-01 00:23:41.128: ERROR/AndroidRuntime(11182):     at android.view.LayoutInflater.inflate(LayoutInflater.java:276)
07-01 00:23:41.128: ERROR/AndroidRuntime(11182):     at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:207)
07-01 00:23:41.128: ERROR/AndroidRuntime(11182):     at android.app.Activity.setContentView(Activity.java:1657)
07-01 00:23:41.128: ERROR/AndroidRuntime(11182):     at dominion.game.DominionMenu.onCreate(DominionMenu.java:28)
07-01 00:23:41.128: ERROR/AndroidRuntime(11182):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
07-01 00:23:41.128: ERROR/AndroidRuntime(11182):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1586)
07-01 00:23:41.128: ERROR/AndroidRuntime(11182):     ... 12 more
07-01 00:23:41.128: ERROR/AndroidRuntime(11182): Caused by: java.lang.reflect.InvocationTargetException
07-01 00:23:41.128: ERROR/AndroidRuntime(11182):     at java.lang.reflect.Constructor.constructNative(Native Method)
07-01 00:23:41.128: ERROR/AndroidRuntime(11182):     at java.lang.reflect.Constructor.newInstance(Constructor.java:415)
07-01 00:23:41.128: ERROR/AndroidRuntime(11182):     at android.view.LayoutInflater.createView(LayoutInflater.java:505)
07-01 00:23:41.128: ERROR/AndroidRuntime(11182):     ... 22 more
07-01 00:23:41.128: ERROR/AndroidRuntime(11182): Caused by: java.lang.OutOfMemoryError: bitmap size exceeds VM budget
07-01 00:23:41.128: ERROR/AndroidRuntime(11182):     at android.graphics.Bitmap.nativeCreate(Native Method)
07-01 00:23:41.128: ERROR/AndroidRuntime(11182):     at android.graphics.Bitmap.createBitmap(Bitmap.java:477)
07-01 00:23:41.128: ERROR/AndroidRuntime(11182):     at android.graphics.Bitmap.createBitmap(Bitmap.java:444)
07-01 00:23:41.128: ERROR/AndroidRuntime(11182):     at android.graphics.Bitmap.createScaledBitmap(Bitmap.java:349)
07-01 00:23:41.128: ERROR/AndroidRuntime(11182):     at android.graphics.BitmapFactory.finishDecode(BitmapFactory.java:488)
07-01 00:23:41.128: ERROR/AndroidRuntime(11182):     at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:463)
07-01 00:23:41.128: ERROR/AndroidRuntime(11182):     at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:326)
07-01 00:23:41.128: ERROR/AndroidRuntime(11182):     at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:697)
07-01 00:23:41.128: ERROR/AndroidRuntime(11182):     at android.content.res.Resources.loadDrawable(Resources.java:1709)
07-01 00:23:41.128: ERROR/AndroidRuntime(11182):     at android.content.res.TypedArray.getDrawable(TypedArray.java:601)
07-01 00:23:41.128: ERROR/AndroidRuntime(11182):     at android.view.View.<init>(View.java:1951)
07-01 00:23:41.128: ERROR/AndroidRuntime(11182):     at android.view.View.<init>(View.java:1899)
07-01 00:23:41.128: ERROR/AndroidRuntime(11182):     at android.view.ViewGroup.<init>(ViewGroup.java:286)
07-01 00:23:41.128: ERROR/AndroidRuntime(11182):     at android.widget.LinearLayout.<init>(LinearLayout.java:120)
07-01 00:23:41.128: ERROR/AndroidRuntime(11182):     ... 25 more
07-01 00:23:41.144: WARN/ActivityManager(113):   Force finishing activity dominion.game/.DominionMenu

По сути, мой вопрос: Какие шаги необходимо предпринять для того, чтобыавтоматическая смена ориентации экрана для работы?Я думал, что сделал их все ...

Любая помощь или предложения очень ценятся, заранее спасибо!


@ Рахул Шарма - Это остановило сбой, но вместо того, чтобы переключиться надругой макет, он просто использует тот же макет в другой ориентации.

@ Asynkronos Я на 2.3, а не на 2.1, но это интересная ошибка, которую нужно учитывать, конечно.Я не думаю, что я использую эти объекты, хотя.

ОК, вы, ребята, будете раздражены, но проблема была в том, что мое фоновое изображение было огромным - примерно 30 х 30 дюймов.Поэтому я уменьшил его до 7х7 дюймов, и это не проблема ...

Ответы [ 4 ]

4 голосов
/ 30 июня 2011

в вашем AndroidManifest.xml положить

android: configChanges = "direction | keyboardHidden" во всех ваших тегах активности

, например

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="dominion.game"
    android:versionCode="1"
    android:versionName="1.0">
    <uses-sdk android:minSdkVersion="9" />
    <application android:icon="@drawable/icon" android:label="@string/app_name" debuggable="true">
        <activity android:name="dominion.game.DominionMenu" android:label="@string/app_name" android:configChanges="orientation|keyboardHidden">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name="dominion.game.CreateMenu"
              android:label="@string/app_name" android:configChanges="orientation|keyboardHidden">
        </activity>
        <activity android:name="dominion.game.AdvancedMenu"
              android:label="@string/app_name" android:configChanges="orientation|keyboardHidden">
        </activity>
        <activity android:name="dominion.game.ShuffleResult"
              android:label="@string/app_name" android:configChanges="orientation|keyboardHidden">
        </activity>
    </application>
</manifest>

Надеюсь, это поможет: -)

0 голосов
/ 24 апреля 2014

В манифесте вставьте android: configChanges = "клавиатура скрытая | ориентация | screenSize" в тег приложения, чтобы избежать возникновения сбоя из-за изменения ориентации. Это помогло моему заявлению.

0 голосов
/ 30 июня 2011

У меня были похожие проблемы с изменением ориентации экрана на моем Nexus One. Возможно, вы столкнулись с этой документированной ошибкой?

http://code.google.com/p/android/issues/detail?id=6191

0 голосов
/ 30 июня 2011

Происходило и в моем приложении, проверьте, не создаются ли действия при изменении ориентации или что-то в этом роде. Это точно связано с жизненным циклом активности

...