2015-06-26 13 views
16

Próbowałem porady here, porady here, porady here, I've commented out onAttachedToWindow() w mojej działalności podstawowej. Mam dwie Aktywności dziedziczące z tej klasy, BaseActivity. Jeden biegnie, a drugi nie. Jaka może być różnica? Mój docelowy pakiet SDK to 19; zmiana na 12 nie robi różnicy. Oto moja onCreate dla BaseActivity:IllegalArgumentException: Typ okna nie może być zmieniony po dodaniu okna

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 
    this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD); 
    requestWindowFeature(Window.FEATURE_NO_TITLE); 
    super.onAttachedToWindow(); 
    super.onCreate(savedInstanceState); 

    .... 
    } 

Kiedy przechodząc do drugiej działalności, wchodząc przez kod, to sprawia, że ​​przez onCreate(), onResume(), a następnie rozbija.

Co może być problemem?

StackTrace:

06-26 13:41:57.963 28667-28667/com.assistek.ediary E/AndroidRuntime﹕ FATAL EXCEPTION: main 
Process: com.assistek.ediary, PID: 28667 
java.lang.IllegalArgumentException: Window type can not be changed after the window is added. 
     at android.os.Parcel.readException(Parcel.java:1550) 
     at android.os.Parcel.readException(Parcel.java:1499) 
     at android.view.IWindowSession$Stub$Proxy.relayout(IWindowSession.java:903) 
     at android.view.ViewRootImpl.relayoutWindow(ViewRootImpl.java:5301) 
     at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1507) 
     at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1061) 
     at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5885) 
     at android.view.Choreographer$CallbackRecord.run(Choreographer.java:767) 
     at android.view.Choreographer.doCallbacks(Choreographer.java:580) 
     at android.view.Choreographer.doFrame(Choreographer.java:550) 
     at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:753) 
     at android.os.Handler.handleCallback(Handler.java:739) 
     at android.os.Handler.dispatchMessage(Handler.java:95) 
     at android.os.Looper.loop(Looper.java:135) 
     at android.app.ActivityThread.main(ActivityThread.java:5254) 
     at java.lang.reflect.Method.invoke(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:372) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 

EDIT: jeśli zmienię kierować API 12 i umieścić wszystkie zmiany z onCreate w onAttachedToWindow, mogę dostać ten wyjątek odejść, ale chciałbym SDK cel będzie 19.

Moja nowy onCreate():

@Override 
protected void onCreate(Bundle savedInstanceState) { 

    requestWindowFeature(Window.FEATURE_NO_TITLE); 
    super.onCreate(savedInstanceState); 
... 
} 

My nowy onAttachedToWindow():

@Override 
public void onAttachedToWindow() { 
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 
    this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD); 
    super.onAttachedToWindow(); 
} 

Zadziała tylko z docelowym API 12.

Odpowiedź Min target must be less than 14 when WindowManager.LayoutParams.TYPE_KEYGUARD used

+0

spróbować to dla API 19: https://developer.android.com/training/system-ui/immersive.html –

+3

Nie wywołuj metody 'super.onAttachedToWindow()' w żadnym innym miejscu niż z twojego override 'onAttachedToWindow()', jeśli taki posiadasz. Chociaż nie mogę mówić do 'TYPE_KEYGUARD', reszta tego kodu powinna być po' super.onCreate() ', ale przed jakimkolwiek wywołaniem' setContentView() '. Poza tym zobacz, czy masz coś interesującego w swoim manifeście, które może wyjaśnić różnicę między twoimi dwoma działaniami. – CommonsWare

+0

Jedyna rzecz, która różni się między tymi dwoma działaniami to: android: clearTaskOnLaunch = "true" –

Odpowiedz

5

spróbuje użyć tego za oknem:

requestWindowFeature(Window.FEATURE_NO_TITLE); 
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
        WindowManager.LayoutParams.FLAG_FULLSCREEN); 
setContentView(R.layout.activity_adjectives); 
+0

Tak jak w przypadku innej odpowiedzi, a to nie zadziałało. –

+2

To prawdopodobnie będzie odpowiedź, która zostanie nagrodzona nagrodą, ale ta odpowiedź NIE DZIAŁA. –

1

Wpadam w th to samo pytanie. Ale po zaprzestaniu dodawania

getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 
getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD); 
requestWindowFeature(Window.FEATURE_NO_TITLE); 

przed super.onCreate(savedInstanceState); z BaseActivity, to działa dobrze. Przecinam i wklejam powyższe kody przed super.onCreate(savedInstanceState); zstępów BaseActivity.

BTW, nie sądzę, że trzeba zadzwonić pod numer super.onAttachedToWindow(); w metodach koła życia Activity. Ponieważ onAttachedToWindow(); jest wywoływane, gdy widok jest dołączony do okna podczas nadpisywania wartości View.

+0

To nie działało. –

+0

getWindow(). SetType (WindowManager.LayoutParams.TYPE_KEYGUARD); TYPE_KEYGUARD jest przestarzałe. –

1

Miałem również ten problem, ale rozwiązałem go, usuwając okno, zmieniając parametry, a następnie ponownie dodając okno. To było dla mnie wystarczająco dobre.

WindowManager.removeView(View); params = params2; //changed the params to something else WindowManager.updateViewLayout(View, params); WindowManager.addView(View, params);

0

Przepraszamy za opóźnienie w odpowiedzi. Należy dodać:

requestWindowFeature(Window.FEATURE_NO_TITLE); 
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
WindowManager.LayoutParams.FLAG_FULLSCREEN); 

w onCreate metody jeśli używasz poziom API 15 lub powyżej. Mi to pasuje.

0

Usuń

this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG|WindowManager.LayoutParams.FLAG_FULLSCREEN); 

ze swojego onAttachedToWindow(), tak:

@Override 
    public void onAttachedToWindow() { 
     //this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG|WindowManager.LayoutParams.FLAG_FULLSCREEN); 

      super.onAttachedToWindow(); 
    } 
Powiązane problemy