Мое приложение зависает, когда через addView()
Im noob на android. Мое приложение продолжает сбой всякий раз, когда я использую метод ViewGroup addView (), но работает, когда я использую метод activity addContentView ().
причина, по которой я хочу использовать addView() вместо addContentView (), заключается в том, что я хочу иметь возможность удалять макеты, когда они не нужны, что невозможно с addContentView().
код: В MainActivity.java
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//CAMERA VIEW
setContentView(R.layout.activity_main);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
surfaceView = (SurfaceView)findViewById(R.id.surfaceview);
surfaceHolder = surfaceView.getHolder();
surfaceHolder.addCallback(this);
surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
ViewGroup rootView = (ViewGroup) findViewById(R.layout.activity_main);
LayoutInflater mLayoutInflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
//GRAPHICS VIEW
glSurfaceView = new GLSurfaceView(this);
glSurfaceView.setEGLConfigChooser(8, 8, 8, 8, 16, 0);
glSurfaceView.getHolder().setFormat(PixelFormat.TRANSLUCENT);
glSurfaceView.setRenderer(new GLRenderer());
//crash
//rootView.addView(glSurfaceView, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
//not crash
addContentView(glSurfaceView, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
glSurfaceView.setZOrderMediaOverlay(true);
//CONTROLS VIEW
View ctrlLayout = mLayoutInflater.inflate(R.layout.activity_controls, rootView);
//crash
//rootView.addView(ctrlLayout, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
//not crash
addContentView(ctrlLayout, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
ctrlLayout.bringToFront();
textView = (TextView)ctrlLayout.findViewById(R.id.text);
rtTextView = (TextView)ctrlLayout.findViewById(R.id.rt_text);
btnStart = (Button)ctrlLayout.findViewById(R.id.button1);
}
activity_main.в XML
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
tools:context=".MainActivity" >
<SurfaceView
android:id="@+id/surfaceview"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
</RelativeLayout>
activity_controls.в XML
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<TextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginBottom="14dp"
android:text="@string/hello_world" />
<TextView
android:id="@+id/rt_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:layout_marginRight="18dp"
android:layout_marginTop="14dp"
android:text="@string/str_rttext" />
<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignTop="@+id/rt_text"
android:layout_centerHorizontal="true"
android:text="@string/str_title"
android:textAppearance="?android:attr/textAppearanceLarge" />
<Button
android:id="@+id/button1"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:text="@string/btn_start" />
</RelativeLayout>
EDIT:
Я изменил свой код, как предложил FD_
ViewGroup rootView = mLayoutInflater.надуть (R. layout.activity_main, null); Теперь, когда я вызываю setContentView (rootView) в конце функции onCreate, он аварийно завершает работу.
вот logcat:
02-16 08:00:28.142: I/dalvikvm(2153): threadid=1: stack overflow on call to Landroid/view/View;.isLayoutDirectionInherited:Z
02-16 08:00:28.142: I/dalvikvm(2153): method requires 12+20+4=36 bytes, fp is 0xb02fe320 (32 left)
02-16 08:00:28.152: I/dalvikvm(2153): expanding stack end (0xb02fe300 to 0xb02fe000)
02-16 08:00:28.152: I/dalvikvm(2153): Shrank stack (to 0xb02fe300, curFrame is 0xb0303ec4)
02-16 08:00:28.152: D/AndroidRuntime(2153): Shutting down VM
02-16 08:00:28.152: W/dalvikvm(2153): threadid=1: thread exiting with uncaught exception (group=0xb1aeab90)
02-16 08:00:28.932: D/dalvikvm(2153): GC_FOR_ALLOC freed 117K, 6% free 3266K/3448K, paused 80ms, total 86ms
02-16 08:00:29.382: D/dalvikvm(2153): GC_FOR_ALLOC freed 356K, 11% free 3423K/3844K, paused 46ms, total 47ms
02-16 08:00:29.402: E/AndroidRuntime(2153): FATAL EXCEPTION: main
02-16 08:00:29.402: E/AndroidRuntime(2153): Process: com.example.previewcamera, PID: 2153
02-16 08:00:29.402: E/AndroidRuntime(2153): java.lang.StackOverflowError
02-16 08:00:29.402: E/AndroidRuntime(2153): at android.view.ViewGroup.resetResolvedLayoutDirection(ViewGroup.java:5713)
02-16 08:00:29.402: E/AndroidRuntime(2153): at android.view.ViewGroup.resetResolvedLayoutDirection(ViewGroup.java:5714)
02-16 08:00:29.402: E/AndroidRuntime(2153): at android.view.ViewGroup.resetResolvedLayoutDirection(ViewGroup.java:5714)
02-16 08:00:29.402: E/AndroidRuntime(2153): at android.view.ViewGroup.resetResolvedLayoutDirection(ViewGroup.java:5714)
02-16 08:00:29.402: E/AndroidRuntime(2153): at android.view.ViewGroup.resetResolvedLayoutDirection(ViewGroup.java:5714)
02-16 08:00:29.402: E/AndroidRuntime(2153): at android.view.ViewGroup.resetResolvedLayoutDirection(ViewGroup.java:5714)
02-16 08:00:29.402: E/AndroidRuntime(2153): at android.view.ViewGroup.resetResolvedLayoutDirection(ViewGroup.java:5714)
02-16 08:00:29.402: E/AndroidRuntime(2153): at android.view.ViewGroup.resetResolvedLayoutDirection(ViewGroup.java:5714)
02-16 08:00:29.402: E/AndroidRuntime(2153): at android.view.ViewGroup.resetResolvedLayoutDirection(ViewGroup.java:5714)
02-16 08:00:29.402: E/AndroidRuntime(2153): at android.view.ViewGroup.resetResolvedLayoutDirection(ViewGroup.java:5714)
02-16 08:00:29.402: E/AndroidRuntime(2153): at android.view.ViewGroup.resetResolvedLayoutDirection(ViewGroup.java:5714)
02-16 08:00:29.402: E/AndroidRuntime(2153): at android.view.ViewGroup.resetResolvedLayoutDirection(ViewGroup.java:5714)
02-16 08:00:29.402: E/AndroidRuntime(2153): at android.view.ViewGroup.resetResolvedLayoutDirection(ViewGroup.java:5714)
02-16 08:00:29.402: E/AndroidRuntime(2153): at android.view.ViewGroup.resetResolvedLayoutDirection(ViewGroup.java:5714)
02-16 08:00:29.402: E/AndroidRuntime(2153): at android.view.ViewGroup.resetResolvedLayoutDirection(ViewGroup.java:5714)
02-16 08:00:29.402: E/AndroidRuntime(2153): at android.view.ViewGroup.resetResolvedLayoutDirection(ViewGroup.java:5714)
02-16 08:00:29.402: E/AndroidRuntime(2153): at android.view.ViewGroup.resetResolvedLayoutDirection(ViewGroup.java:5714)
02-16 08:00:29.402: E/AndroidRuntime(2153): at android.view.ViewGroup.resetResolvedLayoutDirection(ViewGroup.java:5714)
02-16 08:00:29.402: E/AndroidRuntime(2153): at android.view.ViewGroup.resetResolvedLayoutDirection(ViewGroup.java:5714)
02-16 08:00:29.402: E/AndroidRuntime(2153): at android.view.ViewGroup.resetResolvedLayoutDirection(ViewGroup.java:5714)
02-16 08:00:29.402: E/AndroidRuntime(2153): at android.view.ViewGroup.resetResolvedLayoutDirection(ViewGroup.java:5714)
02-16 08:00:29.402: E/AndroidRuntime(2153): at android.view.ViewGroup.resetResolvedLayoutDirection(ViewGroup.java:5714)
02-16 08:00:29.402: E/AndroidRuntime(2153): at android.view.ViewGroup.resetResolvedLayoutDirection(ViewGroup.java:5714)
02-16 08:00:29.402: E/AndroidRuntime(2153): at android.view.ViewGroup.resetResolvedLayoutDirection(ViewGroup.java:5714)
02-16 08:00:29.402: E/AndroidRuntime(2153): at android.view.ViewGroup.resetResolvedLayoutDirection(ViewGroup.java:5714)
02-16 08:00:29.402: E/AndroidRuntime(2153): at android.view.ViewGroup.resetResolvedLayoutDirection(ViewGroup.java:5714)
02-16 08:00:29.402: E/AndroidRuntime(2153): at android.view.ViewGroup.resetResolvedLayoutDirection(ViewGroup.java:5714)
02-16 08:00:29.402: E/AndroidRuntime(2153): at android.view.ViewGroup.resetResolvedLayoutDirection(ViewGroup.java:5714)
02-16 08:00:29.402: E/AndroidRuntime(2153): at android.view.ViewGroup.resetResolvedLayoutDirection(ViewGroup.java:5714)
02-16 08:00:29.402: E/AndroidRuntime(2153): at android.view.ViewGroup.resetResolvedLayoutDirection(ViewGroup.java:5714)
02-16 08:00:29.402: E/AndroidRuntime(2153): at android.view.ViewGroup.resetResolvedLayoutDirection(ViewGroup.java:5714)
02-16 08:00:29.402: E/AndroidRuntime(2153): at android.view.ViewGroup.resetResolvedLayoutDirection(ViewGroup.java:5714)
02-16 08:00:29.402: E/AndroidRuntime(2153): at android.view.ViewGroup.resetResolvedLayoutDirection(ViewGroup.java:5714)
02-16 08:00:29.402: E/AndroidRuntime(2153): at android.view.ViewGroup.resetResolvedLayoutDirection(ViewGroup.java:5714)
02-16 08:00:29.402: E/AndroidRuntime(2153): at android.view.ViewGroup.resetResolvedLayoutDirection(ViewGroup.java:5714)
02-16 08:00:29.402: E/AndroidRuntime(2153): at android.view.ViewGroup.resetResolvedLayoutDirection(ViewGroup.java:5714)
02-16 08:00:29.402: E/AndroidRuntime(2153): at android.view.ViewGroup.resetResolvedLayoutDirection(ViewGroup.java:5714)
02-16 08:00:29.402: E/AndroidRuntime(2153): at android.view.ViewGroup.resetResolvedLayoutDirection(ViewGroup.java:5714)
02-16 08:00:29.402: E/AndroidRuntime(2153): at android.view.ViewGroup.resetResolvedLayoutDirection(ViewGroup.java:5714)
02-16 08:00:29.402: E/AndroidRuntime(2153): at android.view.ViewGroup.resetResolvedLayoutDirection(ViewGroup.java:5714)
02-16 08:00:29.402: E/AndroidRuntime(2153): at android.view.ViewGroup.resetResolvedLayoutDirection(ViewGroup.java:5714)
02-16 08:00:29.402: E/AndroidRuntime(2153): at android.view.ViewGroup.resetResolvedLayoutDirection(ViewGroup.java:5714)
02-16 08:00:29.402: E/AndroidRuntime(2153): at android.view.ViewGroup.resetResolvedLayoutDirection(ViewGroup.java:5714)
02-16 08:00:29.402: E/AndroidRuntime(2153): at android.view.ViewGroup.resetResolvedLayoutDirection(ViewGroup.java:5714)
02-16 08:00:29.402: E/AndroidRuntime(2153): at android.view.ViewGroup.resetResolvedLayoutDirection(ViewGroup.java:5714)
02-16 08:00:29.402: E/AndroidRuntime(2153): at android.view.ViewGroup.resetResolvedLayoutDirection(ViewGroup.java:5714)
02-16 08:00:29.402: E/AndroidRuntime(2153): at android.view.ViewGroup.resetResolvedLayoutDirection(ViewGroup.java:5714)
02-16 08:00:29.402: E/AndroidRuntime(2153): at android.view.ViewGroup.resetResolvedLayoutDirection(ViewGroup.java:5714)
02-16 08:00:29.402: E/AndroidRuntime(2153): at android.view.ViewGroup.resetResolvedLayoutDirection(ViewGroup.java:5714)
02-16 08:00:29.402: E/AndroidRuntime(2153): at android.view.ViewGroup.resetResolvedLayoutDirection(ViewGroup.java:5714)
02-16 08:00:29.402: E/AndroidRuntime(2153): at android.view.ViewGroup.resetResolvedLayoutDirection(ViewGroup.java:5714)
02-16 08:00:29.402: E/AndroidRuntime(2153): at android.view.ViewGroup.resetRes
02-16 08:00:29.632: D/dalvikvm(2153): GC_FOR_ALLOC freed 548K, 16% free 3386K/4000K, paused 54ms, total 55ms
3 ответов
нужно позвонить setContentView()
прежде чем вы можете использовать findViewById()
в своем Activity
. Кроме того, findViewById()
возвращает представления, включенные в представление содержимого и идентифицированные с помощью id значение передается в качестве аргумента, поэтому передача ресурса макета никогда не будет работать.
другой вариант-раздуть представление самостоятельно, используя LayoutInflater
:
LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
ViewGroup rootView = inflater.inflate(R.layout.main, null);
для других, которые в конечном итоге здесь пытаемся отследить эту ошибку, используя пользовательские представления, дважды проверьте, что вы правильно надувать. Следующее изменение решило мои проблемы.
ошибка:
View view = inflate(getContext(), R.layout.foo, this);
addView(view);
работает:
View view = inflate(getContext(), R.layout.foo, null);
addView(view);
у меня была такая же проблема при использовании attachToRoot = true
final View submitButton = LayoutInflater.from(this).inflate
(R.layout.view_button_simple, rootView, true);
мне пришлось изменить его на
final View submitButton = LayoutInflater.from(this).inflate
(R.layout.view_button_simple, rootView, false);