0

我的問題如下。在我的應用程序中,我有一個驗證碼查詢來驗證用戶。在DialogFragment和中,假設初始化驗證碼爲空,則在接收到驗證碼後,代碼會動態設置圖像。調整孩子動態變化後的LinearLayout高度ImageView

問題是,當ImageViewLinearLayout高度計算的,所以以後我將它設置,圖像都推到對話窗口的可視區域(因爲LinearLayout中高度不updated)。

image height is wrap_content

我敢肯定這是原因,因爲我試圖設置圖像高度固定值,效果如下。

image height is 55dp

這是我的佈局。

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/captcha_linear" 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content"> 
    <ImageView 
     android:id="@+id/captcha_image" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:adjustViewBounds="true" 
     android:scaleType="centerCrop"/> 
    <EditText 
     android:id="@+id/captcha_input" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:hint="type captcha code here..." 
     android:maxLength="14" 
     android:maxLines="1" 
     android:singleLine="true"/> 
    <Button 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:text="Refresh" 
     android:id="@+id/button_captcha_refresh" /> 
    <Button 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:text="Submit" 
     android:id="@+id/button_captcha_submit" /> 
</LinearLayout> 

任何想法我怎麼可能以某種方式重新呈現LinearLayout後,我設置的驗證碼圖像,使其將採取在考慮新的高度值?

編輯:

我忘了提,我試圖以重新描繪它打電話invalidate在LinearLayout中。

編輯2:這裏

按照要求,是我DialogFragment

public void refreshCaptcha(String b64captcha) { 
    byte[] decodedString = Base64.decode(b64captcha, Base64.DEFAULT); 
    Bitmap decodedByte = BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length); 
    image.setImageBitmap(decodedByte); 
    linear.invalidate(); 
    linear.requestLayout(); 
} 

的一部分,這裏是視圖的創建方式:

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.fragment_captcha, container); 
    getDialog().setTitle("Catpcha verification"); 
    activity = (LoginActivity) getActivity(); 
    image = (ImageView) view.findViewById(R.id.captcha_image); 
    linear = (LinearLayout) view.findViewById(R.id.captcha_linear); 
    captcha_input = (EditText) view.findViewById(R.id.captcha_input); 
    /* ... button callback events skipped ... */ 
    return view; 
} 
+0

你有沒有打過電話在您的ImageView requestLayout()或LinearLayour獲得驗證碼後? – Kistamushken

+0

感謝@Kistamushken快速反饋。是的,我也嘗試改變invalidate和requestLayout()的順序。我只在LinearLayout對象上調用它們,我是否也應該在ImageView上嘗試它? – Marek

+0

我只是試圖在兩個對象上調用requestLayout()(沒有調用invalidate),它沒有做任何改變。 – Marek

回答

0

我解決它。我在that博客上找到了解決方案。原來,將整個佈局封入RelativeLayout解決了這個問題,我不知道爲什麼(如果有人知道我會很感激評論)。

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/tools" 
    android:id="@+id/rel" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 
    <LinearLayout 
     android:id="@+id/captcha_linear" 
     android:orientation="vertical" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content"> 
     <ImageView 
      android:id="@+id/captcha_image" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:adjustViewBounds="true" 
      android:scaleType="centerCrop"/> 
     <EditText 
      android:id="@+id/captcha_input" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:hint="type captcha code here..." 
      android:maxLength="14" 
      android:maxLines="1" 
      android:singleLine="true"/> 
     <Button 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:text="Refresh" 
      android:id="@+id/button_captcha_refresh" /> 
     <Button 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:text="Submit" 
      android:id="@+id/button_captcha_submit" /> 
    </LinearLayout> 
</RelativeLayout> 

修復後,它看起來像這樣:

enter image description here