机器人:充气()忽略利用样式表定义的根布局宽度/高度。 二进制XML错误(Android : i

2019-10-17 12:09发布

我工作的一个项目,我转换GUI到样式表。 我使用的是布局,然后横向/纵向设置样式表。 我用充气膨胀的布局,正如我动态添加和删除的内容,和视图本身是动态通过我的代码插入到应用程序中创建和销毁。

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:高度在基地布局一切完美运行。 这是不是真的可以接受的,因为我需要不同的值,布局VS肖像,以及为不同构建手机。

下一个选项是设置充气的rootView为null,这也得到了布局PARAMS权(有点...),但是这会导致空指针,当我尝试和返回视图的访问内部元件。

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

为什么LayoutInflater不理我指定的layout_width和layout_height布局参数?

我知道原因,但这又没有做我任何良好在这种情况下,我已经尝试建议的方法(见上文),并使用样式表时,我仍然得到这个错误。

我还没有尝试过的唯一选项是硬编码值到布局,然后编程检测屏幕的方向,并相应地改变布局参数,可以但这又需要为各种要做的电话建立,似乎打败样式表的全部目的。

有人有想法么?

Answer 1:

为什么我的TextView没有正确充气XML参数搜索,当我遇到这个问题就来了。 不同于作者的解决办法,我只好用我是加入我的TextView父的LinearLayout的名称。

TextView myTextView = (TextView) myInflater.inflate(R.layout.my_textview_xml, myLinearLayout, false);

在解决问题的这段视频是有帮助的:

http://www.youtube.com/watch?v=1Y0LlmTCOkM



Answer 2:

好,

所以,我没有得到任何答复,这里是我的周围的工作:

更改此:

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));
        }
    }
}

希望节省有人为有些无奈。



文章来源: Android : inflate() ignoring utilizing root layout width/height defined in style sheets. BInary XML error