3

custom_layout.xmlがあります:

<?xml version="1.0" encoding="utf-8"?>

<com.example.MyCustomLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical" >

<!-- different views -->

</com.example.MyCustomLayout>

そしてそのクラス:

public class MyCustomLayout extends LinearLayout {

public MyCustomLayout(Context context, AttributeSet attrs) {
    super(context, attrs);

    LayoutInflater.from(context).inflate(R.layout.custom_layout, this, true);
    setUpViews();
    }
//different methods
}

そして、このレイアウトを含むアクティビティ:

public class MyActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.my_activity);

    setUpViews();
}

そしてmy_activity.xml:

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical" >

    <com.example.MyCustomLayout
        android:id="@+id/section1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical" />
    <com.example.MyCustomLayout
        android:id="@+id/section2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical" />

</LinearLayout>

したがって、コメントブロックを:から削除LayoutInflater.from(context).inflate(R.layout.custom_layout, this, true);し、グラフィックモードでmy_activity.xmlに移動すると、問題が発生します。Eclipseは考えてから、クラッシュします。カスタムビューを何度も膨らませようとしているように見えますが、その理由がわかりません。eclipseを再起動すると、エラーログに次のエラーが表示されます。java.lang.StackOverflowError

4

2 に答える 2

4

別のレイアウト(たとえば、 )にcustom_layout.xml置き換える場合:<com.example.MyCustomLayoutLinearLayout

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical" >

<!-- different views -->

</LinearLayout>

または、mergeタグを使用する(そしてクラスに設定する)orientationことをお勧めします。MyCustomLayout現在、Androidロードmy_activity.xmlするとカスタムが検出され、Viewインスタンス化されます。カスタムビューがインスタンス化Androidされると、コンストラクターcustom_layoutでxmlファイルが拡張されます。MyCustomLayoutこれが発生すると、<com.example.MyCustomLayout ...(膨らんだばかりのcustom_layout.xml)が再び検出され、MyCustomLayout再びインスタンス化されます。これは再帰呼び出しであり、最終的に。をスローしStackOverflowErrorます。

于 2012-05-14T17:57:36.023 に答える
0

この線の存在

LayoutInflater.from(context).inflate(R.layout.custom_layout, this, true);

カスタムレイアウトオブジェクトのコンストラクターで、自己依存呼び出しが無限に再帰し、スタックがオーバーフローします。

あなたがそうする理由はありません。

おそらくあなたが最善の策は、他の誰かが作業しているカスタムレイアウトクラスの例を掘り下げることです。

于 2012-05-14T17:28:44.743 に答える