2012-07-20 120 views
2

我開發了一個時鐘小部件。在許多設備上看起來很好。除了摩托羅拉Xoom,因爲它屬於XLARGE類別。如何處理Android XLarge屏幕?

這是clock.xml

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:background="#00000000" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content"> 

<AnalogClock android:id="@+id/AnalogClock" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:dial="@drawable/widgetclock" 
    android:hand_hour="@drawable/widgethour" 
    android:hand_minute="@drawable/widgetminute" /> 

    <!-- Time Row --> 
    <LinearLayout 
     android:id="@+id/lltimeheaderrow" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"   
     android:orientation="horizontal" 
     android:layout_gravity="center|top" 
     android:layout_marginTop="45dp" 
     android:visibility="gone"> 

     <!-- TIME --> 
     <LinearLayout android:id="@+id/llTimeDefault" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:orientation="vertical" 
      android:gravity="center"> 

      <LinearLayout 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:orientation="horizontal"> 

      <TextView 
       android:id="@+id/HOUR" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:textColor="@color/my_gray" 
       android:textStyle="bold" 
       android:textSize="15sp"/> 

      <TextView 
       android:id="@+id/MINUTE" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:textColor="@color/my_gray" 
       android:textStyle="bold" 
       android:textSize="15sp" /> 
      </LinearLayout> 

      <TextView 
       android:id="@+id/AM_PM" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:textColor="@color/my_gray" 
       android:textStyle="bold" 
       android:textSize="13sp" 
       android:padding="1dp" />       
     </LinearLayout> 
    </LinearLayout>  

    <!-- Calendar Graph --> 
    <LinearLayout 
     android:id="@+id/llCalGraph" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:orientation="vertical" 
     android:layout_gravity="center|left"  
     android:layout_marginLeft="45dp"> 
      <FrameLayout android:layout_width="fill_parent" 
       android:layout_height="fill_parent"> 
       <ImageView 
        android:id="@+id/CalendarImg" 
        android:src="@drawable/calendar" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content"/>      
       <TextView android:id="@+id/DateDayG" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:layout_gravity="center|top" 
        android:layout_marginTop="3dp" 
        android:textSize="11sp" 
        android:textStyle="bold" 
        android:textColor="@color/my_gray" 
        android:shadowColor="@color/my_black" 
        android:shadowDx="1" 
        android:shadowDy="1" 
        android:shadowRadius="2"     
        ></TextView>  
       <TextView android:id="@+id/DateNoG" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:layout_gravity="center" 
        android:layout_marginTop="5dp" 
        android:textSize="25sp" 
        android:textColor="@color/my_gray" 
        ></TextView>  
      </FrameLayout>    

    </LinearLayout>    

    <!-- BATTERY --> 
    <LinearLayout 
     android:id="@+id/llBattGraph" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:orientation="vertical" 
     android:layout_gravity="center|right" 
     android:layout_marginRight="45dp">    
      <FrameLayout android:layout_width="fill_parent" 
       android:layout_height="fill_parent"> 
       <ImageView 
        android:id="@+id/BatteryImg" 
        android:src="@drawable/batt_00" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content"/> 
       <ImageView 
        android:id="@+id/BatteryFlashing" 
        android:src="@drawable/flashing" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:layout_gravity="center" 
        android:layout_marginTop="13dp" 
        android:layout_marginLeft="2dp" 
        android:visibility="gone" />       
       <TextView 
        android:id="@+id/BatteryLevel" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:textColor="@color/my_gray" 
        android:textSize="18sp" 
        android:layout_gravity="center" /> 


      </FrameLayout>    
    </LinearLayout>      

    <!-- Weather Row --> 
    <LinearLayout 
     android:id="@+id/llweatherrow" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"   
     android:orientation="horizontal" 
     android:layout_gravity="center|bottom" 
     android:layout_marginBottom="45dp"> 

     <!-- WEATHER IMAGE --> 
     <LinearLayout 
      android:id="@+id/llWeatherImage" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:visibility="visible" 
      android:layout_gravity="center"> 

      <ImageView android:id="@+id/ivWeather" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:background="@drawable/w3200" 
       /> 
     </LinearLayout> 

    </LinearLayout>  

