пятница, 18 ноября 2011 г.

Две активности на экране в одно и то же время

Source code
English translation

Возможно вы видели, что некоторые приложения, такие как winamp, Gimp и так далее имеют несколко раздельных окон. Мне было интересно, возможно ли такое же сделать на Android. Конечно, это можно сделать с использованием лэйаутов и прозрачных тем. Но мы не ищем легких путей.

Сначала определим стили:

<style name="Theme.Transparent" parent="android:Theme">
        <item name="android:windowIsTranslucent">true</item>
        <item name="android:windowContentOverlay">@null</item>
        <item name="android:windowBackground">@android:color/transparent</item>
        <item name="android:windowNoTitle">true</item>
        <item name="android:backgroundDimEnabled">false</item>
    </style>

    <style name="Theme.Transparent.Floating">
        <item name="android:windowIsFloating">true</item>
    </style>

"Theme.Transparent" стиль, наподобие того, что бы использован для заставки, но без "windowIsFloating". Благодаря этому первая "activity" заполняет весь экран. Для второй "activity": "Theme.Transparent.Floating". Т.о. вторая не заполнит весь экран и прикосновения к экрану будут доступны первой. Но нет. По умолчанию активности модальны. И прикосновения не будут доступны. Небольшие изменения:

getWindow().setFlags(
       WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL,
       WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL);
   

Теперь мы видим экран устройства, две активности и первая из них доступна для прикосновений.
Есть еще одна вещь - взаимодействие между ними. При обычном раскладе мы используем
startActivityForResult. Но в нашем случае это непременимо. Простейший путь - использовать ресивер:

mReceiver = new BroadcastReceiver() {

   @Override
   public void onReceive(Context context, Intent intent) {
    
         // The first activity wants to close this one
         String operation = intent.getStringExtra("operation");
         if(operation.equals("hide"))
           finish();
    
         }

   };



В результате:




Возможно для чего-нибудь будет полезно.


Комментариев нет:

Отправить комментарий