我在 Android市场的应用程序中有奇怪的堆栈跟踪. 我有一个视图切换器,其中包含两个视图,其中一个包含一个复选框. 我得到这个堆栈跟踪AdDetailView beeing自定义视图. android.view.InflateExcep
我有一个视图切换器,其中包含两个视图,其中一个包含一个复选框.
我得到这个堆栈跟踪AdDetailView beeing自定义视图.
android.view.InflateException: Binary XML file line #29: Error inflating class android.widget.CheckBox at android.view.LayoutInflater.createView(LayoutInflater.java:513) at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56) at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:563) at android.view.LayoutInflater.rInflate(LayoutInflater.java:618) at android.view.LayoutInflater.rInflate(LayoutInflater.java:621) at android.view.LayoutInflater.rInflate(LayoutInflater.java:621) at android.view.LayoutInflater.rInflate(LayoutInflater.java:621) at android.view.LayoutInflater.inflate(LayoutInflater.java:382) at android.view.LayoutInflater.inflate(LayoutInflater.java:320) at android.view.LayoutInflater.inflate(LayoutInflater.java:276) at com.yakaz.view.AdDetailView.init(AdDetailView.java:67) at com.yakaz.view.AdDetailView.<init>(AdDetailView.java:78)
这发生在以下视图构造函数中:
private void init(Context context) { LayoutInflater li = (LayoutInflater) context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); li.inflate(R.layout.ad_detail_view, this); setOrientation(LinearLayout.VERTICAL); } public AdDetailView(Context context, AttributeSet attrs) { super(context, attrs); init(context); }
线67是膨胀线.
问题是我无法在仿真器或设备上重现问题.
有什么指针吗?
这是ad_detail_view.xml
<?xml version="1.0" encoding="utf-8"?> <merge xmlns:android="http://schemas.android.com/apk/res/android"> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/preview_warning" style="@style/Notification" android:text="@string/this_is_only_a_preview" android:visibility="gone" /> <ScrollView android:layout_width="fill_parent" android:fadingEdge="none" android:layout_height="fill_parent" android:layout_weight="1" android:fillViewport="true" android:id="@+id/scrolls"> <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical"> <include layout="@layout/action_bar" /> <LinearLayout android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content" android:paddingTop="10dp" android:paddingLeft="10dp" android:paddingRight="10dp"> <!-- tags --> <LinearLayout android:id="@+id/tagsLayout" android:orientation="horizontal" android:layout_width="fill_parent" android:layout_weight="1" android:layout_height="wrap_content" /> <CheckBox android:id="@+id/save_button" style="@style/StarButton" android:layout_marginRight="10sp" /> </LinearLayout> <!-- meta --> <Button android:id="@+id/meta" style="@style/Meta" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="10dp"/> <!-- pictures --> <LinearLayout android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content" android:gravity="center" android:id="@+id/gallery_container"> <Gallery android:id="@+id/gallery" android:layout_width="fill_parent" android:layout_height="wrap_content" /> </LinearLayout> <!-- padded layout --> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical" android:padding="5dp"> <!-- summary --> <TextView android:id="@+id/summary" style="@style/AdDetailSummary" android:layout_width="fill_parent" android:layout_height="wrap_content" android:paddingBottom="10dp" /> </LinearLayout> <!-- tab --> <LinearLayout android:layout_width="fill_parent" android:orientation="vertical" android:layout_height="wrap_content" android:background="@drawable/bottom_green_bar" android:paddingLeft="10dp"> <TextView android:layout_width="wrap_content" android:id="@+id/tab_title" android:gravity="center" android:layout_height="wrap_content" android:text="@string/member_profile" style="@style/TabLabel" /> </LinearLayout> <!-- user detail --> <LinearLayout android:layout_width="fill_parent" android:orientation="vertical" android:layout_height="wrap_content" android:background="@color/very_light_gray" android:paddingBottom="10dp"> <!-- user item --> <include layout="@layout/user_item" /> <include layout="@layout/website_item" /> </LinearLayout> </LinearLayout> </ScrollView> </merge>
style.xml:
<style name="StarButton"> <item name="android:background">@drawable/bk_star_button</item> <item name="android:layout_width">30dp</item> <item name="android:layout_height">30dp</item> <item name="android:button">@android:id/empty</item> </style>
bk_star_button.xml:
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/btn_star_big_off" android:state_checked="false"/> <item android:drawable="@drawable/btn_star_big_on" android:state_checked="true"/> </selector>
这是另一种布局,因为在某些设备上引发了完全相同的异常:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" android:background="@drawable/bk_gradient"> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" android:gravity="left|center_vertical" style="@style/TopBar" android:id="@+id/titlebar"> <ImageView android:src="@drawable/logo" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@null" android:layout_alignParentLeft="true" /> <FrameLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" android:paddingLeft="8dp" android:id="@+id/search_progressbar" android:visibility="gone"> <ProgressBar android:layout_width="wrap_content" android:layout_height="wrap_content" style="@style/ProgressBarMedium" /> </FrameLayout> <LinearLayout android:id="@+id/buttons_container" android:gravity="right|center_vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" /> </LinearLayout> .... </LinearLayout> </LinearLayout>
引发异常的代码:
public static CompoundButton addTitleBarCompoundButton(Context context, View titleBar, CharSequence label, boolean isChecked) { if (!(titleBar instanceof ViewGroup)) return null; ViewGroup group = (ViewGroup) titleBar .findViewById(R.id.buttons_container); // We attach to root during the inflating process othersize layout_ // parameters in the style are ignored LayoutInflater.from(context).inflate(R.layout.topbar_toggle_button, group, true); // Get the result, which is the last child of the group CompoundButton result = (CompoundButton) group.getChildAt(group .getChildCount() - 1); result.setChecked(isChecked); // Set the text result.setText(label); return result; }
topbar_toggle_button.xml:
<?xml version="1.0" encoding="utf-8"?> <CheckBox xmlns:android="http://schemas.android.com/apk/res/android" style="@style/BarButton.Toggle"/>我怀疑它与你将android:button参数设置为@android:id / empty有关.你能详细说明你为什么要这样做吗?在我看来,您已通过< selector>创建了自定义选中/取消选中的视图在后台,所以应该清除按钮元素.如果我的假设是正确的,你应该这样做:
<style name="StarButton"> <item name="android:background">@drawable/bk_star_button</item> <item name="android:layout_width">30dp</item> <item name="android:layout_height">30dp</item> <item name="android:button">@null</item> </style>
提供@null属性作为清除默认属性的方法,而@android:id / empty是系统用来引用AdapterView实例在没有要显示的项目时显示的“空”视图的ID.这种差异可能会导致许多未知行为.