2011-12-30 76 views
0

我對android編程頗爲陌生,但對java並不陌生。當我分割xml佈局時呈現的視圖不同

我一直在嘗試設置一個不平凡的視圖,而且我有一個奇怪的問題。我設計了一個水平滾動單個播放器面板的佈局(它是另一個ScoreKeeper)

所以我創建了一個playermain.xml,帶有Horizo​​ntalScrollView和LinearLayout以包含動態添加的播放器面板,它們是TableLayout。

我想playerpanel按鈕和領域延伸到垂直消耗所有可用打空間(我也有水平的一些目標,但讓我們忽略那些現在)

沒有我想會得到播放面板伸展 - 相反,他們居中,但不填。奇怪的是,我嘗試了一個快速測試,即創建一個平面版本的xml文件(即,我將playerpanel xml的兩個副本複製到主要xml中,當我簡單地將ContentView設置爲這個組合xml時,我得到視圖我想要

當我以編程方式進行編程時,我沒有得到延伸,我必須在這裏丟失一些東西。我也可以發佈組合的XML,但我認爲這是不必要的,基本上當我創建一個單一的XML當我用一個xml文件創建Scroll/Layout,然後將其他項目添加到頂層LinearLayout中時,它們不會伸展。

onCreate:使用Scrolls,Layout和Tablelayouts創建文件, < ---- SNIP ----->

setContentView(R.layout.playingmain); 
    final LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    LinearLayout llayout = (LinearLayout)findViewById(R.id.layout1); 


     TableLayout tl = (TableLayout)inflater.inflate(R.layout.playerpanel, null); 
     InitializePlayer(player1,tl); 
     llayout.addView(tl); 

< ---- SNIP ----->

MAINPANEL.XML

<HorizontalScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:scrollbars="horizontal" 


    > 

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:id="@+id/layout1" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:orientation="horizontal" 
     android:isScrollContainer="true" 
     android:scrollbarAlwaysDrawHorizontalTrack="true" 
     android:gravity="center" 
     > 
    </LinearLayout> 

</HorizontalScrollView> 

個人Panel.xml:

<TableLayout 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:paddingLeft="5sp" 
     android:stretchColumns="*" 
     android:minWidth="200sp" 
     > 

     <TableRow 
      android:id="@+id/NameRow" 
      android:minWidth="500sp" 
      android:layout_weight = "1" 
      > 

      <TextView 
       android:id="@+id/PlayerName" 
       android:text="PlayerName" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 

       /> 

      <TextView 
       android:id="@+id/dbg1" 
       android:text="TextView" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 

       /> 

     </TableRow> 

     <TableRow 
      android:id="@+id/scoreRow" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:layout_weight = "1" 
      > 

      <TextView 
       android:id="@+id/currentScore" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:text="10" 
       android:textAppearance="?android:attr/textAppearanceLarge" 
       /> 

      <TextView 
       android:id="@+id/dbg2" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:text="TextView" 
       /> 

     </TableRow> 

     <TableRow 
      android:id="@+id/TableRow17" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:layout_weight = "1" 
      > 

      <Button 
       android:id="@+id/subtractButton" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:text="-" 
      /> 

      <EditText 
       android:id="@+id/scoreEntry" 
       android:layout_span = "2" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:inputType="number" /> 

      <Button 
       android:id="@+id/addButton" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:text="+" 
       /> 
     </TableRow> 

     <TableRow 
      android:id="@+id/tableRow1" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:layout_weight = "1" 
      > 

      <Button 
       android:id="@+id/plusOne" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:text="+1" /> 

      <Button 
       android:id="@+id/plusFive" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:text="+5" /> 

      <Button 
       android:id="@+id/minusOne" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:text="-1" /> 

      <Button 
       android:id="@+id/minusFive" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:text="-5" /> 

     </TableRow> 

    </TableLayout> 

回答

0

Akameswaran,

這種差異性的原因很簡單:XML是「stati cally「定義爲基於這些靜態參數的動態結果。也就是說,XML使用這些XML文件定義的初始狀態來提供初始通貨膨脹。該代碼允許在運行時進行更改,並且即使位置和維數不變,引擎也會將其視爲「動態」。這爲那些不熟悉Android的人帶來了一些非常有趣的關係。

當您有一個XML文件時,在通貨膨脹期間,渲染引擎知道所有對象是什麼以及它們與視圖層次結構有何關係。但是,當您拆分XML文件時,它不知道子視圖的屬性依賴於父視圖的屬性,除非您在代碼中告訴它。實質上,這是因爲計算機完全按照您的說法進行操作,並且如果您沒有充分說明,就會嚇壞了。它會「猜測」,但幾乎總是猜錯。就像HTML一樣,如果可以的話,Android會盡可能地提供A RESULT,即使它是錯誤的。

Android提供了幾種方法來解決這個問題:OnLayout()允許您動態地將定位應用到任何活動或視圖對象。 OnMeasure()允許您重新定義維度。 OnDraw()允許您動態繪製或膨脹對象。通過覆蓋這些函數,您可以將行爲恢復到您需要的行爲,並且仍然保持XML模塊化,就像您的願望一樣。由於您使用的是標準化的API控件,因此您可能希望直接在活動中覆蓋這些功能,併爲自己節省很多麻煩。

希望這有助於 FuzzicalLogic

+0

感謝您的輸入,但是,我找到了根本原因。當我添加充氣的.xml文件時,我沒有指定父文件,這導致我的「match_parent」屬性無法應用。這在用戶界面中有記錄 – akameswaran 2011-12-31 13:57:30

1

當我添加膨脹的對象,我需要,而不是指定空的正確父對象。一旦我這樣做了,所有的xml屬性都將它視爲視圖。

我能夠使用層次結構查看器來確認/調試它。

TableLayout tl = (TableLayout)inflater.inflate(R.layout.playerpanel, null); 

需要是

TableLayout tl = (TableLayout)inflater.inflate(R.layout.playerpanel, llayout, false); 
相關問題