组合控件的复用



复用自定义控件组合控件


使用组合控件相比于直接在xml中写复用行比较强,如果在别的页面还要使用的话直接在Activity中调用就可以,减少无用工,提高工作效率

其实xml文件写的布局最终还是会自动转成java代码,减少机器的工作,提高速度,,反正就是好



需要生成的类和xml其中有两个是展示效果

MyRelativeLayout主要是写标题样式的、

BaseActivity是一个抽象类

扫描二维码关注公众号,回复: 1660440 查看本文章

MainActivity和Category是用来展示的






其中先写组合控件,也就是RelativeLayout



public class MyRelativeLayout extends RelativeLayout implements View.OnClickListener {

    private TextView textView;
    private ImageView back;



    public MyRelativeLayout(Context context) {
        this(context,null);
    }

    public MyRelativeLayout(Context context, AttributeSet attrs) {
        this(context, attrs,0);
    }

    public MyRelativeLayout(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init(context);
    }

    private void init(Context context) {
        LayoutParams lp = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
        lp.addRule(RelativeLayout.CENTER_IN_PARENT);

        textView = new TextView(context);
        textView.setId(R.id.titleBar_id);
        textView.setText("标题");
        textView.setTextSize(25);
        textView.setTextColor(Color.BLUE);
        addView(textView,lp);
        textView.setOnClickListener(this);

        LayoutParams lp_img = new LayoutParams(100, 100);
        lp_img.addRule(RelativeLayout.ALIGN_LEFT);
        lp_img.addRule(RelativeLayout.CENTER_VERTICAL);
        lp_img.leftMargin = 10;

        back = new ImageView(context);
        back.setImageResource(R.mipmap.icon_back);
        addView(back,lp_img);


    }

    public TextView getTitle() {
        return textView;
    }

    public ImageView getBack() {
        return back;
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.titleBar_id:
                Log.e("TAG",""+v.getId());
                break;
        }
    }
}

RelativeLayout就相当于布局文件,



BaseActivity是一个抽象类,这里使用到了多态

了解

https://www.cnblogs.com/jack204/archive/2012/10/29/2745150.html


多态其实就是父类的引用指向子类的实例,用相同的指令对不同的对象发送消息,不同的对象对相同的指令做出的反应


public abstract class BaseActivity extends AppCompatActivity {

    private MyRelativeLayout parent_title;
    private FrameLayout frameLayout;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.setContentView(R.layout.activity_base);
        initParentView();
        int id = this.setChildContentView();
        View childView = LayoutInflater.from(this).inflate(id, null);
        frameLayout.addView(childView);
        initView();
        initData();
    }




    private void initParentView() {
        frameLayout = findViewById(R.id.child_view);
        parent_title = findViewById(R.id.parent_title);
        parent_title.getBack().setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                BaseActivity.this.finish();
            }
        });
    }

    public MyRelativeLayout getTitleBar(){
        return parent_title;
    }

    protected abstract int setChildContentView();
    protected abstract void initView();
    protected abstract void initData();
}

接着是BaseActivity的xml



<?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="match_parent"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context=".MainActivity">


    <com.title.MyRelativeLayout
        android:id="@+id/parent_title"
        android:layout_width="match_parent"
        android:background="@color/colorAccent"
        android:layout_height="56dp"/>

    <FrameLayout
        android:id="@+id/child_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_alignParentStart="true"
        android:layout_alignParentTop="true"></FrameLayout>


</RelativeLayout>


MainActivity中

必须继承BaseActivity


public class MainActivity extends BaseActivity {


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

    }



    public void initView() {
        MyRelativeLayout titleBar = getTitleBar();
        TextView title = titleBar.getTitle();
        title.setText("主页");


        View viewById = findViewById(R.id.text1213);
        viewById.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this,Category.class);
                startActivity(intent);
            }
        });
    }

    @Override
    protected int setChildContentView() {
        return R.layout.activity_main;
    }

    @Override
    protected void initData() {

    }
}



xml文件


<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/text1213"
    android:text="12138"
    android:layout_centerInParent="true"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

</RelativeLayout>




Category中:


public class Category extends BaseActivity{
    @Override
    protected int setChildContentView() {
        return R.layout.activity_category;
    }

    @Override
    protected void initView() {
        MyRelativeLayout myRelativeLayout = getTitleBar();
        TextView textView = myRelativeLayout.getTitle();
        textView.setText("分类");
    }

    @Override
    protected void initData() {

    }
}



xml:

<?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="match_parent"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context=".MainActivity">

    <TextView
        android:text="嘿呦"
        android:layout_centerInParent="true"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</RelativeLayout>


因为是复用所以必须继承BaseActivity并重写方法,

其中内容可以在initView中自定义



猜你喜欢

转载自blog.csdn.net/melect/article/details/79939855