Android View.post(Runnable) - 正在运行但不影响UI

时间:2015-05-21 21:57:44

标签: android multithreading android-activity view viewgroup

我正在尝试将视图添加到Android Activity中的工具栏中。下面的“decorView”是操作栏/工具栏的RelativeLayout子视图。

定义容器:

    ActionBar actionBar = getSupportActionBar();

    if (actionBar == null) {
        Toolbar toolBar = (Toolbar) findViewById(R.id.action_bar);
        setSupportActionBar(toolBar);
    }

    actionBar = getSupportActionBar();

    if (actionBar != null) {
        actionBar.setCustomView(getActionBarLayoutResourceId());
        this.mActionBarView = (RelativeLayout) actionBar.getCustomView()
                .findViewById(R.id.relative_layout_action_bar);
        actionBar.setDisplayShowCustomEnabled(true);
        actionBar.setDisplayShowTitleEnabled(false);
        actionBar.setHomeButtonEnabled(false);
        actionBar.setDisplayUseLogoEnabled(false);
        actionBar.setDisplayShowHomeEnabled(false);
        actionBar.setDisplayHomeAsUpEnabled(false);
    } else {
        log("ActionBar is null");
    }

添加视图:

final ViewGroup decorView = this.mActionBarView;

Runnable postDecorHeaderView = new Runnable() {
        @Override
        public void run() {
            if (decorView.getWindowToken() != null) {
                // The Decor dView has a Window Token, so we can add the
                // HeaderView!
                decorView.addView(mHeaderView);
            } else {
                try {
                    Thread.sleep(1000); // 1 second
                } catch (InterruptedException e) {
                    log(e.getClass() + ": " + e.getMessage());
                }
                // The Decor View doesn't have a Window Token yet, post
                // ourselves again...
                decorView.post(this);
            }
        }
    };

    decorView.post(postDecorHeaderView);

我已经确认,在此方法完成后,decorView的子计数会增加。不幸的是,我的“mHeaderView”没有出现,也没有出现在视图层次结构分析中。我尝试过其他UI更新,例如更改TextView的文本无效。

我已经在runnable中验证了decorView的身份。如果我记录了runnable,我看到它正在运行,我验证它是在主UI线程上运行的......但是没有发生可视更新。

1 个答案:

答案 0 :(得分:0)

通过从现有视图中抓取工具栏,自定义布局已存在于视图中。所以我不需要另外“setCustomView”。我不确定这个第二个自定义视图布局在屏幕上的位置(甚至使用调试工具,我找不到布局),但尝试发布并添加子视图不起作用。

最终,我所做的就是将mActionBarView设置器更改为:

this.mActionBarView = (RelativeLayout) findViewById(R.id.relative_layout_action_bar);