2

私はプロジェクトに取り組んでおり、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:width と android:height をハード定義すると、他のすべてが完全に実行されます。レイアウトとポートレート、および電話のビルドごとに異なる値が必要なため、これは実際には受け入れられません。

次のオプションは、inflate の rootView を null に設定することです。これにより、レイアウト パラメータが正しくなります (一種の...)。ただし、返されるビューの内部要素にアクセスしようとすると、null ポインターが発生します。

inflate は、インフレートされたビューのスタイル要素を無視しているように思えます。この質問から:

LayoutInflater が、指定した layout_width および layout_height レイアウト パラメータを無視するのはなぜですか?

理由はわかりますが、提案されたアプローチ(上記を参照)を試みたが、スタイルシートを使用しているときにまだこのエラーが発生しているため、この場合は何の役にも立ちません。

私が試していない唯一のオプションは、値をレイアウトにハードコーディングし、プログラムで画面の向きを検出し、それに応じてレイアウトパラメーターを変更することですが、これもさまざまな電話ビルドで行う必要があり、スタイルシートの目的全体を無効にします。

誰にもアイデアはありますか?

4

2 に答える 2

7

TextView が xml パラメータを適切に膨らませていない理由を検索しているときに、この質問に出くわしました。著者のソリューションとは異なり、TextView を追加する親 LinearLayout の名前を使用する必要がありました。

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

このビデオは、問題の解決に役立ちました。

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

于 2014-05-15T08:45:53.020 に答える
2

Ok、

だから私は何の応答も得ていません、ここに私の回避策があります:

これを変える:

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

誰かの欲求不満を救うことを願っています。

于 2012-12-20T17:03:38.807 に答える