10

Mam Actionbar i kilka fragmentów. Problem to mój ekran główny. Po lewej stronie znajduje się przegląd Fragment i Fragment po prawej stronie. Moje TabListener jest dynamiczne, więc chcę ustawić wagę mojego układu programowo. Ilekroć próbuję uzyskać Layoutparams mojego LinearLayout ja dostać 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) 

układ, który jest pompowana:

<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> 

Kod:


      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

możliwe duplikat [? Getting ClassCastException podczas próby wstawienia RelativeLayout dyanmically] (http://stackoverflow.com/questions/10045360/getting-classcastexception-when -próbowanie-wstawiania-relatywnie-do-dyanmicznie) – ForceMagic

Odpowiedz

31

Co się dzieje jest to, że LayoutParams rzutem są właściwie rodzaj rodzica. W tym przypadku otrzymujesz FrameLayout$LayoutParams, ponieważ twój LinearLayout znajduje się wewnątrz FrameLayout.

Dlaczego jest to typ rodzica? Dzieje się tak dlatego, że przechowują informacje, które są przydatne rodzicom, aby je ułożyć. Jeśli pobierzesz parametry układu dla EditText lub ListView, otrzymasz LinearLayout$LayoutParams.

+0

Dziękuję bardzo, że teraz działa dobrze. Zamiast layout_weight korzystam z layout_gravity i dynamicznie zmieniam szerokość – Ceryni

+0

Sweet! Jeśli ta odpowiedź pomogła, powinieneś ją zaakceptować (znacznik wyboru po lewej). – dmon

+0

Ach ok, dziękuję za twoją radę. Moje pierwsze pytanie na stackoverflow – Ceryni

1

Wyjątek wyraźnie stwierdza, że ​​ciebie próbują rzucić FrameLayout do LinearLayout. Dzieje się tak w onViewCreated() metody w pliku ListSearchFragment.java, linia 184. Więc zastąpić to:

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

z tym:

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

Zanim to zrobisz, może po najechaniu kursorem myszy na LayoutParams w swojej obecny kod i zobacz w bańce, że jest to w rzeczywistości android.widget.RelativeLayout.LayoutParams stąd twój wyjątek. Zobacz:

enter image description here

+0

To nie działa. Dokładnie ten sam wyjątek. Patrząc na zaakceptowaną odpowiedź powyżej - w ogóle NIE jest to możliwe. Będę szczęśliwy wiedząc, że się mylę. – halxinate

0

Jest jeszcze jeden powód (lub bug) dla tego wyjątku:

Jeśli widok ID sprzedawcy jest również stosowany w innym układzie, wówczas będzie ona próbować rzucać LayoutParams dla poglądów dominujących stosowanych w obu układach.

Rozwiązanie: nie używaj tego samego identyfikatora w różnych układach :)

Powiązane problemy