组合控件即将若干个系统已有的控件组合到一块形成一个组合控件,比如带返回按钮的标题栏就是一个最简单的组合控件。
使用组合控件的好处是提高代码的复用性,一处定义多处使用。
下面我们将使用组合控件实现这样的效果:
首先,我们需要自定义一个view:
package com.example.widgets;
import android.app.Activity;
import android.content.Context;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.FrameLayout;
import android.widget.ImageButton;
import android.widget.TextView;
import com.example.viewdemo4.R;
/**
* @author Rowand jj
*自定义标题栏组件
*/
public class TitleBar extends FrameLayout implements OnClickListener
{
private ImageButton ib_ret = null;
private TextView tv_show = null;
public TitleBar(Context context)
{
super(context);
}
public TitleBar(Context context, AttributeSet attrs)
{
super(context, attrs, 0);
LayoutInflater inflater = LayoutInflater.from(context);
inflater.inflate(R.layout.title, this);//需要指定填充的xml布局文件以及根视图
ib_ret = (ImageButton) findViewById(R.id.ib_ret);
tv_show = (TextView) findViewById(R.id.tv_show);
ib_ret.setOnClickListener(this);
}
@Override
public void onClick(View v)
{
if (this.getContext() instanceof Activity)
{
Activity a = (Activity) this.getContext();
a.finish();
}
}
public void setTitleText(CharSequence text)
{
this.tv_show.setText(text);
}
public void setLeftButListener(OnClickListener listener)
{
this.ib_ret.setOnClickListener(listener);
}
}
在这个自定义view中,我们使其加载一个我们自定义的布局,该布局如下:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="50dp"
android:background="#ff0000"
>
<TextView
android:id="@+id/tv_show"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:textSize="20sp"
android:textColor="#fff"
android:text="@string/title"
/>
<ImageButton
android:id="@+id/ib_ret"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/title_ret_selector"
android:layout_centerVertical="true"
/>
</RelativeLayout>
左侧按钮的背景是一张图片,引用的是一个selector文件:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:state_pressed="true" android:drawable="@drawable/navigation_previous_item">
</item>
<item android:drawable="@drawable/navigation_previous_item"></item>
</selector>
这样,这个组合控件就做好了。
下面我们在activity上使用一下这个组合控件。
首先我们需要在布局上指定我们定义的控件:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" >
<com.example.widgets.TitleBar
android:id="@+id/title_bar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
</com.example.widgets.TitleBar>
</RelativeLayout>
就跟使用普通控件一样。
下面是MainActivity:
package com.example.viewdemo4;
import android.app.Activity;
import android.os.Bundle;
import com.example.widgets.TitleBar;
public class MainActivity extends Activity
{
private TitleBar title_bar = null;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
title_bar = (TitleBar) findViewById(R.id.title_bar);
title_bar.setTitleText("关于作者");
}
}
根据需要,我们可以修改组合控件显示的文字以及左侧按钮的点击事件。