通过膨胀布局创build自定义视图?

我试图创build一个自定义的视图,将取代我在多个地方使用的特定布局,但我正在努力这样做。

基本上,我想取代这个:

<RelativeLayout android:id="@+id/dolphinLine" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_centerInParent="true" android:background="@drawable/background_box_light_blue" android:padding="10dip" android:layout_margin="10dip"> <TextView android:id="@+id/dolphinTitle" android:layout_width="200dip" android:layout_height="100dip" android:layout_alignParentLeft="true" android:layout_marginLeft="10dip" android:text="@string/my_title" android:textSize="30dip" android:textStyle="bold" android:textColor="#2E4C71" android:gravity="center"/> <Button android:id="@+id/dolphinMinusButton" android:layout_width="100dip" android:layout_height="100dip" android:layout_toRightOf="@+id/dolphinTitle" android:layout_marginLeft="30dip" android:text="@string/minus_button" android:textSize="70dip" android:textStyle="bold" android:gravity="center" android:layout_marginTop="1dip" android:background="@drawable/button_blue_square_selector" android:textColor="#FFFFFF" android:onClick="onClick"/> <TextView android:id="@+id/dolphinValue" android:layout_width="100dip" android:layout_height="100dip" android:layout_marginLeft="15dip" android:background="@android:drawable/editbox_background" android:layout_toRightOf="@+id/dolphinMinusButton" android:text="0" android:textColor="#2E4C71" android:textSize="50dip" android:gravity="center" android:textStyle="bold" android:inputType="none"/> <Button android:id="@+id/dolphinPlusButton" android:layout_width="100dip" android:layout_height="100dip" android:layout_toRightOf="@+id/dolphinValue" android:layout_marginLeft="15dip" android:text="@string/plus_button" android:textSize="70dip" android:textStyle="bold" android:gravity="center" android:layout_marginTop="1dip" android:background="@drawable/button_blue_square_selector" android:textColor="#FFFFFF" android:onClick="onClick"/> </RelativeLayout> 

这样:

 <view class="com.example.MyQuantityBox" android:id="@+id/dolphinBox" android:layout_width="fill_parent" android:layout_height="wrap_content" android:myCustomAttribute="@string/my_title"/> 

所以,我不想要一个自定义的布局,我想要一个自定义的视图(这个视图不应该有可能有孩子)。

唯一可能从MyQuantityBox的一个实例改变到另一个是标题。 我非常希望能够在XML中指定它(就像我在最后一行XML中所做的那样)

我怎样才能做到这一点? 我应该将RelativeLayout放在/ res / layout中的XML文件中,并将其充入MyBoxQuantity类中? 如果是,我该怎么做?

谢谢!

是的,你可以做到这一点。 RelativeLayout,LinearLayout等是视图,所以自定义布局是一个自定义视图。 只是要考虑,因为如果你想创build一个自定义的布局,你可以。

你想要做的是创build一个复合控制。 你将创build一个RelativeLayout的子类,在代码中添加我们所有的组件(TextView等),在你的构造函数中你可以读取从XML传入的属性。 然后,您可以将该属性传递给标题TextView。

http://developer.android.com/guide/topics/ui/custom-components.html

有点旧了,但是我以为分享了我该怎么做,基于chubbsondubs的回答:我使用FrameLayout (见文档 ),因为它被用来包含一个单一的视图,并从它的xml视图膨胀。

代码如下:

 public class MyView extends FrameLayout { public MyView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); initView(); } public MyView(Context context, AttributeSet attrs) { super(context, attrs); initView(); } public MyView(Context context) { super(context); initView(); } private void initView() { View view = inflate(getContext(), R.layout.my_view_layout, null); addView(view); } } 

使用布局inflater,如下所示

  public View myView(){ View v; // Creating an instance for View Object LayoutInflater inflater = (LayoutInflater)getBaseContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); v = inflater.inflate(R.layout.myview, null); TextView text1 = (TextView) v.findViewById(R.id.dolphinTitle); Button btn1 = (Button) v.findViewById(R.id.dolphinMinusButton); TextView text2 = (TextView) v.findViewById(R.id. dolphinValue); Button btn2 = (Button) v.findViewById(R.id. dolphinPlusButton); return v; } 

在实践中,我发现你需要小心一点,特别是如果你反复使用一些xml的话。 假设,例如,你有一个表,你希望为列表中的每个条目创build一个表行。 你已经设置了一些XML:

my_table_row.xml

 <?xml version="1.0" encoding="utf-8"?> <TableRow xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/myTableRow"> <ImageButton android:src="@android:drawable/ic_menu_delete" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/rowButton"/> <TextView android:layout_height="wrap_content" android:layout_width="wrap_content" android:textAppearance="?android:attr/textAppearanceMedium" android:text="TextView" android:id="@+id/rowText"></TextView> </TableRow> 

然后你想用一些代码每行创build一次。 它假定你已经定义了一个父TableLayout myTable来附加行。

 for (int i=0; i<numRows; i++) { /* * 1. Make the row and attach it to myTable. For some reason this doesn't seem * to return the TableRow as you might expect from the xml, so you need to * receive the View it returns and then find the TableRow and other items, as * per step 2. */ LayoutInflater inflater = (LayoutInflater)getBaseContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); View v = inflater.inflate(R.layout.my_table_row, myTable, true); // 2. Get all the things that we need to refer to to alter in any way. TableRow tr = (TableRow) v.findViewById(R.id.profileTableRow); ImageButton rowButton = (ImageButton) v.findViewById(R.id.rowButton); TextView rowText = (TextView) v.findViewById(R.id.rowText); // 3. Configure them out as you need to rowText.setText("Text for this row"); rowButton.setId(i); // So that when it is clicked we know which one has been clicked! rowButton.setOnClickListener(this); // See note below ... /* * To ensure that when finding views by id on the next time round this * loop (or later) gie lots of spurious, unique, ids. */ rowText.setId(1000+i); tr.setId(3000+i); } 

有关处理rowButton.setOnClickListener(this)的简单示例,请参阅Onclicklistener以获得编程创build的button 。