10

我得到了一個ActionBar和一些碎片。問題是我的主屏幕。在左側有一個概述片段,在右側有一個細節片段。我的TabListener是動態的,所以我想以編程方式設置我的佈局的重量。每當我試圖讓我的LinearLayout的的LayoutParams我得到一個ClassCastException:ClassCastException LinearLayout LayoutParams

12-22 16:00:37.620: W/System.err(7235): java.lang.ClassCastException: android.widget.FrameLayout$LayoutParams cannot be cast to android.widget.LinearLayout$LayoutParams 
12-22 16:00:37.625: W/System.err(7235):  at com.coover.eu.lostandfound.ListSearchFragment.onViewCreated(ListSearchFragment.java:184) 
12-22 16:00:37.625: W/System.err(7235):  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:884) 
12-22 16:00:37.630: W/System.err(7235):  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1080) 
12-22 16:00:37.630: W/System.err(7235):  at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:622) 
12-22 16:00:37.630: W/System.err(7235):  at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1416) 
12-22 16:00:37.630: W/System.err(7235):  at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:505) 
12-22 16:00:37.630: W/System.err(7235):  at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1178) 
12-22 16:00:37.635: W/System.err(7235):  at android.app.Activity.performStart(Activity.java:5216) 
12-22 16:00:37.635: W/System.err(7235):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2083) 
12-22 16:00:37.635: W/System.err(7235):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2135) 
12-22 16:00:37.635: W/System.err(7235):  at android.app.ActivityThread.access$700(ActivityThread.java:140) 
12-22 16:00:37.635: W/System.err(7235):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1237) 
12-22 16:00:37.640: W/System.err(7235):  at android.os.Handler.dispatchMessage(Handler.java:99) 
12-22 16:00:37.640: W/System.err(7235):  at android.os.Looper.loop(Looper.java:137) 
12-22 16:00:37.640: W/System.err(7235):  at android.app.ActivityThread.main(ActivityThread.java:4921) 
12-22 16:00:37.640: W/System.err(7235):  at java.lang.reflect.Method.invokeNative(Native Method) 
12-22 16:00:37.640: W/System.err(7235):  at java.lang.reflect.Method.invoke(Method.java:511) 
12-22 16:00:37.645: W/System.err(7235):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1038) 
12-22 16:00:37.645: W/System.err(7235):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:805) 
12-22 16:00:37.645: W/System.err(7235):  at dalvik.system.NativeStart.main(Native Method) 

佈局被誇大:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" 
    android:id="@+id/container_found_list_overview"> 

    <EditText android:id="@+id/search_box" 
     android:layout_width="fill_parent" 
     android:layout_height="50dp" 
     android:padding="5dp" 
     android:textSize="35sp" 
     android:hint="@string/search" 
     android:inputType="text" 
     android:maxLines="1"/> 
    <ListView 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:id="@+id/overview_list_view"> 
    </ListView> 

</LinearLayout> 

代碼:


      LinearLayout myView = (LinearLayout)this.getView().findViewById(R.id.container_found_list_overview); 
      Log.d("found container", ""+(myView != null)); 
      try{ 
       LayoutParams lp = (LayoutParams) myView.getLayoutParams(); 
       lp.weight = 1; 
       lp.width = 0; 
       myView.setLayoutParams(lp); 
      } 
      catch(RuntimeException e){ 
       Log.e("cant get layoutparams",e.getMessage()); 
       e.printStackTrace(); 
      } 
+0

[?試圖dyanmically插入的RelativeLayout時,遇到了ClassCastException異常]的可能重複(http://stackoverflow.com/questions/10045360/getting-classcastexception-when -trying-insert-relativelayout-dyanmically) – ForceMagic

回答

31

這是怎麼回事是視圖的的LayoutParams實際上是的類型。在這種情況下,您會得到一個FrameLayout$LayoutParams,因爲您的LinearLayout位於FrameLayout內部。

爲什麼它的父類型?這是因爲他們存儲的信息對父母來說很有用。如果您要檢索EditText或ListView的佈局參數,您將獲得LinearLayout$LayoutParams

+0

非常感謝你現在正常工作。而不是layout_weight我使用layout_gravity並動態改變寬度 – Ceryni

+0

甜!如果這個答案有幫助,你應該接受它(左邊的複選標記)。 – dmon

+0

好的,謝謝你的建議。我的第一個問題在stackoverflow – Ceryni

1

異常明確指出你正試圖將FrameLayout轉換成LinearLayout。與此

LayoutParams lp = (LayoutParams) myView.getLayoutParams(); 

:這發生在ListSearchFragment.java文件onViewCreated()方法,行184所以更換此

LinearLayout.LayoutParams lp = 
        (LinearLayout.LayoutParams) myView.getLayoutParams(); 

之前,你這樣做,你可以懸停在LayoutParams鼠標指針的目前的代碼,並在泡沫中看到它實際上是android.widget.RelativeLayout.LayoutParams因此你是個例外。請參閱:

enter image description here

+0

這不起作用。完全一樣的例外。看上面的答案 - 這是不可能的。我會很高興知道我錯了。 – halxinate

0

有此異常的另一個原因(或錯誤):

如果同時在另一佈局中使用的視圖的ID,然後它會嘗試投的LayoutParams在兩種佈局中使用的父母的意見。

解決辦法:不要使用相同的ID在不同的佈局:)

相關問題