2015-08-27 8 views
-2

Я пишу Android-приложение для маленьких детей, чтобы изучить математику, и я работаю над тем, где пользователи могут получать призы, когда он/она правильно отвечает на все вопросы. И я динамически добавляю некоторые виды в правую сторону экрана, чтобы сообщить пользователю, что у него есть приз. (У каждого варианта вопроса есть соответствующий приз!) Левая сторона используется для отображения оценки. Однако приложение разбилось. Я попытался взглянуть на стек вызовов, чтобы узнать, где я ошибся. Но ни один из моих методов не находится в стеке вызовов!Почему Android рушится сам по себе? Что я сделал не так?

java.lang.ClassCastException: android.widget.LinearLayout$LayoutParams cannot be cast to android.widget.FrameLayout$LayoutParams 
     at android.widget.FrameLayout.onMeasure(FrameLayout.java:315) 
     at android.widget.ScrollView.onMeasure(ScrollView.java:321) 
     at android.view.View.measure(View.java:16030) 
     at android.widget.LinearLayout.measureHorizontal(LinearLayout.java:1034) 
     at android.widget.LinearLayout.onMeasure(LinearLayout.java:590) 
     at android.view.View.measure(View.java:16030) 
     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5012) 
     at android.widget.FrameLayout.onMeasure(FrameLayout.java:314) 
     at android.view.View.measure(View.java:16030) 
     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5012) 
     at com.android.internal.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:302) 
     at android.view.View.measure(View.java:16030) 
     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5012) 
     at android.widget.FrameLayout.onMeasure(FrameLayout.java:314) 
     at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2196) 
     at android.view.View.measure(View.java:16030) 
     at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:1915) 
     at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1109) 
     at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1290) 
     at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1009) 
     at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5508) 
     at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749) 
     at android.view.Choreographer.doCallbacks(Choreographer.java:562) 
     at android.view.Choreographer.doFrame(Choreographer.java:532) 
     at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735) 
     at android.os.Handler.handleCallback(Handler.java:730) 
     at android.os.Handler.dispatchMessage(Handler.java:92) 
     at android.os.Looper.loop(Looper.java:213) 
     at android.app.ActivityThread.main(ActivityThread.java:5225) 
     at java.lang.reflect.Method.invokeNative(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:525) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:741) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557) 
     at dalvik.system.NativeStart.main(Native Method) 

См.? Имя моего пакета называется com.smartkidslovemaths, но это не один стек вызовов! Как я должен знать, где я ошибся?

В любом случае, я думаю, что некоторые из моих кодов актуальны. Это расположение в правой части экрана:

<ScrollView 
    android:layout_width="0dp" 
    android:layout_height="match_parent" 
    android:layout_weight="1"> 
    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:id="@+id/right_side" 
     android:orientation="vertical"> 

    </LinearLayout> 
</ScrollView> 

А вот как я могу добавить точку, обратите внимание, что этот метод вызывается в методе onCreate.

private void displayPrize() { 
    ((LinearLayout)findViewById (R.id.right_side)).setLayoutParams (new LinearLayout.LayoutParams (FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT)); 

    TextView text = new TextView (this); 
    final LinearLayout.LayoutParams textParams = 
      new LinearLayout.LayoutParams (
        ViewGroup.LayoutParams.WRAP_CONTENT, 0, 1F 
      ); 

    final LinearLayout.LayoutParams imageParams = 
      new LinearLayout.LayoutParams (
        ViewGroup.LayoutParams.MATCH_PARENT, 0, 8F 
      ); 
    text.setLayoutParams (textParams); 
    Resources res = getResources(); 
    QuestionOptions options = QuestionsActivity.Options.getOptions(); 

    switch (options.getDigitCount()) { 
     case 1: 
     default: 
      text.setText (res.getText (R.string.earn_star_text)); 
      break; 
     case 2: 
      text.setText (res.getText (R.string.earn_badge_text)); 
      break; 
     case 3: 
      text.setText (res.getText (R.string.earn_trophy_text)); 
      break; 
    } 

    text.setTextSize (res.getDimension (R.dimen.answer_text_size)/4); 

    ((LinearLayout)findViewById (R.id.right_side)).addView (text); 

    ImageView image = new ImageView (this); 
    image.setLayoutParams (imageParams); 
    int resID = QuestionOptionMaps.getOptionsDrawableMap().get (options); 
    image.setImageResource (resID); 
    ((LinearLayout)findViewById (R.id.right_side)).addView (image); 
} 

Я действительно не знаю, где я ошибся. Или, может быть, я прав, и это всего лишь ошибка Android?

+0

Это ClassCastException. Где-то он пытается отличить тип A от (несвязанного) типа B. – Stultuske

+0

Но это произошло при внутренней работе android. Как я должен это исправить? @Stultuske – Sweeper

+2

Каково ваше обоснование, чтобы направить эти вызовы 'findViewById' на' LinearLayout'? Android говорит вам, что это невозможно сделать, поскольку классы не связаны во время выполнения. – Makoto

ответ

0

ScrollView расширяет FrameLayout.

Когда вы устанавливаете layoutparams вида, вы устанавливаете параметры для макета, в котором они находятся. Поэтому в этой части:

((LinearLayout)findViewById (R.id.right_side)).setLayoutParams(
    new LinearLayout.LayoutParams(
    FrameLayout.LayoutParams.MATCH_PARENT, 
    FrameLayout.LayoutParams.MATCH_PARENT)); 

попробуйте заменить new LinearLayout.LayoutParams с

new FrameLayout.LayoutParams(...) 
+0

Но стек вызовов скажет мне это, верно? Это ошибка в Android? – Sweeper

+0

Это говорит вам об этом. LinearLayout $ LayoutParams не может быть отправлен в FrameLayout $ LayoutParams. Код, который пытается выполнить кастинг, находится в FrameLayout, а не в вашем собственном коде, и он срабатывает по мере или не проходит ваш собственный код, поэтому ваш код не находится в трассировке. – orip

+0

Спасибо, это работает! – Sweeper

0
(new LinearLayout.LayoutParams (FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT)); 

Изменение FrameLayout s к LinearLayout

+0

Почему вы не изменили 'FrameLayout' на' LinearLayout' в вашем коде? – User42

 Смежные вопросы

  • Нет связанных вопросов^_^