Android 巢狀佈局導致的Exception: java.lang.ClassCastException
RelativeLayout title_bg = (RelativeLayout)FTU_Bluetooth.this.findViewById(R.id.titlebar);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, 0x55);
title_bg.setLayoutParams(params);
如果用RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(int, int),則會報Exception: java.lang.ClassCastException: android.widget.RelativeLayout$LayoutParams
這是因為在這裡的RelativeLayout在xml裡是套在LinearLayout裡的,必須建立父控制元件的LayoutParams。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/background" > <RelativeLayout android:id="@+id/titlebar" android:background="@drawable/main_title" android:layout_width="fill_parent" android:layout_height="66dp" >
--------------------------------------------------------------------------
下面轉帖壯志凌雲的部落格: http://sunjilife.blog.51cto.com/3430901/1159639
在android中用程式碼動態新增元件或者改變某種佈局(元件)的高度時,會遇到如題所示的類轉換異常。
These supply parameters to the parent of this view specifying how it should be arranged. There are many subclasses of ViewGroup.LayoutParams, and these correspond to the different subclasses of ViewGroup that are responsible for arranging their children.
So basically, if you are adding a view to another, you MUST set the LayoutParams of the view to the LayoutParams type that the parent uses, or you will get a runtime error.
如果你要將一個view新增到另一個佈局中或者為這個view重新設定寬高等佈局屬性,你為該View設定的佈局引數型別與其父類所使用的佈局引數型別一樣。此外就是說若是最上層的佈局,則不需要設定此項。android中提供的佈局引數型別目前一共12種:ViewPager.LayoutParams,LinearLayout.LayoutParams,RelativeLayout.LayoutParams,TableLayout.LayoutParams等等。關於
LayoutParams的說明http://www.cnblogs.com/shaweng/archive/2012/07/10/2585134.html
比如:
- LinearLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- FrameLayout
- android:id="@+id/FrameLayout01"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- LinearLayout
- 若想在程式碼中動態改變FrameLayout的大小,應該這樣寫:
- FrameLayout frameLayout=(FrameLayout) convertView.findViewById(R.id.FrameLayout01);
- LinearLayout.LayoutParams ff=new LinearLayout.LayoutParams(LayoutParams.WRAP_C
- ONTENT, height);
- frameLayout.setLayoutParams(ff);
按照上面的說法,那麼若是底層佈局是LinearLayout,那麼新增view的時候指定的寬高引數就必然是Linear.Layout
Params,可我在嘗試過程中發現使用ViewGroup.LayoutParams,RelativeLayout.Params也可以執行,且不會出錯,以下是程式碼:
- //test.xml 佈局檔案
- xml version="1.0" encoding="utf-8"
- LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/test_root_linearlayout"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:orientation="vertical"
- LinearLayout
- package com.example.aboutexpand;
- import android.app.Activity;
- import android.os.Bundle;
- import android.view.ViewGroup;
- import android.widget.LinearLayout;
- import android.widget.RelativeLayout;
- import android.widget.TextView;
- public class TestActivity extends Activity {
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- RelativeLayout rootLayout;
- super.onCreate(savedInstanceState);
- setContentView(R.layout.test);
- rootLayout = (LinearLayout) findViewById(R.id.test_root_linearlayout);
- LinearLayout.LayoutParams rootLinaerParams = new LinearLayout.LayoutParams(
- 100, 100);
- ViewGroup.LayoutParams rootGroupParams = new LinearLayout.LayoutParams(
- 100, 100);
- RelativeLayout.LayoutParams rootRelativeParams = new RelativeLayout.LayoutParams(
- 100, 100);
- TextView testView = new TextView(this);
- testView.setText("根佈局測試動態新增元件並設定其大小");
- testView.setLayoutParams(rootGroupParams);
- rootLayout.addView(testView);
- // rootLayout.addView(testView, viewParams);
- }
經過試驗,新增加的TextView的佈局引數使用LinearLayout.LayoutParams,RelativeLayout.LayoutParams,ViewGroup.LayoutParams都是可以正確顯示的,不相信的朋友,自己也可以試試看。至於這到底是什麼原因呢,我目前也不清楚,希望有知道的朋友留言指教一下,謝謝
相關文章
- Android實現RecyclerView巢狀流式佈局AndroidView巢狀
- Android 多個Fragment巢狀導致的三大BUGAndroidFragment巢狀
- [開發教程]第6講:Bootstrap巢狀佈局與流動佈局boot巢狀
- Chrome 73導致的flex佈局崩壞ChromeFlex
- 解決 ViewPager 巢狀導致的 Fragment 選單錯亂Viewpager巢狀Fragment
- ScrollView巢狀LinearLayout佈局不能撐滿全屏的問題View巢狀
- Android 頁面多狀態佈局管理Android
- Android 佈局Android
- Android中常見的佈局和佈局引數Android
- 物件導向 成員和巢狀物件巢狀
- Exception in thread "main" java.lang.ClassCastException: $Proxy13ExceptionthreadAIJavaAST
- flutter佈局-9-appbar導航欄和狀態列FlutterAPP
- Chrome72巢狀flex佈局修改,你的網站可能會發生布局錯亂Chrome巢狀Flex網站
- Android-多狀態載入佈局的開發-TipsAndroid
- Android的佈局介紹Android
- Android佈局概述Android
- Android xml 佈局AndroidXML
- StatusLayout:顯示不同狀態的佈局
- 可無限巢狀選擇的RadioGroup,以及可任意定義佈局的RadioButton巢狀
- Android:巢狀滑動總結Android巢狀
- Android中ExpandableListView中巢狀ListViewAndroidView巢狀
- android佈局------RelativeLayout(相對佈局)詳解Android
- android筆記二(水平佈局與垂直佈局)Android筆記
- 寫給 Android 開發的小程式佈局指南,Flex 佈局!AndroidFlex
- Android的四個基本佈局Android
- Android中佈局的優化Android優化
- Android學習—— Android佈局Android
- 集合的巢狀巢狀
- 盒子的巢狀巢狀
- Android 佈局優化Android優化
- android 介面佈局(大概)Android
- android listView巢狀gridview的使用心得AndroidView巢狀
- Android實現雙層ViewPager巢狀AndroidViewpager巢狀
- 集合框架-集合的巢狀遍歷(HashMap巢狀HashMap)框架巢狀HashMap
- 集合框架-集合的巢狀遍歷(HashMap巢狀ArrayList)框架巢狀HashMap
- 集合框架-集合的巢狀遍歷(ArrayList巢狀HashMap)框架巢狀HashMap
- 集合框架-集合的巢狀遍歷(多層巢狀)框架巢狀
- 021.Vue3入門,元件巢狀關係,顯示一個經典的佈局樣式Vue元件巢狀