复用自定义控件组合控件
使用组合控件相比于直接在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中自定义