9

どのアプリの上でも開くことができるアクティビティを作りたいです。

通常、アクティビティがダイアログとして設定されている場合でも、アプリに切り替えるとアプリが表示され、バックグラウンドでランチャーが表示されます。

しかし、私はアプリがこのようなアプリよりも上に行くことを望んでいます:(フォトショップで作られました):

この質問は、システムオーバーレイウィンドウの作成(常に上部)を見ましたが、ICSではレイアウトに機能がありません。さらに、他のアプリを最小化せずに、自分のアプリからダイアログボックスを表示したい...

4

2 に答える 2

23

airbrowser、LilyPad、Stick it、AirTerm、Smart Taskbar、aircalcなどすべての上にフローティングビューを表示するアプリはたくさんあります...

とにかく、この機能を実現するには、「android.permission.SYSTEM_ALERT_WINDOW」という特別な権限が必要であり、次のようなものを使用する必要があります。

final WindowManager.LayoutParams param=new WindowManager.LayoutParams();
param.flags=WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
final View view=findViewById(R.id.my_floating_view);
final ViewGroup parent=(ViewGroup)view.getParent();
if(parent!=null)
  parent.removeView(view);
param.format=PixelFormat.RGBA_8888;
param.type=WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;
param.gravity=Gravity.TOP|Gravity.LEFT;
param.width=parent!=null?LayoutParams.WRAP_CONTENT:view.getLayoutParams().width;
param.height=parent!=null?LayoutParams.WRAP_CONTENT:view.getLayoutParams().height;
final WindowManager wmgr=(WindowManager)getApplicationContext().getSystemService(Context.WINDOW_SERVICE);
wmgr.addView(view,param);
// TODO handle overlapping title bar and/or action bar
// TODO you must add logic to remove the view
// TODO you must use a special permission to use this method :android.permission.SYSTEM_ALERT_WINDOW
// TODO if you wish to let the view stay when leaving the app, make sure you have a foreground service running.
于 2012-04-22T11:00:56.823 に答える
10

私はTooleapSDKの開発者の一人であり、この問題にも対処しました。SYSTEM_ALERT_WINDOW基本的に、アクティビティを別のアクティビティの上に表示するためにを使用する必要はありません。背景を透明にして、通常の「縮小」アクティビティを表示するだけです。

「縮小されたアクティビティ」を作成するには、高さと幅のアクティビティウィンドウレイアウトパラメータを変更します。

WindowManager.LayoutParams params = getWindow().getAttributes(); 
params.x = ...;
params.y = ...;
params.width = ...;
params.height = ...;

this.getWindow().setAttributes(params);

透明な背景を作成するには、マニフェストファイルのアクティビティ定義に追加します。

android:theme="@android:style/Theme.Translucent"

このようにして、フローティングアクティビティのような錯覚を作り出すことができます。

フォアグラウンドアクティビティのみが再開され、バックグラウンドアクティビティは一時停止されることに注意してください。しかし、ほとんどのアプリでは、これは問題にはならないはずです。

残っているのは、フローティングアクティビティをいつ起動するかだけです。

これは、通常のアクティビティを使用する「フローティング」電卓アプリの例です。電卓の下のアクティビティは別のアプリに属していることに注意してください。

TooleapCalculatorスクリーンショット

于 2014-05-08T10:04:18.717 に答える