2015-10-13 65 views
1

我在一個視圖中有一個描述元數據在底部。試圖在代碼中發生案件時顯示額外的標題文本視圖,因此可以顯示或不顯示此文本視圖。但是,如果我這樣做,我的線性佈局(藍色)的高度會增加,這實際上是我想要避免的。Android在包裝高度上動態設置滾動視圖

由於所有高度均爲WRAP_CONTENT,因此在標題文本視圖出現之前,如何保持線性佈局所具有的高度?

這是我的佈局看起來像至今:

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:background="@color/pp_white" 
    android:orientation="vertical" 
    android:padding="@dimen/margin_normal"> 

    <ImageView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"/> 

    <TextView 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:text="Title"/> 

    <TextView 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:text="Desc 1"/> 

    <TextView 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:text="desc 2"/> 

    <TextView 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:text="Desc 3"/> 


    <TextView 
     android:id="@+id/extra_caption" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:text="Extra Caption" 
     android:visibility="gone"/> 
</LinearLayout> 

我知道一個滾動視圖會需要肯定的,但我想使用滾動視圖時,多餘的標題(文本視圖)具有可視性作爲VISIBLE,否則我不想使用滾動視圖。

我試圖做到這一點沒有成功至今:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:background="@color/pp_white" 
    android:orientation="vertical" 
    android:padding="@dimen/margin_normal"> 

    <ScrollView 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content"> 

     <LinearLayout 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:orientation="vertical"> 

      <ImageView 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content"/> 

      <TextView 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:text="Title"/> 

      <TextView 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:text="Desc 1"/> 

      <TextView 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:text="desc 2"/> 

      <TextView 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:text="Desc 3"/> 


      <TextView 
       android:id="@+id/extra_caption" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:text="Extra Caption" 
       android:visibility="gone"/> 
     </LinearLayout> 
    </ScrollView> 
</LinearLayout> 

換句話說,我想這樣做:

enter image description here

+0

爲什麼你發佈的第二個佈局不起作用?那有什麼問題?您將始終必須使用ScrollView,因爲屏幕大小不同,如果視圖不合適,您應該滾動,例如,在橫向視圖中,沒有滾動,任何東西都不適合。 – Sharj

+0

事情是,因爲我沒有爲每個TextView定義高度,所以包裹這些(Blue)的LinearLayout不保持相同的高度,而不是增加它。所以我的目標是,保持相同的高度 –

+1

然後給藍色部分固定高度,並把ScrollView只在藍色區域。 – Sharj

回答

0

走出這種方式,它的工作! 的關鍵是一個ID設置爲滾動型,這樣我可以修改程序的高度:

<?xml version="1.0" encoding="utf-8"?> 
     ... 

     <ScrollView 
      android:id="@+id/my_scroll_view" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content"> 

      ... 
    </LinearLayout> 

把佈局PARAMS:

private void displayExtraCaption() { 
      extraCaptionTextView.setVisibility(View.GONE); 
      int scrollHeightBeforeCaption = myScrollView.getHeight(); 
      ... 
      } 

這裏談到的另一個挑戰,因爲我在一個Lib內部的Fragment上實現這個功能,所以我無法訪問這些活動(這個Lib只有Fragments),所以我第一次調用這個方法scrollHeightBeforeCaption是等於0,以避免我設置如果發生此情況,則爲Runnable:

private void displayExtraCaption() { 
      extraCaptionTextView.setVisibility(View.GONE); 
      int scrollHeightBeforeCaption = myScrollView.getHeight(); 
      if (scrollHeightBeforeCaption == 0) { 
       myScrollView 
         .post(new Runnable() { 
            @Override 
            public void run() { 
             refreshMetaDataScrollViewHeight(); 
            } 
           } 
         ); 
      } else { 
       refreshMetaDataScrollViewHeight(); 
      } 
} 

最後我refreshMetaDataScrollViewHeight()是我的一次額外註標籤變爲可見誰保持原有高度的滾動型的一個:

private void refreshMetaDataScrollViewHeight() { 
    int scrollHeightBeforeCaption = metadataScrollView.getHeight(); 
    ViewGroup.LayoutParams myScrollViewParams = myScrollView.getLayoutParams(); 
    myScrollViewParams.height = scrollHeightBeforeCaption; 
    myScrollView.setLayoutParams(myScrollViewParams); 

    myScrollView.invalidate(); 
    extraCaptionTextView.setVisibility(View.VISIBLE); 
    extraCaptionTextView.invalidate(); 
} 

感謝您的時間讀這:)