【问题标题】:Android set visibility of elements asynctaskAndroid设置元素asynctask的可见性
【发布时间】:2014-09-22 21:16:31
【问题描述】:

我正在尝试在运行异步任务时设置两个线性布局的可见性。这是我的代码:

private LinearLayout mProgress;
private LinearLayout mList;
mProgress.setOnSystemUiVisibilityChangeListener(new View.OnSystemUiVisibilityChangeListener() {

            @Override
            public void onSystemUiVisibilityChange(int visibility) {
                mList.setVisibility((mProgress.getVisibility() == View.VISIBLE ? View.INVISIBLE : View.VISIBLE));               
            }
        });


//When I run asynctask
@Override
protected void onPreExecute() {
    super.onPreExecute();
    mProgress.setVisibility(View.VISIBLE);
}

@Override
protected void onPostExecute() {                
        mProgress.setVisibility(View.GONE);
}

按照权利,这应该将 mProgress 设置为一直可见,直到 onPostExecute。从那里,我将可见性设置为 GONE,这应该使我的其他线性布局可见正确吗?但是,当我运行它时,mProgress 永远不会从 onPreExecute 设置为 VISIBLE,并且当 Visibility 更改时,mList 永远不会设置为 VISIBLE。知道我做错了什么吗?

【问题讨论】:

  • 在没有处理程序的情况下不能从外部线程与 ui 交互(异步任务不直接实现)
  • 这样做你想达到什么目的?保持您的代码简单,对于您的问题,还有其他方法可以更好地处理相同的事情

标签: android android-layout android-asynctask visibility


【解决方案1】:

你把事情复杂化了。直接在 onPostExecute 和 onPreExecute 中设置列​​表的可见性——它更容易理解,对维护者更可见。

但是您编写的代码的问题是 onSystemUiVisibilityChange 在设置新可见性之前调用,而不是之后。所以你不应该使用 mProgress.getVisibility,你应该使用传入的可见性变量。

【讨论】:

    【解决方案2】:

    也许你使用了错误的监听器,文档说当状态栏由于调用 setSystemUiVisibility(int) 而改变可见性时会调用 onSystemUiVisibilityChange()。见http://developer.android.com/reference/android/view/View.OnSystemUiVisibilityChangeListener.html

    你最好先确保你使用了正确的Listener,然后确保在回调到Listener之前执行了onPreExecute()和onPostExecute()方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-22
      • 2013-06-23
      • 1970-01-01
      • 2013-07-06
      • 2021-04-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多