2016-07-31 54 views
2

我有以下xml代碼。 imagebutton沒有在textView下面對齊,邊距爲5dp。我認爲我在理解各種佈局參數時犯了一個錯誤。相關佈局是一個線性佈局的子視圖,其他視圖很少。Layout_Below在相對佈局中沒有正確執行

 <RelativeLayout 
     android:layout_width="match_parent" 
     android:layout_height="0dp" 
     android:layout_weight="40"> 

     <com.github.lzyzsd.circleprogress.DonutProgress 
      android:id="@+id/amain_dp" 
      android:layout_width="240dp" 
      android:layout_height="240dp" 
      android:layout_centerInParent="true" /> 

     <TextView 
      android:id="@+id/amain_tv_currentsteps" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_centerInParent="true" 
      android:gravity="center" 
      android:textSize="25sp" /> 

     <ImageButton 
      android:id="@+id/amain_ib_whatsapp" 
      android:layout_width="40dp" 
      android:layout_height="40dp" 
      android:layout_marginTop="5dp" 
      android:layout_centerHorizontal="true" 
      android:layout_below="@id/amain_tv_currentsteps" 
      android:background="@drawable/whatsapp_icon"/> 

    </RelativeLayout> 

這是我得到的輸出:

enter image description here

編輯:代碼工作如果適當layout_weight參數被刪除,固定提供layout_height參數。不過想明白,爲什麼上面的代碼將失敗,因爲layout_weight

編輯:完整的XML代碼:

<ScrollView 
xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
tools:context="in.jiyofit.basic_app.MainActivity"> 

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

    <TextView 
     android:id="@+id/amain_tv_target" 
     android:layout_width="wrap_content" 
     android:layout_height="0dp" 
     android:layout_marginBottom="10dp" 
     android:layout_marginTop="20dp" 
     android:layout_weight="10" /> 

    <RelativeLayout 
     android:layout_width="match_parent" 
     android:layout_height="0dp" 
     android:layout_weight="40"> 

     <com.github.lzyzsd.circleprogress.DonutProgress 
      android:id="@+id/amain_dp" 
      android:layout_width="240dp" 
      android:layout_height="240dp" 
      android:layout_centerInParent="true" /> 

     <TextView 
      android:id="@+id/amain_tv_currentsteps" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_centerInParent="true" 
      android:gravity="center" 
      android:textSize="25sp" /> 

     <ImageButton 
      android:id="@+id/amain_ib_whatsapp" 
      android:layout_width="40dp" 
      android:layout_height="40dp" 
      android:layout_marginTop="5dp" 
      android:layout_centerHorizontal="true" 
      android:layout_below="@id/amain_tv_currentsteps" 
      android:background="@drawable/whatsapp_icon"/> 

    </RelativeLayout> 

    <FrameLayout 
     android:id="@+id/amain_fl_container" 
     android:layout_width="match_parent" 
     android:layout_height="0dp" 
     android:layout_weight="30" 
     android:layout_marginTop="20dp"/> 

</LinearLayout> 

+0

佈局在我看來很好。您是否在Android Studio的佈局編輯器中截取了截圖? – Shaishav

+0

它來自我的手機。用'layout_weight'添加可能是原因的另一個視圖。 – suku

+0

我的答案應該可以工作 –

回答

1

鑑於您的佈局有以下方案:

<ScrollView> 
    <LinearLayout> 
     <TextView/> 
     <RelativeLayout/> 
     <FrameLayout/> 
    </LinearLayout> 
</ScrollView> 

在上面的層次結構,所有LinearLayout孩子有一個佈局重屬性集,基本上問父父之內提供(layout_weight/weightSum) * parentHeight()空間,它和LinearLayout本身有一個lauout_height設置爲wrap_content,基本上要求孩子們說出自己的高度,所以LinearLayout本身可以相應地擴展。這是一種循環依賴,因此佈局工具無法找出位置。

在這種情況下,你有兩個選擇:

