2011-08-02 65 views
6

嗨,我得到一個運行時異常:SlidingDrawer不能有不定的尺寸

SlidingDrawer cannot have UNSPECIFIED dimensions 

從下面的XML,可以在這個任何幫助。

<?xml version="1.0" encoding="utf-8"?> 
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/scroll" android:layout_width="fill_parent" android:layout_height="fill_parent" android:fillViewport="true"> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       android:layout_width="fill_parent" 
       android:layout_height="fill_parent" 
       android:padding="10px" android:background="@drawable/formbg"> 


<LinearLayout android:id="@+id/linearLayout1" 
     android:layout_width="fill_parent" android:layout_height="wrap_content" 
     android:orientation="horizontal" android:layout_alignParentTop="true" 
     android:layout_alignParentLeft="true" android:layout_alignParentRight="true"> 

    <TextView android:id="@+id/label" 
       android:layout_width="120px" 
       android:layout_height="wrap_content" 
       android:text="Question Title" 
       android:textStyle="bold" 
       android:textSize="12sp" 
       android:textColor="#000000" 
    android:paddingLeft="5px" 
    android:paddingRight="5px" 
    android:paddingTop="10px" 
    android:paddingBottom="10px" 
       /> 

    <EditText android:id="@+id/entry" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:textColor="#000000" 
    android:paddingLeft="10px" 
    android:paddingRight="5px" 
    android:paddingTop="10px" 
    android:paddingBottom="10px" 
       /> 

