美文网首页
activity window

activity window

作者: zhi5ai | 来源:发表于2018-12-17 10:00 被阅读7次

    源码-PhoneWindow.java

    @Override
        public void setContentView(int layoutResID) {
            if (mContentParent == null) {  //mContentParent为空,创建一个DecorView
                installDecor();
            } else {
                mContentParent.removeAllViews(); //mContentParent不为空,删除其中的View
            }
            mLayoutInflater.inflate(layoutResID, mContentParent); //为mContentParent添加子View, 即Activity中设置的布局文件
            final Callback cb = getCallback();
            if (cb != null && !isDestroyed()) {
                cb.onContentChanged();
            }
        }
    
    private void installDecor() {
            if (mDecor == null) {
                mDecor = generateDecor(); //生成DecorView
                mDecor.setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS);
                mDecor.setIsRootNamespace(true);
            }
            if (mContentParent == null) {
                mContentParent = generateLayout(mDecor); //为DecorView设置布局格式,并返回mContentParent
                mTitleView = (TextView)findViewById(com.android.internal.R.id.title);
                if (mTitleView != null) {
                    if ((getLocalFeatures() & (1 << FEATURE_NO_TITLE)) != 0) {
                        View titleContainer = findViewById(com.android.internal.R.id.title_container);
                        if (titleContainer != null) {
                            titleContainer.setVisibility(View.GONE);
                        } else {
                            mTitleView.setVisibility(View.GONE);
                        }
                        if (mContentParent instanceof FrameLayout) {
                            ((FrameLayout)mContentParent).setForeground(null);
                        }
                    } else {
                        mTitleView.setText(mTitle);
                    }
                } else {
                    mActionBar = (ActionBarView) findViewById(com.android.internal.R.id.action_bar);
                    if (mActionBar != null) {
                        if (mActionBar.getTitle() == null) {
                            mActionBar.setWindowTitle(mTitle);
                        }
                        final int localFeatures = getLocalFeatures();
                        if ((localFeatures & (1 << FEATURE_PROGRESS)) != 0) {
                            mActionBar.initProgress();
                        }
                        if ((localFeatures & (1 << FEATURE_INDETERMINATE_PROGRESS)) != 0) {
                            mActionBar.initIndeterminateProgress();
                        }
                        // Post the panel invalidate for later; avoid application onCreateOptionsMenu
                        // being called in the middle of onCreate or similar.
                        mDecor.post(new Runnable() {
                            public void run() {
                                if (!isDestroyed()) {
                                    invalidatePanelMenu(FEATURE_ACTION_BAR);
                                }
                            }
                        });
                    }
                }
            }
        }
    
    protected DecorView generateDecor() {
            return new DecorView(getContext(), -1);
        }
    
        protected ViewGroup generateLayout(DecorView decor) {
            // Apply data from current theme.
            TypedArray a = getWindowStyle();
            if (false) {
                System.out.println("From style:");
                String s = "Attrs:";
                for (int i = 0; i < com.android.internal.R.styleable.Window.length; i++) {
                    s = s + " " + Integer.toHexString(com.android.internal.R.styleable.Window[i]) + "="
                            + a.getString(i);
                }
                System.out.println(s);
            }
            mIsFloating = a.getBoolean(com.android.internal.R.styleable.Window_windowIsFloating, false);
            int flagsToUpdate = (FLAG_LAYOUT_IN_SCREEN|FLAG_LAYOUT_INSET_DECOR)
                    & (~getForcedWindowFlags());
            if (mIsFloating) {
                setLayout(WRAP_CONTENT, WRAP_CONTENT);
                setFlags(0, flagsToUpdate);
            } else {
                setFlags(FLAG_LAYOUT_IN_SCREEN|FLAG_LAYOUT_INSET_DECOR, flagsToUpdate);
            }
            if (a.getBoolean(com.android.internal.R.styleable.Window_windowNoTitle, false)) {
                requestFeature(FEATURE_NO_TITLE);
            } else if (a.getBoolean(com.android.internal.R.styleable.Window_windowActionBar, false)) {
                // Don't allow an action bar if there is no title.
                requestFeature(FEATURE_ACTION_BAR);
            }
            if (a.getBoolean(com.android.internal.R.styleable.Window_windowActionBarOverlay, false)) {
                requestFeature(FEATURE_ACTION_BAR_OVERLAY);
            }
            if (a.getBoolean(com.android.internal.R.styleable.Window_windowActionModeOverlay, false)) {
                requestFeature(FEATURE_ACTION_MODE_OVERLAY);
            }
    
            ...
    
            WindowManager.LayoutParams params = getAttributes();
            if (!hasSoftInputMode()) {
                params.softInputMode = a.getInt(
                        com.android.internal.R.styleable.Window_windowSoftInputMode,
                        params.softInputMode);
            }
           ...
    
            // Inflate the window decor.
            int layoutResource;
            int features = getLocalFeatures();
            // System.out.println("Features: 0x" + Integer.toHexString(features));
            if ((features & ((1 << FEATURE_LEFT_ICON) | (1 << FEATURE_RIGHT_ICON))) != 0) {
                if (mIsFloating) {
                    TypedValue res = new TypedValue();
                    getContext().getTheme().resolveAttribute(
                            com.android.internal.R.attr.dialogTitleIconsDecorLayout, res, true);
                    layoutResource = res.resourceId;
                } else {
                    layoutResource = com.android.internal.R.layout.screen_title_icons;
                }
                // XXX Remove this once action bar supports these features.
                removeFeature(FEATURE_ACTION_BAR);
                // System.out.println("Title Icons!");
            } else if ((features & ((1 << FEATURE_PROGRESS) | (1 << FEATURE_INDETERMINATE_PROGRESS))) != 0
                    && (features & (1 << FEATURE_ACTION_BAR)) == 0) {
                // Special case for a window with only a progress bar (and title).
                // XXX Need to have a no-title version of embedded windows.
                layoutResource = com.android.internal.R.layout.screen_progress;
                // System.out.println("Progress!");
            } else if ((features & (1 << FEATURE_CUSTOM_TITLE)) != 0) {
                // Special case for a window with a custom title.
                // If the window is floating, we need a dialog layout
                if (mIsFloating) {
                    TypedValue res = new TypedValue();
                    getContext().getTheme().resolveAttribute(
                            com.android.internal.R.attr.dialogCustomTitleDecorLayout, res, true);
                    layoutResource = res.resourceId;
                } else {
                    layoutResource = com.android.internal.R.layout.screen_custom_title;
                }
                // XXX Remove this once action bar supports these features.
                removeFeature(FEATURE_ACTION_BAR);
            } else if ((features & (1 << FEATURE_NO_TITLE)) == 0) {
                // If no other features and not embedded, only need a title.
                // If the window is floating, we need a dialog layout
                if (mIsFloating) {
                    TypedValue res = new TypedValue();
                    getContext().getTheme().resolveAttribute(
                            com.android.internal.R.attr.dialogTitleDecorLayout, res, true);
                    layoutResource = res.resourceId;
                } else if ((features & (1 << FEATURE_ACTION_BAR)) != 0) {
                    if ((features & (1 << FEATURE_ACTION_BAR_OVERLAY)) != 0) {
                        layoutResource = com.android.internal.R.layout.screen_action_bar_overlay;
                    } else {
                        layoutResource = com.android.internal.R.layout.screen_action_bar;
                    }
                } else {
                    layoutResource = com.android.internal.R.layout.screen_title;
                }
                // System.out.println("Title!");
            } else {
                // Embedded, so no decoration is needed.
                layoutResource = com.android.internal.R.layout.screen_simple;
                // System.out.println("Simple!");
            }
            mDecor.startChanging();
            View in = mLayoutInflater.inflate(layoutResource, null);
            decor.addView(in, new ViewGroup.LayoutParams(MATCH_PARENT, MATCH_PARENT));
            ViewGroup contentParent = (ViewGroup)findViewById(ID_ANDROID_CONTENT);
            if (contentParent == null) {
                throw new RuntimeException("Window couldn't find content container view");
            }
            if ((features & (1 << FEATURE_INDETERMINATE_PROGRESS)) != 0) {
                ProgressBar progress = getCircularProgressBar(false);
                if (progress != null) {
                    progress.setIndeterminate(true);
                }
            }
            // Remaining setup -- of background and title -- that only applies
            // to top-level windows.
            if (getContainer() == null) {
                Drawable drawable = mBackgroundDrawable;
                if (mBackgroundResource != 0) {
                    drawable = getContext().getResources().getDrawable(mBackgroundResource);
                }
                mDecor.setWindowBackground(drawable);
                drawable = null;
                if (mFrameResource != 0) {
                    drawable = getContext().getResources().getDrawable(mFrameResource);
                }
                mDecor.setWindowFrame(drawable);
                // System.out.println("Text=" + Integer.toHexString(mTextColor) +
                // " Sel=" + Integer.toHexString(mTextSelectedColor) +
                // " Title=" + Integer.toHexString(mTitleColor));
                if (mTitleColor == 0) {
                    mTitleColor = mTextColor;
                }
                if (mTitle != null) {
                    setTitle(mTitle);
                }
                setTitleColor(mTitleColor);
            }
            mDecor.finishChanging();
            return contentParent;
        }
    

    相关文章

      网友评论

          本文标题:activity window

          本文链接:https://www.haomeiwen.com/subject/uuowhqtx.html