2015-01-19 2 views
4

У меня есть SurfaceView. Я просто рисую его вручную из другой темы.SurfaceView onMeasure() не установил измеренное измерение, вызвав setMeasuredDimension()

Он работает красиво. Но через 10-20 минут работы в среднем я получаю это исключение:

01-14 08:51:25.000 3740-3740/com.myPackage E/AndroidRuntime﹕ FATAL EXCEPTION: main 
    java.lang.IllegalStateException: onMeasure() did not set the measured dimension by calling setMeasuredDimension() 
      at android.view.View.measure(View.java:15200) 
      at android.widget.RelativeLayout.measureChild(RelativeLayout.java:602) 
      at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:415) 
      at android.view.View.measure(View.java:15195) 
      at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4823) 
      at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 
      at android.view.View.measure(View.java:15195) 
      at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4823) 
      at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1390) 
      at android.widget.LinearLayout.measureVertical(LinearLayout.java:681) 
      at android.widget.LinearLayout.onMeasure(LinearLayout.java:574) 
      at android.view.View.measure(View.java:15195) 
      at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4823) 
      at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 
      at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2340) 
      at android.view.View.measure(View.java:15195) 
      at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:1850) 
      at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1102) 
      at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1275) 
      at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1000) 
      at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4216) 
      at android.view.Choreographer$CallbackRecord.run(Choreographer.java:725) 
      at android.view.Choreographer.doCallbacks(Choreographer.java:555) 
      at android.view.Choreographer.doFrame(Choreographer.java:525) 
      at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:711) 
      at android.os.Handler.handleCallback(Handler.java:615) 
      at android.os.Handler.dispatchMessage(Handler.java:92) 
      at android.os.Looper.loop(Looper.java:137) 
      at android.app.ActivityThread.main(ActivityThread.java:4813) 
      at java.lang.reflect.Method.invokeNative(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:511) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:792) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:559) 
      at dalvik.system.NativeStart.main(Native Method) 

Android говорят справки о:
Измерить вид и его содержание, чтобы определить измеряемую ширину и измеренную высоту. Этот метод вызывается мерой (int, int) и должен быть переопределен подклассами для обеспечения точного и эффективного измерения их содержимого.

Как я думаю, что оригинальный реализация от Google заключается в следующем:

@Override 
    protected void More ...onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
     int width = getDefaultSize(mRequestedWidth, widthMeasureSpec); 
     int height = getDefaultSize(mRequestedHeight, heightMeasureSpec); 
     setMeasuredDimension(width, height); 
    } 

Я не знаю, что я еще я должен осуществить здесь.

Я думаю, что размер поверхности не меняется.

Примечание:
Мой SurfaceView содержится в RelativeLayout.
Исключение вызывается дочерним элементом, но это вид (строка 3 в исключении)

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

EDIT:
В OnCreate Activity, я установить размер моего зрения (что вытянутая форма SurfaceView) из кода

Answear на комментарий:
Это, как я установить некоторые общественные поля для Требуемый размер:

Parameters.initialize(getResources().getDisplayMetrics().widthPixels, 
       getResources().getDisplayMetrics().heightPixels); 

Parameters.initialize:

public static void initialize(int screenWidth, int screenHeight){ 
    FIELD_WIDTH = screenWidth; 
    FIELD_HEIGHT = (int)(0.92f * screenHeight); 
} 

MyView написан в xml.
Тогда я поставил что-то на нем:

public class MyViewManager { 
    protected MyView mMyView; 

    public FieldPainterComp(MainActivity activity) { 
     super(activity); 
     initialize(); 
    } 

    private void initialize(){ 
     mMyView= (MyView) activity.findViewById(R.id.vMyView); 
     mMyView.getLayoutParams().height = Parameters.FIELD_HEIGHT; 
     mMyView.getLayoutParams().width = Parameters.FIELD_WIDTH; 
    } 
} 

Весь этот процесс происходит из них в самом начале.

android:screenOrientation="landscape" 

Экран никогда не потемнеет. Игра запущена, и просто исключение идет.
Должен ли я назвать меру где-нибудь?
Я не понимаю, почему это happaning после долгого времени

Некоторых других исключений, которые должны быть в связном с этим:

01-19 11:53:39.812 29666-31881/com.mypackage V/GAV4﹕ Thread[disconnect check,5,main]: Disconnecting due to inactivity 
01-19 11:53:39.812 29666-31881/com.mypackage V/GAV4﹕ Thread[disconnect check,5,main]: Disconnected from service 
01-19 11:57:17.732 29666-29666/com.mypackage D/AndroidRuntime﹕ Shutting down VM 
01-19 11:57:17.732 29666-29666/com.mypackage W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0x420face0) 
01-19 11:57:17.812 29666-29666/com.mypackage V/GAV4﹕ Thread[main,5,main]: Tracking Exception: IllegalStateException (@View:measure:16533) {main} 
01-19 11:57:17.832 29666-29666/com.mypackage V/GAV4﹕ Thread[main,5,main]: Dispatch call queued. Dispatch will run once initialization is complete. 
01-19 12:19:27.982 29666-29670/com.mypackage I/dalvikvm﹕ threadid=3: reacting to signal 3 
01-19 12:19:28.262 29666-29670/com.mypackage I/dalvikvm﹕ Wrote stack traces to '/data/anr/traces.txt' 
01-19 12:19:32.452 29666-29666/com.mypackage A/libc﹕ Fatal signal 6 (SIGABRT) at 0x0000025a (code=0), thread 29666 (ames.adaptation) 

GAV -Естью вещи Google Analytics.

Я начал другой вопрос о ANR: ANR with 3 threads - using locks

+0

Это настраиваемое представление, которое может вызвать эту ошибку? –

+0

Да, я прокрутился из SurfaceView. Я на 99% уверен, что SurfaceView создает проблему, потому что ошибка начала появляться сразу после добавления SurfaceView (также я добавил еще несколько примечаний к моему описанию) – Tomi

+0

Вы переопределили 'onMeasure()'? – Biu

ответ

3
setMeasuredDimension() 

должен быть вызван внутри вашего onMeasure() метод. У меня была аналогичная проблема, когда логика не достигла setMeasuredDimension(). Я решил, что он вызывает вызов setMeasuredDimension() независимо от того, что ему предшествовали утверждения if/else.

0

Вы можете использовать фрагмент и не написать эту строку в первом

super.onCreate(savedInstanceState);