</FrameLayout> 

基本上它對插件4層的元件。上,下。左和右部分。 我只是使用FrameLayout作爲基礎佈局,並且每個元素都使用LinearLayout以及重力45dp到每個角落。

這是小部件在Xoom上的外觀 我期待的元素位置應該在我繪製的紅色圓圈上。

  1. 什麼是我應該使用的最佳佈局組合?你能建議嗎?
  2. 假設我堅持這種佈局。如何爲Xoom設備提供替代佈局?我試圖把clock.xml的佈局XLARGE和繪製,XLARGE,但沒有...

回答

3

最好的和更合適的方法是創建一個文件夾layout-xlarge,並在那裏包括clock.xml將被加載時,目標設備具有xlarge佈局。

這樣,你就可以根據屏幕大小,密度等,得到了來自開發者文檔http://developer.android.com/guide/practices/screens_support.html#DeclaringTabletLayouts

另一個解決方案是把所有的大小是在一定45dpXdp入值做出不同的佈局文件夾名爲dimen,然後在xml中聲明它們爲:...="@dimen/largeButton",並使用前面提到的相同方法創建相應的values-xlarge,並在其中添加相應的dimen文件。

這是非常有用的機制,因爲您可以根據屏幕的大小創建不同的佈局,並使其能夠獲得不同大小的不同密度像素。如果您還沒有聽說過任何這些條款,請提供更多詳細信息。

編輯:從文檔

res/layout/my_layout.xml    // layout for normal screen size ("default") 

res/layout-small/my_layout.xml  // layout for small screen size 

res/layout-large/my_layout.xml  // layout for large screen size 

res/layout-xlarge/my_layout.xml  // layout for extra large screen size 

res/layout-xlarge-land/my_layout.xml // layout for extra large in landscape orientation 

你完全相信這樣的目錄?與像clock.xml這樣的佈局具有相同的文件名?

ANOTHER編輯評論:

這是更有效,因爲在更換隻是數字,而不是裝載一個完整的佈局文件夾中的過渡更加有效,因爲你可以猜到。儘管如此,您可以重新使用維度,而不是在佈局之間來回檢查「這個維度又是什麼?」就像在一個大按鈕的固定維度中一樣。

而且更重要的是,每個文件夾都可以因特定原因進行擴展。如果你想要相同的佈局,但不同的尺寸,那麼你應該覆蓋尺寸不復制粘貼整個佈局。更有意義,不是嗎?

而這一努力幾乎是一回事。像layout-large/文件夾,你將有values-large/。我在互聯網上提供的文件中有一個很好的例子。

+0

layout-xlarge不起作用該文件夾內的xml永遠不會被加載。爲什麼? – rxlky 2012-07-20 18:28:55

+0

抱歉我的錯誤應該是佈局大。順便說一句,如何以149 dpi的800x1280 LARGE不XLARGE。根據http://developer.android.com/guide/practices/screens_support.html#testing 1280x800(WXGA)160dpi被認爲是XLARGE – rxlky 2012-07-20 18:44:15

+0

我編輯了我的答案,供將來使用並涵蓋任何細節。我不知道每部手機的規格,但在我提供的文檔中有關於您可以在市場上找到的每種屏幕寬度和屏幕密度的全部詳細信息,以及您需要添加的用於自定義的詳細信息。雖然新的'layout-xxx /'文件夾是提供新佈局的一種非常簡單的方法,請更詳細地檢查我提到的'@ dimen'解決方案,它的效率更高,並且不應該有'... = 45dp' 。只是一個建議... :) – 10s 2012-07-20 18:51:48