2015-05-15 2 views
1

Есть ли способ, чтобы на андроиде сохранить строку состояния, отключив все взаимодействие, которое вы можете сделать с ним, например, потянув его вниз? Я хочу сохранить информацию, которую предоставляет этот бар, но я не хочу, чтобы пользователи взаимодействовали с ней.Android отключить взаимодействие строки состояния

+0

В строке состояния вы имеете в виду черную полосу на самом верху, которая содержит время, батарею и т. Д.? –

+1

Да, этот. Разве это не правильное имя? – Laetan

+0

Возможно, я просто хотел быть ясным, прежде чем набрал что-то. –

ответ

1

Это метод, который мне нравится использовать. Вы можете развернуть его из метода и поместить его внутри базовой операции. iirc, я тоже получил это от StackOverflow, но я этого не заметил, поэтому я не уверен, где находится исходный пост.

В основном это то, что накладывается прозрачная надпись поверх верхней панели, которая перехватывает все события касания. До сих пор это работало хорошо, посмотрите, как это работает для вас.

вам может понадобиться поставить эту строку в AndroidManifest:

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> 

я его в моем проекте, но я не могу вспомнить, если это из-за этого или что-то другое. Если вы получаете ошибку разрешения, добавить, что в.

WindowManager manager; 
CustomViewGroup lockView; 

public void lock(Activity activity) { 

    //lock top notification bar 
    manager = ((WindowManager) activity.getApplicationContext() 
      .getSystemService(Context.WINDOW_SERVICE)); 

    WindowManager.LayoutParams topBlockParams = new WindowManager.LayoutParams(); 
    topBlockParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ERROR; 
    topBlockParams.gravity = Gravity.TOP; 
    topBlockParams.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; 
    topBlockParams.width = WindowManager.LayoutParams.MATCH_PARENT; 
    topBlockParams.height = (int) (50 * activity.getResources() 
      .getDisplayMetrics().scaledDensity); 
    topBlockParams.format = PixelFormat.TRANSPARENT; 

    lockView = new CustomViewGroup(activity); 
    manager.addView(lockView, topBlockParams); 
} 

и CustomViewGroup является

private class CustomViewGroup extends ViewGroup { 
    Context context; 

    public CustomViewGroup(Context context) { 
     super(context); 
     this.context = context; 
    } 

    @Override 
    protected void onLayout(boolean changed, int l, int t, int r, int b) { 
    } 
    @Override 
    public boolean onInterceptTouchEvent(MotionEvent ev) { 
     Log.i("StatusBarBlocker", "intercepted by "+ this.toString()); 
     return true; 
    } 
} 

Также! Вы также должны удалить это представление, когда ваша активность закончится, потому что я думаю, что он продолжит блокировать экран даже после того, как вы убьете приложение. Всегда, всегда ВСЕГДА вызывайте это onPause и onDestroy.

if (lockView!=null) { 
     if (lockView.isShown()) { 
      //unlock top 
      manager.removeView(lockView); 
     } 
    } 
+0

У меня есть идея. Мой взгляд aleady использует LAYOUT_IN_SCREEN по какой-то непонятной причине, поэтому мне просто нужно добавить прозрачную строку в верхней части экрана. Является ли высота 50 одинаковой для всех устройств? – Laetan

+0

Высота изменяется от разрешения устройства, manufecturer также .. поэтому он не одинаковый для всех устройств – Kushal

+0

Есть ли способ получить размер этого бара во время выполнения? – Laetan

Смежные вопросы