2015-08-27 98 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更換new LinearLayout.LayoutParams。某處,它試圖將類型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 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