1 - 刪除ScrollViewLinearlayout's高度設置爲match_parent。佈局中的每個子元素都會相應地展開以正確佔用屏幕空間。您的佈局看起來就像這樣:

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" 
    android:weightSum="80"> 

    <TextView 
     android:id="@+id/amain_tv_target" 
     android:layout_width="wrap_content" 
     android:layout_height="0dp" 
     android:layout_marginBottom="10dp" 
     android:layout_marginTop="20dp" 
     android:layout_weight="10"/> 

    <RelativeLayout 
     android:layout_width="match_parent" 
     android:layout_height="0dp" 
     android:layout_weight="40"> 

     <com.github.lzyzsd.circleprogress.DonutProgress 
      android:id="@+id/amain_dp" 
      android:layout_width="240dp" 
      android:layout_height="240dp" 
      android:layout_centerInParent="true"/> 

     <TextView 
      android:id="@+id/amain_tv_currentsteps" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_centerInParent="true" 
      android:gravity="center" 
      android:textSize="25sp"/> 

     <ImageButton 
      android:id="@+id/amain_ib_whatsapp" 
      android:layout_width="40dp" 
      android:layout_height="40dp" 
      android:layout_below="@id/amain_tv_currentsteps" 
      android:layout_centerHorizontal="true" 
      android:layout_marginTop="5dp"/> 

    </RelativeLayout> 

    <FrameLayout 
     android:id="@+id/amain_fl_container" 
     android:layout_width="match_parent" 
     android:layout_height="0dp" 
     android:layout_marginTop="20dp" 
     android:layout_weight="30"/> 

</LinearLayout> 

2 - 既然你有一個適當的ScrollView,則可以提供絕對高度的LinearLayout每個孩子,讓LinearLayout高度wrap_contentScrollView將針對不同屏幕充分縮放您的佈局。你的佈局可能會是這個樣子:

<ScrollView 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <LinearLayout 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:orientation="vertical" 
     android:weightSum="80"> 

     <TextView 
      android:id="@+id/amain_tv_target" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_marginBottom="10dp" 
      android:layout_marginTop="20dp"/> 

     <RelativeLayout 
      android:layout_width="match_parent" 
      android:layout_height="400dp"> 

      <com.github.lzyzsd.circleprogress.DonutProgress 
       android:id="@+id/amain_dp" 
       android:layout_width="240dp" 
       android:layout_height="240dp" 
       android:layout_centerInParent="true"/> 

      <TextView 
       android:id="@+id/amain_tv_currentsteps" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:layout_centerInParent="true" 
       android:gravity="center" 
       android:textSize="25sp"/> 

      <ImageButton 
       android:id="@+id/amain_ib_whatsapp" 
       android:layout_width="40dp" 
       android:layout_height="40dp" 
       android:layout_below="@id/amain_tv_currentsteps" 
       android:layout_centerHorizontal="true" 
       android:layout_marginTop="5dp"/> 

     </RelativeLayout> 

     <FrameLayout 
      android:id="@+id/amain_fl_container" 
      android:layout_width="match_parent" 
      android:layout_height="200dp" 
      android:layout_marginTop="20dp"/> 

    </LinearLayout> 

</ScrollView> 

就像一個經驗法則,確保您LinearLayout的高度/寬度如果確定您提供layout_weight屬性,其子之前。希望這可以幫助。

+0

我認爲'linear_layout'必須是'wrap_content'內滾動視圖。因此,如果使用'layout_weight',則不能使用第二種解決方案。 – suku

+0

@suku完全是你的電話 – Shaishav

0

您需要使用+ 這樣的:

android:layout_below="@+id/amain_tv_currentsteps" 
+2

只有當您第一次使用視圖的名稱(無論是在創建時還是在引用過程中)時,才需要'+'。 – Shaishav

+0

對我來說,它做的工作 –

+0

什麼工作?我說它不需要有'+'。它不會改變任何東西。 – Shaishav

0

在你頂部RelativeLayout給它一個尺寸0dp使問題,因爲它(該rel有0高度和)你的圖像視圖低於我噸。

android:layout_height="match_parent" 
+0

它可能是一個'LinearLayout'的孩子。 – Shaishav

+0

@Charuka,我需要使用'layout_weight' – suku

+0

@Shaishav,是的,相對佈局是一個子佈線,它具有其他視圖 – suku