2012-06-15 142 views
2

我一直在試圖從xml充滿視圖到它們相應的視圖對象,然後將這些視圖對象添加到編程的視圖組。但是,每當我調用myviewgroup.addView(childview)時,childview似乎都會丟失所有按鈕以及xml代碼應該給它的東西。但是,childview所具有的一件事就是我編寫的背景顏色,以確保兒童視圖具有正確的尺寸。該childview給出正確的尺寸,但沒有它的組件是可見的不能添加虛擬視圖到自定義視圖組

 LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

    viewchanger= new ViewChanger(this); //my viewgroup 
    View mainmenu= inflater.inflate(R.layout.main, null); //the xml code 
    mainmenu.setBackgroundColor(Color.rgb(0, 0, 255)); 
    viewchanger.addView(mainmenu); 
    setContentView(viewchanger); 

上面的代碼只是設置我的屏幕爲藍色的背景,但沒有按鈕的顯示。另外,當我setContentView(mainmenu)一切都顯示從該XML代碼完美以及背景顏色。這個視圖組的重點是,我可以在任何多個視圖之間切換,而不管它們的順序爲childviews。

這裏是viewchanger的代碼。我希望它有7個子視圖,當我調用方法 setView(int v)我希望所有其他視圖都不見了,並且我只希望這一個視圖可見。

public class ViewChanger extends ViewGroup{ 

/**Represent which view to show, only one can show at a time*/ 
public static final int MainMenu=0, ChooseMap=1, MapOptions=2, 
     SetLocation=3, view=4, EditMap=5, CreateMap=6; 
private int current; //the current view 
private View[] views= new View[7]; 

public ViewChanger(Context context) { 
    super(context); 
      //load 7 views into view array here 
      //LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      /*views[0]= inflater.inflate(R.layout.main, null); 
      * views[1]= inflater.inflate(R.layout.choose, null); 
      * views[2]= inflater.inflate(R.layout.mapoptions, null); 
     * views[0].setBackgroundColor(Color.rgb(255, 0, 0)); 
    * views[1].setBackgroundColor(Color.rgb(255, 255, 0)); 
    * views[2].setBackgroundColor(Color.rgb(0, 255, 0));*/ 
    * addView(views[0]); 
    * addView(views[1]); 
    * addView(views[2]); 
      * this is how i want to load the childviews*/ 

} 

@Override 
protected void onLayout(boolean changed, int l, int t, int r, int b) { 
    for(int i = 0; i < getChildCount(); i++){ 
       getChildAt(i).layout(0, 0, getWidth(), getHeight()); 
      } 
} 
    /**Sets the view of the view group, only one view can be viewed at a time*/ 
public void setView(int v){ 
      current=v; 
    for (int i=0; i<views.length; i++){ 
     if (v==i){ 
      views[i].setVisibility(View.VISIBLE); 
     } else{ 
      views[i].setVisibility(View.GONE); 
     } 
    } 
} 

當我加載在ViewChanger構造子視圖中,只有的ViewGroup顯示我的背景顏色的任何視圖的我經歷的setView設置(INT V),而不是按鈕。

這裏是主要的XML代碼,但所有的人看起來非常類似:

<?xml version="1.0" encoding="utf-8"?> 

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:gravity="center" 
    android:orientation="vertical" > 


<TextView 
    android:id="@+id/title" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_gravity="center" 
    android:text="The title" 
    android:textAppearance="?android:attr/textAppearanceLarge" /> 


<TextView 
    android:id="@+id/welcome" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="Welcome [...]" 
    android:textAppearance="?android:attr/textAppearanceLarge" /> 




<Button 
    android:id="@+id/load" 
    android:layout_width="122dp" 
    android:layout_height="wrap_content" 
    android:layout_gravity="center_horizontal" 
    android:text="Load Map" /> 




<Button 
    android:id="@+id/create" 
    android:layout_width="122dp" 
    android:layout_height="wrap_content" 
    android:layout_gravity="center_horizontal" 
    android:text="Create Map" /> 






<Button 
    android:id="@+id/users" 
    android:layout_width="122dp" 
    android:layout_height="wrap_content" 
    android:text="Other User" /> 

</LinearLayout> 
+0

ViewChanger從哪些方面繼承?如果它只是擴展了ViewGroup,它可能沒有預定義的繪圖代碼,並且如果你不提供任何代碼,它將不會繪製任何子代。另外,R.layout.main的內容是什麼? – Xono

+0

我更新了問題,謝謝你的幫助 – Isaac

回答

6

在思考完我能想到的所有事情之後,我創建了一個與此相同的虛擬項目來檢查一些可能性。出於某種原因,ViewChanger從FrameLayout而不是ViewGroup擴展使得這個工作 - 很可能是因爲ViewGroup缺乏渲染它的子視圖所需的東西(我嘗試覆蓋onDraw,但它仍然不起作用)。由於您一次只顯示一個視圖 - 通常使用FrameLayout - 我建議僅進行此更改;它可能比孤立和修復ViewGroup中缺失的繪製功能要容易得多。

public class ViewChanger extends FrameLayout { 

應該是唯一需要作出的更改以獲取原始設計(從構造函數添加視圖)才能正常工作。

+0

你是一位上帝,非常感謝你! – Isaac

+0

這樣做真的很成功,謝謝你太多了 – AMD

1

檢查的FrameLayout聲明。希望它有效。

LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

viewchanger= new ViewChanger(this); //my viewgroup 
View mainmenu= inflater.inflate(R.layout.main, null); //the xml code 
mainmenu.setBackgroundColor(Color.rgb(0, 0, 255)); 
viewchanger.addView(mainmenu); 
FrameLayout frameLayout = (FrameLayout) getWindow().getDecorView().findViewById(android.R.id.content); 
frameLayout.addView(viewchanger); 
+0

你的解決方案確實顯示了一切;不過,我需要mainmenu作爲viewchanger的子視圖。我更新了問題以包含該代碼。感謝您的幫助,如果我的問題不是很清楚,我很抱歉 – Isaac

+0

@Issac檢查更新後的答案。如果它有效,就試試它。 – FireAndIce

3

我有同樣的問題,創建了一個自定義viewGroup,並在其中我添加了一個線性佈局viewGroup,我無法看到線性佈局內容。 我解決了在我的自定義ViewGroup中添加以下代碼的問題: -

@Override 
     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
      // TODO Auto-generated method stub 
      final int count = getChildCount(); 
      for (int i = 0; i < count; i++) { 
       childView = getChildAt(i); 
       childView.measure(widthMeasureSpec, heightMeasureSpec); 
      } 
      super.onMeasure(widthMeasureSpec, heightMeasureSpec); 

     }