内容简概
一、预期效果
二、通过xml方式创建
三、通过代码创建
四、最终效果
具体内容
一、预期效果
二、通过xml方式创建
(一)自定义控件属性
首先我们需要创建一个管理自定义属性的xml文件。
然后在文件中规定我们想要实现的属性,颜色、文本和位置等都属于资源文件(resource)。
(二)创建控件
接着到activity_main.xml文件中调用自定义属性创建控件,采用RelativeLayout布局。
android:layout_width="match_parent"
android:layout_height="64dp"
app:my_background="#877466"
app:show_back="true"
app:back_title="返回主页"
app:back_position="1"/>
(三)实现自定义控件
最后在MainActivity中设置layout布局。自定义内容均在activity_main.xml文件中修改。
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
三、通过代码创建
(一)自定义控件属性
这一步过程与上述xml方式创建的第一步相同。
(二)创建控件
首先在图中位置新建一个用于创建控件的Java Class。
接着在创建的类中创建控件。
public class NavigationBar extends RelativeLayout {
// 定义一个变量保存外部设置的颜色 默认灰色
private int MyBackground = Color.GRAY;
// 记录是否需要返回按钮
private boolean show_back = false;
// 返回按钮
private Button back;
// 返回按钮的布局属性
LayoutParams params;
// 使用Java代码创建控件
public NavigationBar(Context context) {
// super(context);
// init();
this(context,null);
}
// 使用xml创建控件
public NavigationBar(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
init(context,attrs);
}
// 初始化控件
private void init(Context context, AttributeSet attr){
// 设置横向布局
// setOrientation(LinearLayout.HORIZONTAL);
// 设置背景
setBackgroundColor(Color.GRAY);
// 设置内容垂直居中
setGravity(Gravity.TOP);
// 判断是否是XML配置的
if (attr != null){
// 从attr里提取xml里面配置的所有属性
TypedArray typeArray = context.obtainStyledAttributes(attr,R.styleable.NavigationBar);
// 提取需要的属性
int color = typeArray.getColor(R.styleable.NavigationBar_my_background, Color.rgb(87,74,66));
// 是否需要返回按钮
boolean show = typeArray.getBoolean(R.styleable.NavigationBar_show_back,false);
// 是否需要标题
String title = typeArray.getString(R.styleable.NavigationBar_back_title);
// 取返回按钮的位置
int position = typeArray.getInteger(R.styleable.NavigationBar_back_position,1);
// 使用数据
setMyBackground(color);
setShow_back(show,title);
setPosition(position);
}
}
public int getMyBackground() {
return MyBackground;
}
public void setMyBackground(int myBackground) {
this.MyBackground = myBackground;
// 将外部传递过来的颜色 设置为背景颜色
setBackgroundColor(MyBackground);
}
public boolean isShow_back() {
return show_back;
}
public void setShow_back(boolean show_back,String title) {
this.show_back = show_back;
if (show_back == true){
// 创建返回按钮
back = new Button(getContext());
// 设置按钮的布局属性
params = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
params.leftMargin = (int) (10*getResources().getDisplayMetrics().density);
// 设置标题
if(title != null){
back.setText(title);
}else {
back.setText("Back");
}
// 添加控件
addView(back,params);
}
}
/**
* 区别左右
*/
public interface myPosition{
int LEFT = 0;
int RIGHT = 1;
}
/**
* 设置按钮位置
* @param position LEFT RIGHT
*/
public void setPosition(int position){
// 判断是否有back按钮
if (back != null){
if (position == myPosition.LEFT){
params.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
}else {
params.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
}
}
}
}
(三)实现自定义控件
最后在MainActivity中实例化对象。自定义内容均在test函数中修改。
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
test();
}
private void test(){
// 代码方式创建控件
NavigationBar bar = new NavigationBar(this);
// 设置背景颜色
bar.setBackgroundColor(Color.rgb(87,74,66));
// 设置返回按钮
bar.setShow_back(true,"返回主页");
// 设置显示的位置,0为左,1为右
bar.setPosition(0);
// 让当前这个控件作为activity的主视图
setContentView(bar);
}
}
四、最终效果
相同属性:
①show_back="true"
②back_title="返回主页"
③my_background="#877466"
不同属性:
①back_position="0" // 按钮在左边
②back_position="1" // 按钮在右边
(一)xml方式创建
(二)代码方式创建