2

我一直在尝试将视图从 xml 膨胀到它们相应的视图对象,然后将这些视图对象添加到编程的视图组中。但是,每当我调用 myviewgroup.addView(childview) 时,childview 似乎丢失了 xml 代码应该给它的所有按钮和东西。但是,子视图确实具有的一件事是我编写的背景颜色,以确保子视图具有正确的尺寸。子视图具有正确的尺寸,但其组件均不可见

     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 代码以及背景颜色都会完美显示所有内容。这个视图组的重点是,我可以在多个视图中的任何一个之间切换,而不管它们作为子视图的顺序如何。

这是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 构造函数中加载子视图时,视图组只显示我通过 setView(int v) 设置的任何视图的背景颜色,而不是按钮。

这是 main 的 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>
4

3 回答 3

6

在对所有我能想到的东西进行了心理思考之后,我创建了一个与此相同的虚拟项目来检查几种可能性。出于某种原因,让 ViewChanger 从 FrameLayout 扩展而不是 ViewGroup 使得这项工作 - 很可能是因为 ViewGroup 缺少渲染它的子视图所需的东西(我尝试覆盖 onDraw,但它仍然没有工作)。由于您一次只显示一个视图 - 通常使用 FrameLayout - 我建议只进行此更改;这可能比隔离和修复 ViewGroup 中缺少的绘图功能要容易得多。

public class ViewChanger extends FrameLayout {

应该是使原始设计(从构造函数添加视图)正常工作所需进行的唯一更改。

于 2012-06-15T23:44:32.683 回答
3

我遇到了同样的问题,创建了一个自定义视图组,并在其中添加了一个线性布局视图组,但我看不到线性布局内容。我解决了在自定义 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);

        }
于 2012-09-26T06:37:11.653 回答
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);
于 2012-06-15T17:51:05.383 回答