2015-12-15 23 views
8

Tôi đang cố gắng ngăn chặn mở rộng thanh trạng thái và tôi đã sử dụng một số ví dụ mà mọi người đang cố gắng ghi đè nút trang chủ. Tất cả các giải pháp đều hướng đến việc sử dụng WindowManager.LayoutParams.TYPE_KEYGUARD, tôi đọc here, rằng nếu TYPE_KEYGUARD được sử dụng, mục tiêu tối thiểu phải nhỏ hơn 14. TYPE_KEYGUARD không được chấp nhận, vì vậy tôi cũng sẽ cần một công việc để thực hiện việc này. Nó hoàn toàn bị xóa khỏi SDK 21.Mục tiêu tối thiểu phải nhỏ hơn 14 khi WindowManager.LayoutParams.TYPE_KEYGUARD sử dụng

CÂU HỎI: Giải pháp thay thế để tôi có thể ghi đè thanh trạng thái và giữ mục tiêu là 19 là gì?

tôi có một dự án thiết lập cho xây dựng như thế này:

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' 
     } 
    } 
} 

Tôi đã thử những lời khuyên here vô ích. Tôi muốn targetSdkVersion là 19, nhưng nếu tôi thay đổi nó thành 19, tôi nhận được 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) 

My onCreate:

@Override 
protected void onCreate(Bundle savedInstanceState) { 

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

My 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); 
    } 
    } 

Và mã có thể ngăn chặn sự bành trướng trên thanh trạng thái (chuyển thể từ this post):

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

Hãy thử bài này: https://stackoverflow.com/ câu hỏi/19920052/vô hiệu hóa-thông báo-panel-từ-được-kéo xuống – DH28

Trả lời

6

Cập nhật onAttachedToWindow như hình dưới đây và thử

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

và thêm bản cập nhật onCreate với

@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); 
    ... 
} 

Đối Api trên 14 sử dụng

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

Cảm ơn câu trả lời của bạn. Tôi sẽ thử nó! –

+0

Dịch vụ có giải quyết được sự cố của bạn không? – SachinS

+0

Vẫn nhận được ngoại lệ IllegalArgument. Nó hoạt động một lúc, rồi đột nhiên ngừng hoạt động. –

Các vấn đề liên quan