android:在运行时通过膨胀来重用XML中的RelativeLayout?

时间:2011-09-23 05:22:33

标签: android xml relativelayout

问题版

它已经在一个单独的xml(tablet_shortterm_column.xml)中,见上文。

无论如何,似乎logcat抱怨rlo_shortterm_col已经有了父级,所以它不会允许另一个ptr_rlo_rght_middle.addView(rlo_shortterm_col)。毫无意义。


我在这个问题上花了这么多时间,仍然无法解决。有人可以帮我一把吗?提前谢谢。

我有一个xml文件(tablet_shortterm_column.xml),它包含我需要重复使用的RelativeLayout,一次又一次。有时很多次在同一个屏幕上一个接一个地水平堆叠。我试图将一个插入现有的RelativeLayout(即一个在另一个内。)

// exerpts

public class TabletMain extends Activity {

       setContentView(R.layout.tablet_main);

      public RelativeLayout ptr_rlo_rght_middle;


      ptr_rlo_rght_middle = (RelativeLayout) findViewById(R.id.rlo_rght_middle); 
      //rlo_rght_middle is in tablet_main.xml


      LayoutInflater inflater = 
      (LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);  
      View llo_tmp = (View) inflater.inflate(R.layout.tablet_shortterm_column,null);

      RelativeLayout rlo_tmp = (RelativeLayout) llo_tmp.findViewById(R.id.rlo_shortterm_col); 
    // rlo_shortterm_col is the object I want to reuse it a RelativeLayout and is inside 
    // tablet_shortterm_column.xml

       RelativeLayout.LayoutParams rlo_layoutparams;
       rlo_layoutparams = new RelativeLayout.LayoutParams( 
           RelativeLayout.LayoutParams.WRAP_CONTENT, 
           RelativeLayout.LayoutParams.WRAP_CONTENT); 

       rlo_layoutparams.addRule(RelativeLayout.RIGHT_OF, R.id.llo_rght_middle_col1); 
       // llo_rght_middle_col1 is a RelativeLayout inside tablet_main.xml,
       // I want to put another RelativeLayout view right next to it.

       rlo_tmp.setLayoutParams(rlo_layoutparams);

       ptr_rlo_rght_middle.addView(rlo_tmp);  //Application crashes right on this line.

} //end Activity

// * ** * ** * ** * ** * ** * ** * ** tablet_shortterm_column.xml的内容

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
      android:orientation="vertical"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      >
        <RelativeLayout 
                android:id="@+id/rlo_shortterm_col" 
                android:layout_width="180dp" 
                android:layout_height="fill_parent" 
                android:background="#436699"
                android:orientation="vertical"
                android:layout_margin="3px" 
                android:weightSum="1"
            > <!-- android:background="#32CD32" android:layout_height="365dp" android:layout_margin="30px"  -->
                <Button 
                    android:id="@+id/btn_shortterm_col"
                    android:layout_alignParentTop="true"
                    android:text="Tuesday Afternoon" 
                    android:layout_margin="15px" 
                    android:textSize="12px"
                    android:textColor="#FFFFFF"
                    android:layout_width="wrap_content" 
                    android:layout_gravity="center_horizontal" 
                    android:background="#296699"
                    android:layout_height="wrap_content"
                    android:layout_centerHorizontal="true"
                > <!--android:background="#32CD32"  -->
                </Button>
                <ImageView
                    android:id="@+id/iv_shortterm_col"
                    android:layout_below="@+id/btn_shortterm_col"
                    android:src="@drawable/tblet_icon14_med" 
                    android:layout_width="wrap_content" 
                    android:layout_height="wrap_content" 
                    android:layout_centerHorizontal="true"
                ><!--  android:src="@drawable/tblet_shape1" android:layout_gravity="center_horizontal" -->
                </ImageView>
                <TextView
                    android:id="@+id/tv_shortterm_col1" 
                    android:layout_below="@+id/iv_shortterm_col"
                    android:text="-10ºC" 
                    android:layout_width="wrap_content" 
                    android:layout_height="wrap_content"
                    android:layout_margin="10px"

                    android:background="#DCDCDC"
                    android:textColor="#000000"
                    android:textSize="12px"
                    android:layout_centerHorizontal="true"
                > <!--  android:layout_gravity="center_horizontal" -->
                </TextView>
                <TextView 
                    android:id="@+id/tv_shortterm_col2" 
                    android:layout_below="@+id/tv_shortterm_col1"
                    android:text="Flurries" 
                    android:layout_width="wrap_content" 
                    android:layout_height="wrap_content" 

                    android:layout_margin="10px"

                    android:background="#DCDCDC"
                    android:textColor="#000000"
                    android:textSize="12px"
                    android:layout_centerHorizontal="true"
                >
                </TextView>
                <RelativeLayout 
                    android:id="@+id/rlo_shortterm_col_1" 
                    android:layout_below="@+id/tv_shortterm_col2"
                    android:src="@drawable/tblet_shape2"
                    android:background="#32CD32" 
                    android:layout_height="113dp"
                    android:layout_margin="40px" 
                    android:layout_width="125dp"
                > <!--android:background="#32CD32"  android:orientation="vertical"  -->
                </RelativeLayout>           
            </RelativeLayout>    
</LinearLayout>

2 个答案:

答案 0 :(得分:0)

为RelativeLayout创建一个单独的xml文件,然后根据需要多次充气。

答案 1 :(得分:0)

llo_tmp是您尝试重用的RelativeLayout的父视图。因此,您无法将其添加到另一个ViewGroup,并且您会收到该logcat错误。

您可以从xml文件中删除LinearLayout内容并以相同的方式对xml文件进行膨胀(尽管可能不是返回View而是返回RelativeLayout)。您不应该必须更改大部分java代码,因为引用仍然是相同的。

或者,快速修复可能是将llo_tmp添加到ViewGroup而不是rlo_tmp。无论哪种方式,rlo_tmp已经有一个父级,无法重用。由于您没有填充整个屏幕宽度的布局,因此您可能不希望这样。