自定义视图,将它们动态插入到Java中的布局中

时间:2014-04-09 11:14:27

标签: java android android-layout

我经常不能强调,我是Android和Java的新手:-) 而这些xml布局让我头疼。

你看到的代码由RelativeLayout中的两个ImageView和两个TextView组成,它们形成了一个布局,对我来说是一个"自定义按钮"。当我将其复制并粘贴到我的布局中时,它几乎按照我想要的方式工作。

每当我需要这样的按钮并且仍然能够更改某些属性(如textviews中的文本)时,如何在我的代码中动态使用xml-layout的这一部分?

我希望你理解我的意思,我的第一语言不是英语。

<RelativeLayout
    android:layout_width="wrap_content"
    android:layout_height="match_parent" >

    <ImageView
        android:id="@+id/myImageView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"

        android:layout_marginTop="20dp"
        android:layout_marginLeft="10dp"
        android:src="@drawable/box" />

    <TextView
        android:id="@+id/myImageViewText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/myImageView"
        android:layout_alignLeft="@+id/myImageView"
        android:layout_alignRight="@+id/myImageView"
        android:layout_alignTop="@+id/myImageView"
        android:layout_margin="1dp"
        android:gravity="center"
        android:text="S-"
        android:textColor="#000000"
        android:textStyle="bold" />

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/myImageViewText"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="25dp"
        android:text="your turn!"
        android:textAppearance="?android:attr/textAppearanceSmall" />

    <ImageView
        android:id="@+id/imageView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_above="@+id/textView1"
        android:layout_alignParentTop="true"
        android:layout_marginBottom="15dp"
        android:layout_marginTop="-10dp"
        android:cropToPadding="false"
        android:src="@drawable/icon" />

</RelativeLayout>

3 个答案:

答案 0 :(得分:3)

好的开始扩展您自己的视图,如下所示:

我在{x}设计的Button中使用ImageViewTextView制作了LinearLayout

<强> XML

<merge xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <ImageView
        android:id="@+id/ivImage"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="3dp"
        android:adjustViewBounds="true"
        android:padding="3dp"
        android:scaleType="fitStart" />

    <TextView
        android:id="@+id/tvText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="2dp"
        android:layout_marginLeft="10dp"
        android:ellipsize="end"
        android:singleLine="true"
        android:textColor="@android:color/white" />

</merge>

ViewObject名为

<强> ViewMenuButton

public class ViewMenuButton extends View{

    private TextView tvText;
    private ImageView ivImage;

    public ViewMenuButton(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);        
        init();
    }
    public ViewMenuButton(Context context, AttributeSet attrs) {
        super(context, attrs);      
        init();
    }
    public ViewMenuButton(Context context) {
        super(context);
        init();
    }


    private void init() {           
        LayoutInflater inflater = (LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        //here you can inflate a own XML for that View
        inflater.inflate(R.layout.view_menubutton, this, true);  
        this.tvText= (TextView)this.findViewById(R.id.tvText);      
        this.ivImage = (ImageView)this.findViewById(R.id.ivImage);

    }

    public void setText(String text){
        if(this.tvText != null){
            tvText.setText(text);
        }
    }

    //... and so on

}

每当您想在xml中使用它时,请确保为View提供完整的包,如下所示:

使用XML

<com.your.package.views.ViewMenuButton
        android:id="@+id/menu_bt_local"
        android:layout_width="wrap_content"
        android:layout_height="0dp"
        android:layout_marginTop="15dp"
        android:layout_weight="1"
        android:background="@drawable/action_button"
        android:textSize="@dimen/text_cell"   >

如果你想在代码中使用它,就像这样:

用法JAVA

LinearLayout rootView = 
  (LinearLayout) findViewById(R.id.mainLayout); //Or sth like this
ViewMenuButton vmb = new ViewMenuButton(this);
rootView.add(vmb);

//or if you already have it in XML
ViewMenuButton vmb = (ViewMenuButton) findViewById(R.id.myVmbtID);

您甚至可以更详细地定义要在XML中使用的属性,例如设置Image的来源,更改Text,更改TextColor等等{ {3}}

答案 1 :(得分:0)

创建自定义View子类。在其构造函数中扩展您的布局,在那里找到必要的视图并创建必要属性的setter / getter。然后,每次需要此自定义按钮时,您都可以使用此子类通过代码或xml创建它。如果您还需要能够从xml更改某些属性,则可能需要为自定义视图声明可设置样式的属性。我想你可以找到很多关于如何创建自定义视图的教程。

Here是常用教程。 Here您可以阅读有关自定义属性的信息。最后here是我上面提到的最好的例子。

答案 2 :(得分:0)

您可以对布局进行充气并将其添加到其他布局

  RelativeLayout layout = new RelativeLayout(this);

  View childButton = getLayoutInflater().inflate(R.layout.child_button, null);
  layout.addView(childButton);

现在,您可以在按钮布局中找到子视图

 TextView textViewInnerChild = (TextView)childButton.findViewById(R.Id. textInnerView):

然后,您可以更改内部子视图的值或属性

 textViewInnerChild.set text("your text")