2011-05-20 150 views
3

我有从我的应用程序在Android市场奇怪的堆栈跟踪。 我有一个视图切换器,其中包含两个视图,其中一个包含复选框。错误充气复选框

我得到这个堆栈跟踪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"/> 

回答

4

我怀疑它与你有关系将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是由系统使用的ID引用“空”的观点这是由AdapterView实例没有项目显示时呈现的。这种差异可能导致大量未知行为。

+0

我试图删除复选框图标我会告诉您以及 – darune 2011-05-30 15:34:17

+0

这是它,谢谢!很抱歉很长时间,但因为我无法重现错误,所以我在等待市场上没有更多的错误提交,您将尽快得到赏金值,正如你在时间上回答:D – darune 2011-06-06 08:21:42

1

如果您呼叫从viewroot的构造膨胀,那么你应该attachToRoot参数调用它false

li.inflate(R.layout.ad_detail_view, this); 

,因为它尚未实例化(您目前在其构造函数中)。

但是基于你得到的错误,这可能不是唯一的问题,所以共享ad_detail_view的xml布局可能会有所帮助(错误说问题出现在xml文件中,在#29行)。

+0

新增的问ressources,线#29是复选框线。请注意,我有一个复选框的另一个视图切换器也有类似问题,但没有任何自定义视图,如果需要我可以发布xml。 – darune 2011-05-20 09:37:17

+0

可能会发生,'@ style/StarButton'风格有一些不一致吗? – rekaszeru 2011-05-20 09:45:24

+0

添加了两个缺少的资源,但另一方面,我面临着与非风格复选框 – darune 2011-05-20 09:51:31

1

这可能是(我的建议),当你定义样式时,你并没有给出默认的CheckBox样式。因此,在某些Android/Device中,您缺少在该父级中定义的属性。

或者(因为这个异常导致CheckBox本身出现问题),尝试将它移动到你的apk(widget.CheckBox.java)。

这是一件坏事,Android Market不允许您检查导致崩溃的Android版本。你有没有试过用Android 1.5运行模拟器来检查这个?

+0

相同的例外感谢您的答案,我对这个问题绝望。我将尝试将父级样式定义为复选框。没有尝试使用较老的emultator,但1.6安装不到我用户群的2%,而且这个错误发生得更多。我会及时通知您结果 – darune 2011-05-26 16:18:20

+0

另外请注意,崩溃后可能会被卸载;) – ACM64 2011-05-26 16:32:54

1

曾有同样的问题,请尝试使用android.support.v7.widget.AppCompatCheckBox

<android.support.v7.widget.AppCompatCheckBox 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:id="@+id/crime_solved" 
     android:layout_marginLeft="16dp" 
     android:layout_marginRight="16dp" 
     android:text="@string/crime_solved_label"/>