</LinearLayout> 


    <LinearLayout android:id="@+id/linearLayout2" 
     android:layout_below="@id/linearLayout1" android:layout_width="wrap_content" 
     android:layout_height="wrap_content" android:orientation="horizontal" 
     android:layout_alignParentLeft="true" android:layout_alignParentRight="true" android:paddingRight="0px" > 

    <TextView android:id="@+id/pass" 
       android:layout_width="120px" 
       android:layout_height="wrap_content" 
       android:text="Type Description" 
       android:textStyle="bold" 
       android:textSize="12sp" 
       android:textColor="#000000" 
    android:paddingLeft="5px" 
    android:paddingRight="5px" 
    android:paddingTop="10px" 
    android:paddingBottom="10px" 
    /> 

    <EditText android:id="@+id/passentry" 
       android:layout_width="match_parent" 
       android:layout_height="100px" 
       android:textColor="#000000" 
    android:paddingLeft="10px" 
    android:paddingRight="5px" 
    android:paddingTop="10px" 
    android:paddingBottom="10px" 
       /> 

    </LinearLayout> 


    <LinearLayout android:id="@+id/linearLayout3" 
     android:layout_below="@id/linearLayout2" android:layout_width="wrap_content" 
     android:layout_height="wrap_content" android:orientation="horizontal" 
     android:layout_alignParentLeft="true" android:layout_alignParentRight="true"> 

    <TextView android:id="@+id/labelbounty" 
       android:layout_width="120px" 
       android:layout_height="wrap_content" 
       android:text="Enter Amount $" 
       android:textStyle="bold" 
       android:textSize="12sp" 
       android:textColor="#000000" 
    android:paddingLeft="5px" 
    android:paddingRight="5px" 
    android:paddingTop="10px" 
    android:paddingBottom="10px" 
       /> 

    <EditText android:id="@+id/bounty" 
       android:numeric="decimal" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:textColor="#000000" 
    android:paddingLeft="10px" 
    android:paddingRight="5px" 
    android:paddingTop="10px" 
    android:paddingBottom="10px" 
       />   


    </LinearLayout> 


    <LinearLayout android:id="@+id/linearLayout4" 
     android:layout_below="@id/linearLayout3" android:layout_width="wrap_content" 
     android:layout_height="wrap_content" android:orientation="horizontal" 
     android:layout_alignParentLeft="true" android:layout_alignParentRight="true"> 



    <TextView android:id="@+id/duedatelabel" 
       android:layout_width="120px" 
       android:layout_height="wrap_content" 
       android:text="Due Date" 
       android:textStyle="bold" 
       android:textSize="12sp" 
       android:textColor="#000000" 
    android:paddingLeft="10px" 
    android:paddingRight="5px" 
    android:paddingTop="10px" 
    android:paddingBottom="10px" /> 

    <Button android:id="@+id/pickDate" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:textColor="#000000" 
    android:paddingLeft="10px" 
    android:paddingRight="5px" 
    android:paddingTop="10px" 
    android:paddingBottom="10px" 
     android:text="Select Due Date"/> 

    </LinearLayout> 

    <LinearLayout android:id="@+id/linearLayout5" 
     android:layout_below="@id/linearLayout4" android:layout_width="wrap_content" 
     android:layout_height="wrap_content" android:orientation="horizontal" 
     android:layout_alignParentLeft="true" android:layout_alignParentRight="true"> 


    <TextView android:id="@+id/labelprimary" 
       android:layout_width="120px" 
       android:layout_height="wrap_content" 
       android:text="Category" 
       android:textStyle="bold" 
       android:textSize="12sp" 
       android:textColor="#000000" 
    android:paddingLeft="10px" 
    android:paddingRight="5px" 
    android:paddingTop="10px" 
    android:paddingBottom="10px" 
       /> 

    <Spinner 
     android:id="@+id/primarycategory" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:prompt="@string/planet_prompt" 
     android:textColor="#000000" 
     android:paddingLeft="15px" 
    android:paddingRight="5px" 
    android:paddingTop="10px" 
    android:paddingBottom="10px" 
    /> 
    </LinearLayout> 


    <LinearLayout android:id="@+id/linearLayout6" 
     android:layout_below="@id/linearLayout5" android:layout_width="wrap_content" 
     android:layout_height="wrap_content" android:orientation="horizontal" 
     android:layout_alignParentLeft="true" android:layout_alignParentRight="true"> 

    <TextView android:id="@+id/labelsecondary" 
       android:layout_width="120px" 
       android:layout_height="wrap_content" 
       android:text="Sub Category" 
       android:textStyle="bold" 
       android:textSize="12sp" 
       android:textColor="#000000" 
    android:paddingLeft="10px" 
    android:paddingRight="5px" 
    android:paddingTop="10px" 
    android:paddingBottom="10px" 
       /> 

    <Spinner 
     android:id="@+id/secondarycategory" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:prompt="@string/secondary_category" 
     android:textColor="#000000" 
    android:paddingLeft="15px" 
    android:paddingRight="5px" 
    android:paddingTop="10px" 
    android:paddingBottom="10px" 
    />    
    </LinearLayout> 


    <LinearLayout android:id="@+id/linearLayout7" 
     android:layout_below="@id/linearLayout6" android:layout_width="wrap_content" 
     android:padding="10px" 
     android:layout_height="wrap_content" android:orientation="horizontal" 
     android:layout_alignParentLeft="true" android:layout_alignParentRight="true" android:paddingRight="10px" android:paddingLeft="10px"> 

    <Button android:id="@+id/button1" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="Add Attachment" 
    > 

    </Button> 

    </LinearLayout> 


    <LinearLayout android:id="@+id/linearLayout8" 
     android:layout_below="@id/linearLayout7" android:layout_width="wrap_content" 
     android:padding="10px" 
     android:layout_height="wrap_content" android:orientation="horizontal" 
     android:layout_alignParentLeft="true" android:layout_alignParentRight="true" android:paddingRight="10px" android:paddingLeft="10px"> 


    <Button android:id="@+id/askNow" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:layout_alignParentRight="true" 
      android:text="Post Question" /> 

    </LinearLayout> 
    <LinearLayout android:id="@+id/linearLayout9" 
     android:layout_below="@id/linearLayout8" 
     android:layout_width="fill_parent" 
       android:layout_height="fill_parent" 
       android:gravity="bottom" 
       android:orientation="vertical"> 


     <SlidingDrawer android:id="@+id/SlidingDrawer" android:handle="@+id/slideHandleButton" android:content="@+id/contentLayout" android:topOffset="50dip" android:layout_width="fill_parent" android:layout_height="fill_parent"> 
      <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/slideHandleButton" android:background="@drawable/closearrow"></Button> 
      <LinearLayout android:id="@+id/contentLayout" android:layout_width="match_parent" android:layout_height="match_parent" 
          android:orientation="vertical" android:gravity="center" 
          android:background="#FF444444"> 
      <Button android:id="@+id/asknew" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Ask New Question"></Button> 
      <Button android:id="@+id/logout" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Log Out"></Button> 
      </LinearLayout> 
     </SlidingDrawer> 
    </LinearLayout> 

    <android.view.SurfaceView xmlns:android="http://schemas.android.com/apk/res/android" 
     android:id="@+id/preview" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     > 
    </android.view.SurfaceView> 

