2015-12-15 7 views
8

Ich versuche, Statusleiste Expansion zu verhindern, und ich habe einige Beispiele verwendet, wo Menschen versuchen, die Home-Schaltfläche zu überschreiben. Alle Lösungen verweisen auf die Verwendung WindowManager.LayoutParams.TYPE_KEYGUARD, ich lese here, dass, wenn der TYPE_KEYGUARD verwendet wird, das Minimum Ziel weniger als 14 sein muss. TYPE_KEYGUARD ist veraltet, so dass ich auch eine Arbeit dafür benötigen wird. Es ist vollständig aus dem SDK 21 entfernt.Min target muss kleiner als 14 sein, wenn WindowManager.LayoutParams.TYPE_KEYGUARD verwendet

FRAGE: Was ist eine Problemumgehung, damit ich die Statusleiste überschreiben und die Zielerstellung auf 19 bleiben kann?

Ich habe ein Projekt für Build wie folgt aufgebaut:

android { 
    compileSdkVersion 17 
    buildToolsVersion "21.1.2" 

    defaultConfig { 
     applicationId "com.mycompany.ediary" 
     minSdkVersion 12 
     targetSdkVersion 12 
    } 

    buildTypes { 
     release { 
     minifyEnabled false 
     proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' 
     } 
    } 
} 

ich den Rat habe versucht here ohne Erfolg. Ich möchte, dass targetSdkVersion 19 ist, aber wenn ich es in 19 ändere, bekomme ich die IllegalArgumentException. Stacktrace:

11-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) 

Mein onCreate:

@Override 
protected void onCreate(Bundle savedInstanceState) { 

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

Mein onAttachedToWindow:

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

    if (!GlobalVars.testing) { 
     GlobalVars.preventStatusBarExpansion(this); 
    } 
    } 

Und der Code, der Statusleiste Expansion (angepasst von this post) verhindert:

public static void preventStatusBarExpansion(Context context) { 
    WindowManager manager = ((WindowManager) context.getApplicationContext() 
      .getSystemService(Context.WINDOW_SERVICE)); 

    WindowManager.LayoutParams localLayoutParams = new WindowManager.LayoutParams(); 
    localLayoutParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ERROR; 
    localLayoutParams.gravity = Gravity.TOP; 
    localLayoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE| 

      // this is to enable the notification to recieve touch events 
      WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | 

      // Draws over status bar 
      WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN; 

    localLayoutParams.width = WindowManager.LayoutParams.MATCH_PARENT; 
    localLayoutParams.height = (int) (50 * context.getResources() 
      .getDisplayMetrics().scaledDensity); 
    localLayoutParams.format = PixelFormat.TRANSPARENT; 

    customViewGroup view = new customViewGroup(context); 

    manager.addView(view, localLayoutParams); 
} 

public static class customViewGroup extends ViewGroup { 

    public customViewGroup(Context context) { 
     super(context); 
    } 

    @Override 
    protected void onLayout(boolean changed, int l, int t, int r, int b) { 
    } 

    @Override 
    public boolean onInterceptTouchEvent(MotionEvent ev) { 
     Log.v("customViewGroup", "**********Intercepted"); 
     return true; 
    } 
} 
+1

diesen Beitrag Versuchen: https://stackoverflow.com/ Fragen/19920052/disable-the-notice-panel-from-down-down-down – DH28

Antwort

6

aktualisieren onAttachedToWindow wie unten gezeigt und versuchen Update

@Override 
public void onAttachedToWindow() { 
    if (!GlobalVars.testing) { 
     GlobalVars.preventStatusBarExpansion(this); 
    } 
    super.onAttachedToWindow(); 
} 

und fügen oncreate mit

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

Für Api über 14 Verwendung

this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG); 
+0

Vielen Dank für Ihre Antwort. Ich werde es versuchen! –

+0

Ist Ihr Problem gelöst? – SachinS

+0

Immer noch IllegalArgument Ausnahme. Es funktionierte für eine Weile, dann hörte plötzlich auf zu arbeiten. –

Verwandte Themen