• 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧

Android:inflate()忽略利用样式表中定义的根布局宽度/高度。 BInary XML错误

Android 来源:Nathaniel 5次浏览

我正在开发一个项目,并将GUI转换为样式表。我使用布局,然后使用风景/肖像组的样式表。我使用充气器充气布局,因为我动态地添加和删除内容,而视图本身是由我的代码插入的应用程序动态创建和销毁的。Android:inflate()忽略利用样式表中定义的根布局宽度/高度。 BInary XML错误

myView = (LinearLayout) LayoutInflater.from(context).inflate(R.layout.bearing_layout, parentView, false); 

错误:了java.lang.RuntimeException:二进制XML文件中,第2行:必须提供layout_width属性。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    style="@style/bearing_overall_layout"> 
    <LinearLayout 
     style = "@style/bearing_header_layout"> 
     <TextView android:id="@+id/header" 
      style = "@style/bearing_header" 
      android:background="@drawable/transparentbackground" 
      android:text="@string/bearing_title" /> 
    </LinearLayout> 
    <RelativeLayout style="@style/BearingSelectListContainer" 
     android:id="@+id/top_view"> 
     <LinearLayout 
      style="@style/BearingSelectList_linear_layout"> 
      <TextView style="@style/BearingSelectListTitle" 
       android:id="@+id/title" 
       android:text="@string/bearing_title" /> 
      <ScrollView android:id="@+id/listScroller" 
       style="@style/bearing_list_scroller"> 
       <LinearLayout 
        style="@style/bearing_scroll_list_linear_layout" > 
        <LinearLayout android:id="@+id/pointList" 
         style="@style/bearing_point_list"> 
        </LinearLayout> 
       </LinearLayout> 
      </ScrollView> 
     <LinearLayout 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:layout_gravity="center_horizontal"> 
       <Button style="@style/BearingSelectListButton" android:id="@+id/view" android:text="@string/view_button" /> 
       <Button style="@style/BearingSelectListButton" android:id="@+id/my_loc" android:text="@string/my_loc_button" /> 
       <Button style="@style/BearingSelectListButton" android:id="@+id/center" android:text="@string/center_button" /> 
       <Button style="@style/BearingSelectListButton" android:id="@+id/exit" android:text="@string/exit_button" /> 
      </LinearLayout> 
     </LinearLayout> 
    </RelativeLayout> 
</LinearLayout> 

而且样式表:

<resources> 
<style name="bearing_overall_layout"> 
    <item name="android:orientation">vertical</item> 
    <item name="android:layout_width">fill_parent</item> 
    <item name="android:layout_height">300dp</item> 
</style> 
<style name = "bearing_header_layout"> 
    <item name ="android:orientation">horizontal</item> 
    <item name ="android:layout_width">fill_parent</item> 
    <item name ="android:layout_height">wrap_content</item> 
    <item name ="android:layout_alignParentTop">true</item> 
    <item name ="android:gravity">center</item> 
</style> 
<style name="bearing_header"> 
    <item name = "android:padding">10dp</item> 
    <item name = "android:textSize">18sp</item> 
    <item name = "android:textStyle">bold</item> 
    <item name = "android:layout_width">wrap_content</item> 
    <item name = "android:layout_height">wrap_content</item> 
    <item name = "android:layout_alignParentTop">true</item> 
    <item name = "android:gravity">center</item> 
</style> 
<style name="GotoMgrsInput"> 
    <item name="android:textSize">18dp</item> 
    <item name="android:layout_height">wrap_content</item> 
    <item name="android:layout_width">300dp</item> 
    <item name="android:background">#ff000000</item> 
</style> 
    <style name="BearingSelectMgrsInput"> 
    <item name="android:textSize">16sp</item> 
    <item name="android:layout_height">wrap_content</item> 
    <item name="android:layout_width">wrap_content</item> 
    <item name="android:layout_weight">1</item> 
    <item name="android:typeface">monospace</item> 
</style> 
<style name="bearing_list_scroller"> 
    <item name="android:layout_width">fill_parent</item> 
    <item name="android:layout_height">wrap_content</item> 
    <item name="android:layout_weight">1</item> 
    <item name="android:gravity">center</item> 

</style> 
<style name = "bearing_scroll_list_linear_layout"> 
    <item name="android:layout_width">fill_parent</item> 
    <item name="android:layout_height">fill_parent</item> 
    <item name="android:orientation">vertical</item> 
    <item name="android:layout_marginBottom">10dp</item> 
    <item name="android:gravity">center</item> 
