如何在运行时将复合控件添加到布局?

时间:2011-08-12 08:35:50

标签: android runtime custom-controls

我使用xml创建了一个复合控件,并且可以通过放入其他xml来重用它 布局。但我想在运行时使用java代码添加它。我尝试了以下代码,但只显示了textview,并且未显示复合控件...

我对安卓很新,所以会很感激任何帮助或建议..

复合 - 控制布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout   xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:background="@drawable/border_lines"

>
    <TextView android:id="@+id/msg_title"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="SAMPLE MESSAGE TITLE"
    />
    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
    >
        <Button android:id="@+id/btn_shw"
            android:layout_width="wrap_content"
            android:layout_height="fill_parent"
            android:text="SHOW MSG"
            android:layout_weight="1"
        />
        <Button android:id="@+id/btn_dis"
            android:layout_width="wrap_content"
            android:layout_height="fill_parent"
            android:text=" DISABLE"
            android:layout_weight="1"
        />
        <Button android:id="@+id/btn_del"
            android:layout_width="wrap_content"
            android:layout_height="fill_parent"
            android:text=" DELETE "
            android:layout_weight="1"
        />
    </LinearLayout>    
</LinearLayout>

复合控制代码

public class RemainderControl extends LinearLayout
{
    Button btn1,btn2,btn3;
    TextView tv1;
    public RemainderControl(Context context)
    {
        super(context);
            LayoutInflater inflater=LayoutInflater.from(context);
        inflater.inflate(R.layout.remainder_control,this);

        loadviews();
    }

    public RemainderControl(Context context,AttributeSet attrs)
    {
        super(context,attrs);

        LayoutInflater inflater=LayoutInflater.from(context);
        inflater.inflate(R.layout.remainder_control,this);

        loadviews();


    }

    private void loadviews()
    {
        btn1=(Button)findViewById(R.id.btn_shw);
        btn2=(Button)findViewById(R.id.btn_dis);
        btn3=(Button)findViewById(R.id.btn_del);
        tv1=(TextView)findViewById(R.id.msg_title);
            btn1.setOnClickListener(new View.OnClickListener() 
        {
            @Override
            public void onClick(View v) 
            {
                tv1.setText("SHOW BUTTON PRESSED");     
            }
        });
        btn2.setOnClickListener(new View.OnClickListener() 
        {
            @Override
            public void onClick(View v) 
            {
                tv1.setText("DISABLE BUTTON PRESSED");      
            }
        });
        btn3.setOnClickListener(new View.OnClickListener() 
        {
            @Override
            public void onClick(View v) 
            {
                tv1.setText("DELETE BUTTON PRESSED");
            }
        });
        tv1.setOnClickListener(new View.OnClickListener() 
        {
            @Override
            public void onClick(View v) 
            {
                tv1.setText("");
            }
        });
    }
}

添加控件的代码

public class RemainderList extends Activity 
{
    ScrollView sv1;
    LinearLayout ll1;
    deepak.android.remainder.RemainderControl rc1;

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);

        int ht=LayoutParams.WRAP_CONTENT;
        int wt=LayoutParams.FILL_PARENT;

        sv1=new ScrollView(this);
        ll1=new LinearLayout(this);
        ll1.setOrientation(LinearLayout.VERTICAL);
        sv1.addView(ll1);

        TextView tv1=new TextView(this);
        tv1.setText("THIS IS SAMPLE TEXT");
        ll1.addView(tv1,new LinearLayout.LayoutParams(wt,ht));

        rc1=new deepak.android.remainder.RemainderControl(this);
        ll1.addView(rc1,new LinearLayout.LayoutParams(wt,ht));

        setContentView(sv1);
    }
}

1 个答案:

答案 0 :(得分:3)

当您的控件包含在xml中时,将调用public RemainderControl(Context context,AttributeSet attrs)构造函数。但是在您的代码中,您直接调用构造函数public RemainderControl(Context context)。移动所有夸大布局的代码,并将侦听器设置为某种方法(例如init())并在两个构造函数中调用它。