2016-10-25 95 views
3

正如標題所示,我的應用中的LinearLayout隨機閃爍。很難複製,很難同時獲得屏幕截圖。所以請耐心等待。我只能通過拍照來捕捉它。這裏是的LinearLayout的預期行爲(注意紅色標題下方的白盒):LinearLayout隨機閃爍

enter image description here

現在這裏與LinearLayout中相同的頁面,白色背景消失:

enter image description here

發生這種情況有兩種情況。首先,在頁面完全加載後。其次,在笑臉上做拖動事件。

爲了解決這個問題,我嘗試使用Android Studio的代碼分析功能來獲取關於如何進一步優化此頁面的xml佈局的建議。它給出的建議是:在圖像上缺少contentDescription屬性,支持從右到左佈局的對齊選項,在LinearLayout上設置baselineAligned="false"以獲得更好的性能。

我爲我所有的LinearLayouts添加了baselineAligned="false"選項,但什麼也沒有發生。

在以前的帖子裏,SO,this是我能得到的最接近的。但LinearLayout的那些cache選項似乎沒有幫助。你認爲LinearLayout的優化過程與ListView所描述的一樣嗎?here?最重要的是,我該如何解決這個問題?

編輯:

root.getViewTreeObserver().addOnGlobalLayoutListener(
    new OnGlobalLayoutListener() { 
     @Override 
     public void onGlobalLayout() {  
      mWindowManager.updateViewLayout(mRootView, 
           mLayoutParams); 

     } 
}); 

爲了讓更多的背景,這個應用程序是使用具有UI的服務來實現。截圖中的頁面是一項服務。 (請不要問我爲什麼,我剛剛加入了團隊,原來的程序員已經離開了。)

更新:我發現了問題!萬歲!所以當頁面加載時,第一個文本框會自動獲得焦點。當我禁用我的文本字段的自動對焦時,問題不再發生。有人可以告訴我爲什麼嗎?

+0

它是一個標準的LinearLayout?你如何設定其背景?它是什麼背景?一個PNG?一個可繪製的子類? – natario

+0

它是一個標準的LinearLayout,其子節點動態添加。其背景是使用其XML屬性android:background = @ drawable/white_round設置的,其中white_round是類型形狀,而不是PNG。感謝您提供的任何建議。 – user1506104

+4

我幾乎可以肯定,你正在重繪(刷新)整個佈局的每一個變化。這幾乎總是閃爍的原因。請粘貼部分代碼以確保。 –

回答

0

我不知道,但加入android:focusableInTouchMode="true"幫助。我添加了這個我的佈局,其中有可編輯的領域,如

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="wrap_content" 
    android:layout_height="match_parent" 
    android:orientation="vertical" 
    android:focusableInTouchMode="true"> 
    ... 
    <EditText 
     android:id="@+id/editText" 
     android:layout_width="100dp" 
     android:layout_height="wrap_content" /> 
    ... 
</LinearLayout> 
1

我敢肯定,mWindowManager.updateViewLayout(mRootView, mLayoutParams);再次發射onGlobalLayout()方法,因爲updateViewLayout改變佈局,併爲onGlobalLayout(在文檔),它說:要調用

回調方法當全球佈局狀態或視圖樹內視圖的可見性發生變化。

因此,請在mWindowManager.updateViewLayout(mRootView, mLayoutParams);之前嘗試添加root.getViewTreeObserver().removeGlobalOnLayoutListener(this);以避免同一方法的重複調用。

更新: 它出現在焦點上的原因是因爲當TextView獲得焦點時,它會更改背景,有時也會更改大小,因此會調用onGlobalLayout。如果你刪除監聽器,一切都應該沒問題。

+0

在評論部分,我提到我試圖刪除'addOnGlobalLayoutListener()'行,但問題仍然存在。所以我認爲這是別的。謝謝你的建議。 (無論如何,因爲這是一個很好的分析) – user1506104