美文网首页
【Android开发】自定义控件——带返回键标题栏

【Android开发】自定义控件——带返回键标题栏

作者: 榆野铃爱 | 来源:发表于2019-10-15 21:10 被阅读0次

内容简概

一、预期效果
二、通过xml方式创建
三、通过代码创建
四、最终效果

具体内容

一、预期效果

二、通过xml方式创建

(一)自定义控件属性
  1. 首先我们需要创建一个管理自定义属性的xml文件
  2. 然后在文件中规定我们想要实现的属性,颜色、文本和位置等都属于资源文件(resource)。
<resources>
    <declare-styleable name="NavigationBar">
        <attr name="my_background" format="color"/>
        <attr name="show_back" format="boolean"/>
        <attr name="back_title" format="string"/>
        <attr name="back_position" format="integer"/>
    </declare-styleable>
</resources>
(二)创建控件
  1. 接着到activity_main.xml文件中调用自定义属性创建控件,采用RelativeLayout布局。
<com.example.a12navigationbar.NavigationBar
        android:layout_width="match_parent"
        android:layout_height="64dp"
        app:my_background="#877466"
        app:show_back="true"
        app:back_title="返回主页"
        app:back_position="1"/>
(三)实现自定义控件
  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);
    }

三、通过代码创建

(一)自定义控件属性
  1. 这一步过程与上述xml方式创建的第一步相同。
<resources>
    <declare-styleable name="NavigationBar">
        <attr name="my_background" format="color"/>
        <attr name="show_back" format="boolean"/>
        <attr name="back_title" format="string"/>
        <attr name="back_position" format="integer"/>
    </declare-styleable>
</resources>
(二)创建控件
  1. 首先在图中位置新建一个用于创建控件的Java Class。


  2. 接着在创建的类中创建控件。

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);
            }
        }
    }
}
(三)实现自定义控件
  1. 最后在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方式创建
(二)代码方式创建

相关文章

网友评论

      本文标题:【Android开发】自定义控件——带返回键标题栏

      本文链接:https://www.haomeiwen.com/subject/tqekmctx.html