2011-02-15 137 views
0

經過關於這個話題的許多問題,我仍然沒有完全解決這個問題。 最後,第一個圖像視圖總是被「覆蓋」,或者說更好地被另一個視圖重疊,該視圖應該放在該視圖的右側。Android動態RelativeLayout和子視圖創建

在擴展RelativeLayout之後,是否只需要覆蓋子視圖佈局的onLayout()方法就足夠了? onLayout方法是將所有的孩子放在一個通行證中,還是每個特定的孩子都需要?如果我想使用RelativeLayouts特定的placemnts(RIGHT_OF,BELOW等...),那麼onLayout方法應該如何實現子部署?

在創建視圖時,如何創建一個沒有layoutparams的視圖,甚至有可能嗎?

編輯:好的,我避免使用任何形式的getWidth,仍然得到不好的佈局。圖標第一行混合但滿(5個圖標),下一行只有1個圖標,2個丟失。在這一點上,我非常沮喪,因爲這是一個愚蠢的問題,我似乎無法找到問題所在,爲什麼官方開發者教程對動態佈局和視圖有更多幫助?

從向下Log.e說: 2:RIGHT 1 3:RIGHT 2 4:3 5 RIGHT:RIGHT OF 4 6:低於1 7:RIGHT OF 6 8:RIGHT OF 7 9:正確的8

這就是它應該是這樣但它不起作用的方式,我不能設置相對位置佈局應該已經佈局?

private void loadResources() { 

cursor = managedQuery(Browser.BOOKMARKS_URI, projection, selection, 
null, SORT_BY_COLUMN + " " + SORT_ORDER); 
this.startManagingCursor(cursor); 

ImageView previousBookmark; 

int idOfViewToTheLeft = 1; 

if(cursor.moveToFirst()) { 
    bookmarkCounter = 1; 
    ByteArrayInputStream blobImage; 

    int size = (int) scale * FAVICON_SIZE; 
    int screenWidth = getWindowManager().getDefaultDisplay().getWidth(); 
    int rowBookmarkCount = (int) (screenWidth/(size + scale*leftMargin)); 

    do{ 
     bookmark = new ImageView(this); 
     bookmark.setId(bookmarkCounter++); 
     bookmark.setBackgroundColor(Color.WHITE); 

     blobImage = new ByteArrayInputStream(
       cursor.getBlob(cursor.getColumnIndex(BookmarkColumns.FAVICON))); 

     bookmark.setImageDrawable(
       Drawable.createFromStream(blobImage, "" + bookmark.getId())); 

     urls.put(bookmark.getId(), 
       cursor.getString(
         cursor.getColumnIndex(BookmarkColumns.URL))); 

     bookmark.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       Intent browserIntent = new Intent(
         Intent.ACTION_VIEW, Uri.parse(urls.get(v.getId()))); 
       startActivity(browserIntent); 
      } 
     }); 

     lp = new RelativeLayout.LayoutParams(size, size); 

     lp.topMargin = (int) (scale * topMargin); 
     lp.leftMargin = (int) (scale * leftMargin); 
     if(bookmark.getId() > 1) { 
      previousBookmark = (ImageView) findViewById(bookmark.getId() - 1); 

      if((bookmark.getId() % (rowBookmarkCount + 1)) != 0) 
      { 
       Log.e("" + bookmark.getId(), "RIGHT OF " + previousBookmark.getId()); 
       lp.addRule(RelativeLayout.RIGHT_OF, previousBookmark.getId()); 
      } else { 
       Log.e("" + bookmark.getId(), "BELOW " + idOfViewToTheLeft); 
       lp.addRule(RelativeLayout.BELOW, idOfViewToTheLeft); 
       idOfViewToTheLeft = bookmark.getId(); 
      } 
     } 

     bookmarkLayout.addView(bookmark, lp); 
    } while (cursor.moveToNext()); 
} 
} 

回答

0

我在最後做了什麼,是退出使用相對參數來描述視圖相對於其他視圖的位置。相反,我自己完成了所有的數學計算,並將所有內容都放入了setMargins中,希望這同樣能夠比使用Relativelayouts方法更快地算出它。

private void loadResources() { 

cursor = managedQuery(Browser.BOOKMARKS_URI, projection, selection, 
null, SORT_BY_COLUMN + " " + SORT_ORDER); 
this.startManagingCursor(cursor); 

if(cursor.moveToFirst()) { 
    bookmarkCounter = 0; 
    ByteArrayInputStream blobImage; 

    int leftMargin = (int) (scale * this.leftMargin); 
    int topMargin = (int) (scale * this.topMargin); 
    int size = (int) scale * FAVICON_SIZE; 
    int screenWidth = getWindowManager().getDefaultDisplay().getWidth(); 
    int rowBookmarkCount = (int) (screenWidth/(size + leftMargin)); 

    do{ 
     bookmark = new ImageView(this); 
     bookmark.setId(bookmarkCounter++); 
     bookmark.setBackgroundColor(Color.WHITE); 

     blobImage = new ByteArrayInputStream(
       cursor.getBlob(cursor.getColumnIndex(BookmarkColumns.FAVICON))); 

     bookmark.setImageDrawable(
       Drawable.createFromStream(blobImage, "" + bookmark.getId())); 

     urls.put(bookmark.getId(), 
       cursor.getString(
         cursor.getColumnIndex(BookmarkColumns.URL))); 

     bookmark.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       Intent browserIntent = new Intent(
         Intent.ACTION_VIEW, Uri.parse(urls.get(v.getId()))); 
       startActivity(browserIntent); 
      } 
     }); 

     lp = new RelativeLayout.LayoutParams(size, size); 
     lp.setMargins(
       (int) (leftMargin + (bookmark.getId() % rowBookmarkCount) * (size + leftMargin)), 
       (int) (topMargin + (bookmark.getId()/rowBookmarkCount) * (size + topMargin)), 
       0, 0); 
     bookmarkLayout.addView(bookmark, lp); 
    } while (cursor.moveToNext()); 
    setContentView(scrollView); 
} 
} 
0

對於標準組件,您並不需要重寫onLayout,如果您希望它們像往常一樣佈局組件。如果你重寫onLayout並且不要調用super.onLayout,那麼你必須手動定位所有的孩子。

否則,只要使用與RelativeLayout.LayoutParams添加規則(下面,在上面,等等。),並將其設置添加視圖addView(youView,yourLayoutParamsInstance)

+0

見這就是問題所在,他們告訴我,我不能在創建更改視圖位置,因爲我需要它不能在該階段中使用的getWidth方法。 @AlexOrlov – lpandzic 2011-02-15 15:40:53

+0

如果我記得正確的話,onMeasure會在onLayout之前調用,這就是您可以通過父級強制獲取佈局的尺寸。 在我的練習中,通過getWidth獲取維度對於這樣的任務是毫無意義和錯誤的。 – 2011-02-15 15:51:58

0

RelativeLayout大多數邏輯的過程中實際發生時測量階段,所以不,只是覆蓋onLayout是最不可能的。

如果你想擴展RelativeLayout,恐怕你得習慣了它的源代碼,否則這將是十分困難的理解如何影響它的行爲。你應該真的考慮找到另一個解決方案,因爲你真的用RelativeLayout選擇了一個更復雜的類。