2014-02-15 7 views
6

Im a noob at android. Мое приложение продолжает сбой, когда я использую метод AddGroup(), но работает, когда я использую метод Activity AddContentView().Мое приложение вылетает при использовании addView()

Причина, по которой я хочу использовать 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.inflate (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 

ответ

11

Вы должны позвонить setContentView(), прежде чем вы можете использовать findViewById() в вашем Activity. Кроме того, findViewById() возвращает представления, которые включены в представление содержимого и идентифицируются значением id, переданным в качестве аргумента, поэтому передача ресурса макета никогда не будет работать.

Другой вариант заключается в раздуть View самостоятельно, используя LayoutInflater:

LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE); 
ViewGroup rootView = inflater.inflate(R.layout.main, null); 
+0

Это сделало работу. Мое приложение больше не сбой, но теперь addView() ничего не отображает. Какие-либо предложения? –

+0

И я уже пытался изменить параметры макета glSurfaceView и ctrlView на WRAP_CONTENT, но все еще не работает. –

+0

Если вы используете подход выше (LayoutInflater), вам нужно позвонить setContentView (rootView); в конце onCreate. –

12

Для других, которые в конечном итоге здесь пытаются отследить эту ошибку, используя пользовательские представления, дважды проверьте, что вы раздувания правильно. Следующее изменение изменило мои проблемы.

Ошибка:

View view = inflate(getContext(), R.layout.foo, this); 
addView(view); 

работает отлично:

View view = inflate(getContext(), R.layout.foo, null); 
addView(view); 
+0

* лицоpalm * - спасибо. –

1

У меня была такая же проблема при использовании attachToRoot = истинный

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); 
Смежные вопросы