ClassCastException LinearLayout LayoutParams
J'ai eu une Actionbar et quelques Fragments. Le Problème est que mon écran d'accueil. Il y a une vue Fragment sur le côté gauche et un détail Fragment sur le côté droit. Mon TabListener est Dynamique donc je veux mettre le poids de ma Mise en page par programmation. Chaque fois que j'essaie d'obtenir de la Layoutparams de mon LinearLayout-je obtenir une ClassCastException:
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)
La Mise en page qui est gonflé:
<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>
Le code:
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();
}
double possible de Obtenir ClassCastException lorsque vous tentez d'insérer RelativeLayout dyanmically?
OriginalL'auteur Ceryni | 2012-12-22
Vous devez vous connecter pour publier un commentaire.
Ce qui se passe est qu'une vue de l'LayoutParams sont en fait le type de la parent. Dans ce cas, vous obtenez un
FrameLayout$LayoutParams
parce que votre LinearLayout est à l'intérieur d'un FrameLayout.Pourquoi est-il le type de la mère? C'est parce qu'ils stocker de l'information utile pour les parents de les agencer. Si vous étiez à récupérer les paramètres de mise en page pour l'EditText ou ListView vous obtenez
LinearLayout$LayoutParams
.Sweet! Si cette réponse a aidé, vous devez l'accepter (la coche sur la gauche).
Ah ok merci pour vos conseils. Ma première Question sur stackoverflow
Bon travail: code, journal, xml. Rend facile pour vous aider.
Alors, quelle est la bonne solution alors? Si par exemple je veux ajouter une marge supérieure à mes linéaire de la mise en page qui est imbriquée à l'intérieur de la relative mise en page?
OriginalL'auteur dmon
Exception stipule clairement que vous êtes en train de jeter
FrameLayout
àLinearLayout
. Cela se produit dansonViewCreated()
méthode ListSearchFragment.java fichier, ligne 184. Remplacez donc ceci::
Avant de le faire, vous pouvez placer le pointeur de votre souris sur
LayoutParams
dans votre code et de voir dans la bulle qu'il est en faitandroid.widget.RelativeLayout.LayoutParams
donc votre exception. Voir:OriginalL'auteur Marcin Orlowski
Il y a une autre raison (ou bug) pour cette exception:
Si l'affichage de l'ID est également utilisée dans une autre mise en page, puis il va essayer de jeter LayoutParams pour le Parent vues utilisées dans les deux mises en page.
Solution: Ne pas utiliser le même id dans différentes mises en page 🙂
OriginalL'auteur M. Usman Khan