</RelativeLayout> 
</ScrollView> 

回答

6

我有同樣的問題,所以我去挖掘源代碼。基本的答案是,在SlidingDrawer上使用MeasureSpec.UNSPECIFIED,即SlidingDrawer可以設置其自己的大小,稱爲measure()

這可能是由於包含的佈局(或其父母)是基準對齊或具有WRAP_CONTENT作爲其高度或寬度。如果包含LinearLayout的設置爲baselineAligned,則它會要求其所有子項的大小以查找最大的一個。當然,如果要包裝它們的話,它也會問它的孩子們的體型。

在任何包含滑動抽屜的LinearLayout中設置android:baselineAligned="false",並確保包含SlidingDrawer的任何內容都不具有用於高度或寬度的WRAP_CONTENT。換句話說,SlidingDrawer必須有一個確切的大小定義,這意味着它的父母也必須使用FILL_PARENT

+0

你聽起來像有一些方法可以避免真正的問題。基本對齊與任何事情無關,wrap_content也不對。他在垂直LinearLayout中有一個垂直抽屜,因爲他使用的佈局設計會變得更大,所以永遠不會有一種「動態」的方式來設置它的高度。他需要將他在抽屜中的按鈕的高度添加到他用於處理的那個按鈕上,並將該值用作抽屜的layout_height,寬度可以保持動態。 –

1

我實際上並不知道爲什麼,這是造成你的高度或寬度值是不確定的,但我可以告訴你,在LinearLayout中包裝你的滑動抽屜可能是造成問題的原因。啓用此代碼到在SlidingDrawer屬性和刪除LinearLayout

android:layout_below="@id/linearLayout8" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:gravity="bottom" 

希望這個修復它。

+0

@ caspNZ力工作的任何其他方式。 – Max

+0

上述選項dint工作,任何其他解決方案。 – Max

+1

只要注意到你已經把所有東西都包裹在scrollview中。您應該可以將您的RelativeLayout作爲視圖的父項,並使用scrollview包裝需要滾動的內容(SlidingDrawer上方的所有內容)。測試這種方法的一種方法是,如果這些工作都不起作用,那就簡化佈局,以便有一些視圖和滾動視圖 - 那麼您就可以縮小導致錯誤的因素。哦,保持我原來的修復方式 - 這是它應該完成的方式。祝你好運! –

0

恐怕這個問題可能與ScrollView有關:看起來像你不能在ScrollView中放置SlidingDrawer。檢查出this thread爲同一個問題。這傢伙的解決方案是讓ScrollView Wrap除了SlidingDrawer之外的所有東西。然後他把ScrollView和SlidingDrawer都放到了RelativeLayout中 - 似乎對他有用,你應該試一試(我也會這麼做)。

[編輯]我給它一個鏡頭,這裏是它如何工作對我來說:

 RelativeLayout mainContainer = new RelativeLayout(context); 
     mainContainer.setLayoutParams(new RelativeLayout.LayoutParams(LayoutParams.FILL_PARENT, 
       LayoutParams.FILL_PARENT)); 

     ScrollView scrollView = new ScrollView(context); 
     scrollView.setLayoutParams(new ScrollView.LayoutParams(LayoutParams.FILL_PARENT, 
       LayoutParams.FILL_PARENT)); 
     // Add furhter children to scrollview if you wish to 
     // Add the scrollview to the main container 
     mainContainer.addView(scrollView); 
     // Create your SlidingViewer, for instance be inflating it using the layout inflater 
     // Inflate from pre-written layout 
     // getSystemService is only available from an Activity 
     LayoutInflater inflater = (LayoutInflater)getSystemService(
       Context.LAYOUT_INFLATER_SERVICE); 
     // We dont have the parent view yet, will be added by the layouter 
     SlidingDrawer slidingDrawer = (SlidingDrawer) inflater.inflate(R.layout.sliding_drawer_layout, null); 

     // Add Sliding drawer at the bottom 
     mainContainer.addView(new SlidingDrawerWidget(context, new AttributeContainer()).getView()); 
+0

好吧我測試了上面的方法,它的工作原理,我會盡力根據更多的代碼更新我的帖子。 – AgentKnopf

2

你必須指定layout_height屬性維度,如android:layout_height="100dp"

+0

我不得不指定layout_width到指定的大小 –