10

Ho ottenuto una barra di azione e alcuni frammenti. Il problema è il mio homescreen. C'è una panoramica Frammento sul lato sinistro e un dettaglio Frammento sul lato destro. My TabListener è dinamico, quindi voglio impostare il peso del mio layout in modo programmatico. Ogni volta che cerco di ottenere i Layoutparams della mia LinearLayout ottengo un 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) 

Il layout che viene gonfiato:

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

Il codice:


      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

possibile duplicato di [? Ottenere ClassCastException quando si cerca di inserire RelativeLayout dyanmically] (http://stackoverflow.com/questions/10045360/getting-classcastexception-when -ripassare-inserire-relativelayout-dianmicamente) – ForceMagic

risposta

31

Cosa sta succedendo è che LayoutParams di una vista sono in realtà il tipo di genitore . In questo caso ricevi uno FrameLayout$LayoutParams perché LinearLayout si trova all'interno di FrameLayout.

Perché è il tipo di genitore? Questo perché memorizzano informazioni che sono utili al genitore per deporle. Se si dovessero recuperare i parametri di layout per EditText o ListView si otterrebbe LinearLayout$LayoutParams.

+0

Grazie mille ora funziona bene. Invece di layout_weight uso layout_gravity e cambio dinamicamente la larghezza – Ceryni

+0

Sweet! Se questa risposta ti è stata utile, dovresti accettarla (il segno di spunta a sinistra). – dmon

+0

Ah ok grazie per il tuo consiglio. La mia prima domanda a StackOverflow – Ceryni

1

Eccezione afferma chiaramente che stanno provando a trasmettere FrameLayout a LinearLayout. Ciò si verifica in onViewCreated() metodo nel file di ListSearchFragment.java, linea 184. Così sostituire questo:

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

con questo:

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

Prima di farlo, è possibile posizionare il puntatore del mouse sul LayoutParams nella vostra codice corrente e vedi in bolla che è in effetti android.widget.RelativeLayout.LayoutParams quindi la tua eccezione. Vedi:

enter image description here

+0

Che non funziona. Esattamente la stessa eccezione. Guardando la risposta sopra accettata, NON è possibile affatto. Sarò felice di sapere che ho torto. – halxinate

0

C'è un altro motivo (o bug) per questa eccezione:

Se ID della vista viene utilizzata anche in un altro layout, allora cercherò di gettare LayoutParams per le viste padre utilizzati in entrambi i layout.

Soluzione: Non usare lo stesso ID in diversi layout :)