20

私はAndroidアプリケーションを開発しています。アプリケーションのすべてのアクティビティの上に描画されるビューをコードで 1 つ追加できるようにしたいと考えています。

ウィンドウマネージャーに追加しようとしました:

LayoutInflater inflater = activity.getLayoutInflater();
layout = inflater.inflate(R.layout.toast_layout, null);

WindowManager.LayoutParams params = new WindowManager.LayoutParams();
params.gravity = Gravity.BOTTOM;
params.height = WindowManager.LayoutParams.WRAP_CONTENT;
params.width = WindowManager.LayoutParams.WRAP_CONTENT;
params.type = WindowManager.LayoutParams.TYPE_TOAST;
final WindowManager mWindowManager = (WindowManager);
activity.getApplicationContext().getSystemService(Context.WINDOW_SERVICE);
                mWindowManager.addView(layout, params);

ただし、このように追加すると、次の 2 つの問題に直面します。

1.アプリを終了してもレイアウトが表示されたままです。

2.レイアウトが Click イベントに応答しません。

これを達成する別の解決策はありますか?

ありがとう。

4

3 に答える 3

7

1) Activity を拡張する BaseActivity を作成します。

2) すべてのアクティビティは、Activity ではなく BaseActivity を拡張する必要があります。

3) setContentView() メソッドをオーバーライドします。

4) このメソッドで空白の垂直 linearLayout を作成します。

5) このレイアウトに topView を追加します

6) そして、この線形レイアウトに膨張したビューを追加します

7) 最後に、super.setContentView(passLinearLayoutHere) を呼び出します。

これを実装する方法は?

import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.LinearLayout;

public class BaseActivity extends Activity {

    @Override
    public void setContentView(int resId) {

        LinearLayout screenRootView = new LinearLayout(this);
        screenRootView.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,
                LinearLayout.LayoutParams.MATCH_PARENT));
        screenRootView.setOrientation(LinearLayout.VERTICAL);

        // Create your top view here
        View topView = new View(this); // Replace this topview with your view 

        LayoutInflater inflater = (LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        View screenView = inflater.inflate(resId, null);
        topView.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {
                           //You will get onclick here of your topview in whatever screen it is clicked
            }
        });

        screenRootView.addView(topView);
        screenRootView.addView(screenView);

        super.setContentView(screenRootView);
    }

}
于 2013-11-14T12:07:30.820 に答える
7

LayoutParamstype を からTYPE_TOASTに変更しTYPE_APPLICATION、私が提案した以前のフラグを削除します。

アプリのすべてのアクティビティに対して1 つ作成BaseActivityし、そのアクティビティでonResume()このビューを に追加WindowManageronPause()、そのビューを次のように削除します。

  windowManager.removeView(view);
于 2013-11-14T11:46:53.333 に答える
5

ビューの表示/ビューを管理するために、Gopal によって提案されたソリューションを使用しました。アプリケーションを終了するときにビューが非表示になるように、onStop および onResume イベントをアタッチしました。

クリック イベントについては、トースト タイプがクリック イベントに応答しないことに気付きました。なので型を変えました

params.type = WindowManager.LayoutParams.TYPE_TOAST;

params.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;

次の許可も追加する必要があります。

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
于 2013-11-19T12:01:37.423 に答える