</style> 
<style name = "bearing_point_list"> 
    <item name="android:layout_width">fill_parent</item> 
    <item name="android:layout_height">fill_parent</item> 
    <item name="android:layout_marginRight">1dip</item> 
    <item name="android:orientation">vertical</item> 
    <item name="android:gravity">center</item> 
</style> 

<style name="bearing_BearingSelectListContainer"> 
    <item name="android:layout_width">wrap_content</item> 
    <item name="android:layout_height">fill_parent</item> 
    <item name="android:background">#a000</item> 
    <item name="android:layout_alignParentLeft">true</item> 
    <item name="android:id">@+id/top_view</item> 
    <item name="android:gravity">center</item> 
    <item name="android:layout_alignParentLeft">false</item> 
</style> 
<style name="BearingSelectList_linear_layout"> 
    <item name="android:orientation">vertical</item> 
    <item name="android:layout_height">fill_parent</item> 
    <item name="android:layout_width">fill_parent</item> 

</style> 
<style name="BearingSelectListTitle"> 
    <item name="android:layout_width">wrap_content</item> 
    <item name="android:layout_height">wrap_content</item> 
    <item name="android:layout_gravity">center</item> 
    <item name="android:textStyle">bold</item> 
    <item name="android:textSize">24sp</item> 
</style>  
<style name="bearing_BearingSelectListButton"> 
    <item name="android:layout_width">80dp</item> 
    <item name="android:layout_height">wrap_content</item> 
</style> 
<style name="bearing_text_label"> 
    <item name="android:layout_width">wrap_content</item> 
    <item name="android:layout_height">wrap_content</item> 
    <item name="android:layout_gravity">center</item> 
    <item name="android:shadowColor">#ff000000</item> 
    <item name="android:shadowDx">1</item> 
    <item name="android:shadowDy">1</item> 
    <item name="android:shadowRadius">1</item> 
    <item name="android:textStyle">bold</item> 
    <item name="android:clickable">false</item> 
    <item name="android:longClickable">false</item> 
</style> 
<style name="bearing_item_inner_layout"> 
    <item name="android:layout_width">wrap_content</item> 
    <item name="android:layout_height">wrap_content</item> 
    <item name="android:gravity">center</item> 
</style> 
<style name="bearing_specific_view_layout"> 
    <item name="android:layout_width">wrap_content</item> 
    <item name="android:layout_height">wrap_content</item> 
    <item name="android:orientation">horizontal</item> 
    <item name="android:layout_alignParentLeft">true</item> 
</style> 

现在,如果我硬定义了android:宽度和android:高度在基地布局一切完美运行。这并不是真的可以接受,因为我需要不同的布局和肖像值,以及不同的手机版本。

下一个选项是将inflate的rootView设置为null,这会得到布局参数的权利(排序……),但是当我尝试访问返回的视图的内部元素时,这会导致空指针。

在我看来,像充气只是忽略了充气视图的风格元素,并从这个问题:

Why does LayoutInflater ignore the layout_width and layout_height layout parameters I’ve specified?

我知道原因,但这又没有做我任何好处这种情况下,因为我尝试了建议的方法(请参阅上文),并且在使用样式表时仍然遇到此错误。

我没有尝试过的唯一选择是将值硬编码到布局中,然后通过编程方式检测屏幕的方向并相应地更改布局参数,但这又需要针对各种手机完成建立并似乎击败了样式表的全部目的。

任何人有任何想法?

===========解决方案如下:

好吧,

所以我没有得到任何回应,这是我的解决方法:

更改此:

myView = (LinearLayout) LayoutInflater.from(context).inflate(R.layout.bearing_layout, parentView, false); 

要这样:

myView = (LinearLayout) LayoutInflater.from(context).inflate(R.layout.bearing_layout, null, false); 

这将在第一时间正确加载您的资源。注意:虽然所有后续的视图都可以正常工作,但这不会检测到针对方向更改的最低级别视图的布局更改。为了解决这个问题,我们添加了一个辅助函数:

genLayoutParams(yourView); 

private void genLayoutParams(View reuse) { // apply whatever layout parameters you see fit, these are just examples. 
    if (activity.getResources().getConfiguration().orientation == activity.getResources().getConfiguration().ORIENTATION_LANDSCAPE) { 
     reuse.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, 
         ViewGroup.LayoutParams.FILL_PARENT)); 

    } 
    else { 
     if (android.os.Build.VERSION.SDK_INT >= 13) { 
      reuse.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, 
        250)); 
     } 

     else{ 
      reuse.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, 
        300)); 
     } 
    } 
} 

希望能节省一些沮丧。


版权声明:本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系管理员进行删除。
喜欢 (0)