2013-11-04 53 views
16

此問題源於必須動態顯示/隱藏不同視圖。視圖有3個可見性設置 - 可見,不可見,並且不見了。如果你有一個父視圖,例如LinearLayout,有幾個子視圖(無所謂),那麼設置父視圖的可見性就像獨立地在所有子視圖上設置可見視圖一樣。例如,如果我說設置父視圖可見性對其子女的影響

LinearLayout container = (LinearLayout) findViewById(R.id.layout_1); 
container.setVisiblity(View.GONE); 

的是,同樣作爲發現每個個體子視圖和所有那些visiblities設置爲View.GONE?如果父母不是View.GONE但是View.INVISIBLE?所有的孩子仍然畫畫,但只是沒有看到?

回答

30

效果是一樣的,但它實際上並沒有設置所有孩子的知名度。它不會吸引他們。

例如:

  1. 設置孩子GONE(父母是可見的,孩子就沒了)

  2. 設置父GONE(既走了)

  3. 設置父可見(父母可見,孩子還沒有離開,因爲孩子之前已明確設置)

  4. 將孩子設置爲可見(可見)

任何時候視圖都是不可見的,它不會繪製它或它的子項。如果它已經結束,它也不會爲它們保留任何佈局空間。如果你檢查孩子的getVisibility(),你會發現它仍然是以前的東西,即使它沒有被繪製。

+0

這種行爲對我來說沒有意義,尤其是因爲從XML膨脹(即將可見性傳播給兒童)開始工作時,這種行爲是不同的。是否有解決方法使XML和Java之間保持一致? – milosmns

0

是啊,你是:)所有點

設置佈局能見度GONE會隱藏所有的孩子正確的。將INVISIBLE的佈局設置爲可見性將使所有兒童看不見,但仍然繪製並佔據空間。

+0

你有上面說的文檔鏈接到任何地方?我知道什麼時候我將父級佈局設置爲View.GONE,它隱藏了孩子,但它是「解除」它們還是使它們不可見? – Rarw

0

使用下面的遞歸函數使您的子視圖可見不見了
第一個參數是您的父視圖,第二個參數決定您是否希望父視圖的子視圖可見或消失。 真正=可見 假=去

private void layoutElemanlarininGorunumunuDegistir(View view, boolean gorunur_mu_olsun) { 
    ViewGroup view_group; 
    try { 
     view_group = (ViewGroup) view; 
     Sabitler.konsolaYazdir(TAG, "View ViewGroup imiş!" + view.getId()); 
    } catch (ClassCastException e) { 
     Sabitler.konsolaYazdir(TAG, "View ViewGroup değilmiş!" + view.getId()); 
     return; 
    } 

    int view_eleman_sayisi = view_group.getChildCount(); 
    for (int i = 0; i < view_eleman_sayisi; i++) { 
     View view_group_eleman = view_group.getChildAt(i); 
     if (gorunur_mu_olsun) { 
      view_group_eleman.setVisibility(View.VISIBLE); 
     } else { 
      view_group_eleman.setVisibility(View.GONE); 
     } 
     layoutElemanlarininGorunumunuDegistir(view_group_eleman, gorunur_mu_olsun); 
    } 
}