Получаю ошибку сайте StackOverflow, пытаясь надуть настраиваемое представление


У меня есть 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: java.lang.StackOverflowError

2 3

2 ответа:

В вашем custom_layout.xml Замените <com.example.MyCustomLayout на другой макет (например, a LinearLayout):

<?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 tag(и установите orientation в классе MyCustomLayout). Прямо сейчас, когда Android загружает my_activity.xml, он найдет ваш пользовательский View и создаст его экземпляр. Когда ваш пользовательский вид будет создан Android, он будет раздувать xml-файл custom_layout в конструкторе MyCustomLayout. Когда это произойдет, он снова найдет <com.example.MyCustomLayout ... (из только что раздутого custom_layout.xml), что приведет к MyCustomLayout бытию снова создан экземпляр. Это рекурсивный вызов, и он, наконец, бросит StackOverflowError.

Наличие этой строки

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

В вашем конструкторе для пользовательского макета Объект вызывает бесконечную рекурсию самостоятельных вызовов, переполняя стек.

Нет причин для вас, чтобы делать это.

Вероятно, вам лучше всего откопать пример чьего-то рабочего пользовательского класса макета.