使用TYPE_SYSTEM_ALERT覆盖按钮可防止出现对话框

时间:2015-03-20 18:42:47

标签: android

当用户需要知道重要事项时,我会在所有活动的角落添加一个通知图标。我有它工作,除了它阻止微调器,对话框和EditText工作。旋转器似乎工作,除了你看不到它们,就像你触摸它,然后再次触摸,选择一个选项,但不会出现微调器对话框。

其他活动扩展的基本活动:

public abstract class LoggedInActivity
        extends GaugesActivity
{
    private static final String TAG = "LoggedInActivity";

    private WindowManager wm;
    private boolean overlayCreated = false;
    private LinearLayout mOverlay;
    private ImageView mOverlayImageView;

    @Override
    protected void onResume(){
        super.onResume();
        wm = (WindowManager) getSystemService(WINDOW_SERVICE);
        SharedPreferences prefs = getSharedPreferences(PREFS_NAME, MODE_PRIVATE);
        String duplicateTruckGuid = prefs.getString("duplicateTruckGuid", "");
        if (! duplicateTruckGuid.isEmpty()){
            createOverlay();
        }
    }

    protected void createOverlay(){
        if (overlayCreated) return;

        // Create System overlay
        WindowManager.LayoutParams params = new WindowManager.LayoutParams(
                WindowManager.LayoutParams.WRAP_CONTENT,WindowManager.LayoutParams.WRAP_CONTENT,
                WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,  // WindowManager.LayoutParams.TYPE_APPLICATION_PANEL,
                WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
                        | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL,
                PixelFormat.TRANSLUCENT);
        params.gravity = Gravity.RIGHT | Gravity.BOTTOM;
        params.token = getWindow().getDecorView().getRootView().getWindowToken();

        LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
        mOverlay = (LinearLayout) inflater.inflate(R.layout.overlay_notification, null);
//        mOverlayImageView = (ImageView) mOverlay.findViewById(R.id.overlay_notification_image);

        try {
            wm.addView(mOverlay, params);

            final Context context = this;

            mOverlay.setOnTouchListener(new View.OnTouchListener() {
                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    Intent intent = new Intent(context, NotificationsActivity.class);
                    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                    startActivity(intent);
                    return true;
                }
            });
        }
        catch (Exception e){
            Log.e(TAG, e.toString());
            Log.i(TAG, e.toString());
            Toast.makeText(this, e.toString(), Toast.LENGTH_SHORT).show();
        }
    }

overlay_notification.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:gravity="bottom"
    android:background="@drawable/black_transparent_overlay">

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/overlay_notification_image"
        android:src="@drawable/ic_warning_active"
        android:layout_margin="@dimen/normal_padding"/>
</LinearLayout>

1 个答案:

答案 0 :(得分:1)

您可以使用TYPE_SYSTEM_ERROR代替TYPE_SYSTEM_ALERT

此外,FLAG_NOT_TOUCH_MODAL已隐式设置FLAG_NOT_FOCUSABLE,因此您无需手动添加。{/ p>

但是,我建议您考虑CommonsWare指出的替代方案。