Получаю ошибку сайте 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 ответа:
В вашем
custom_layout.xml
Замените<com.example.MyCustomLayout
на другой макет (например, aLinearLayout
):<?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);
В вашем конструкторе для пользовательского макета Объект вызывает бесконечную рекурсию самостоятельных вызовов, переполняя стек.
Нет причин для вас, чтобы делать это.
Вероятно, вам лучше всего откопать пример чьего-то рабочего пользовательского класса макета.