窗口管理器没有在顶部显示窗口

时间:2014-12-30 06:38:29

标签: android android-windowmanager

在Android应用程序中,我必须显示一个内部通知,该通知位于我的应用程序的每个屏幕的顶部。我使用过WindowManager。但它似乎没有按预期工作。有时我会看到第一个通知,但第二个通知虽然在调试时没有显示,但是可以看到以下方法的逐步执行。无法弄清楚为什么会这样。帮助!

    public void addNotification(String message, Bundle bundle) {
    windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
    WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
            WindowManager.LayoutParams.WRAP_CONTENT,
            WindowManager.LayoutParams.WRAP_CONTENT,
            WindowManager.LayoutParams.TYPE_PHONE,
            WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
            PixelFormat.TRANSLUCENT);

    lp.gravity = Gravity.END | Gravity.BOTTOM;

    lp.x = getResources().getInteger(R.integer.notification_side_margin);
    lp.y = getResources().getInteger(R.integer.notification_side_margin);

    // Initialise container view first in which every notification is to be
    // added.
    if (notificationConatinerView == null) {

        notificationConatinerView = getLayoutInflater().inflate(
                R.layout.custom_notification_main_layout, null);

        notificationContainer = (LinearLayout) notificationConatinerView
                .findViewById(R.id.notification_container);
        notificationContainer.setPadding(
                (int) getResources().getDimension(R.dimen.mini_margin),
                (int) getResources().getDimension(R.dimen.mini_margin),
                (int) getResources().getDimension(R.dimen.mini_margin),
                (int) getResources().getDimension(R.dimen.mini_margin));
        windowManager.addView(notificationConatinerView, lp);

        // Add that container to the window manager
        windowManager.updateViewLayout(notificationConatinerView, lp);
    }

    final View view = getLayoutInflater().inflate(
            R.layout.notification_custom, null);
    view.setTag(bundle);
    view.setId(notificationContainer.getChildCount());
    view.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            Bundle bundle = (Bundle) v.getTag();
            setClickForNotifications(bundle);
        }
    });
    final ImageView crossImage = (ImageView) view
            .findViewById(R.id.notification_cross);
    crossImage.setTag(view);
    TextView messageTextView = (TextView) view
            .findViewById(R.id.message_text);
    messageTextView.setText(message);

    crossImage.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            if (notificationContainer.getChildCount() == 1) {
                showNotificationExitingView(v);
            } else {
                if (!isFinishing())
                    notificationContainer.removeView((View) crossImage
                            .getTag());

            }
        }
    });
    LinearLayout.LayoutParams childLP = new LinearLayout.LayoutParams(
            (int) getResources().getDimension(
                    R.dimen.notification_view_width),
            RelativeLayout.LayoutParams.WRAP_CONTENT);
    if (notificationContainer.getChildCount() == getResources().getInteger(
            R.integer.no_of_notifications)) {
        notificationContainer.removeViewAt(notificationContainer
                .getChildCount() - 1);
    }

    notificationContainer.addView(view, 0, childLP);
    notificationContainer.updateViewLayout(view, childLP);
    Handler mHandler = new Handler();
    mHandler.postDelayed(new Runnable() {

        @Override
        public void run() {
            if (notificationContainer.getChildCount() == 1) {
                showNotificationExitingView(view);
            } else {
                if (!isFinishing())
                    notificationContainer.removeView(view);

            }
        }
    }, 10000);

    try {
        windowManager.updateViewLayout(notificationConatinerView, lp);
    } catch (Exception e) {
        windowManager.addView(notificationConatinerView, lp);
        windowManager.updateViewLayout(notificationConatinerView, lp);
    }

    if (notificationContainer.getChildCount() == 1) {
        showNotificationEnteringAnimation();
    }

}

谢谢!

1 个答案:

答案 0 :(得分:0)

使用

windowManager = (WindowManager) getApplicationContext().getSystemService(WINDOW_SERVICE);

而不是

windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);