自定义ViewGroup

组合控件的意思就是,我们并不需要自己去绘制视图上显示的内容,而只是用系统原生的控件就好了,我们将几个系统原生的控件组合到一起,例如最常见的 标题栏。

新建一个view_title.xml布局文件,写我们标题栏的布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">

<Button
android:id="@+id/btn_back"
android:layout_width="100dp"
android:layout_height="50dp"
android:text="back"
android:textAllCaps="false"/>

<TextView
android:id="@+id/tv_title"
android:layout_width="250dp"
android:layout_height="50dp"
android:text="This is title"
android:textAllCaps="false"
android:gravity="center_horizontal"/>

<ImageView
android:id="@+id/iv_home"
android:layout_width="50dp"
android:layout_height="50dp"
android:background="@mipmap/user"/>

</LinearLayout>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
大概长这样


接下来创建一个TitleView.java继承自FrameLayout
刚开始我是这么写的:
在public TitleView(Context context) {} 的构造方法中,调用LayoutInflater的inflate()方法来加载刚刚定义的title.xml布局,并初始化控件。
用setTitleText方法设置标题文字,用setBackListener方法设置返回键点击响应等等……

public class TitleView extends FrameLayout implements View.OnClickListener {

private Button mBtnBack;
private TextView mTvTitle;
private ImageView mIvHome;

public TitleView(Context context) {
super(context);
LayoutInflater.from(context).inflate(R.layout.view_title, this);
mBtnBack = findViewById(R.id.btn_back);
mTvTitle = findViewById(R.id.tv_title);
mIvHome = findViewById(R.id.iv_home);

mBtnBack.setOnClickListener(this);
}

@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.btn_back:
((Activity)getContext()).finish(); //结束当前activity
break;
}
}

public void setTitleText(String text) {
mTvTitle.setText(text);
}

public void setBackText(String text) {
mBtnBack.setText(text);
}

public void setBackListener(OnClickListener listener) {
mBtnBack.setOnClickListener(listener);
}

public void setImageListener(OnClickListener listener) {
mIvHome.setOnClickListener(listener);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
在主布局中使用刚刚写的标题栏控件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/main_layout"
android:orientation="vertical">

<com.sky.customapplication.TitleView
android:id="@+id/title_view"
android:layout_width="match_parent"
android:layout_height="wrap_content">

</com.sky.customapplication.TitleView>
</LinearLayout>
1
2
3
4
5
6
7
8
9
10
11
12
13
在MainActivity中声明、调用控件的方法设置文字和点击事件
public class MainActivity extends AppCompatActivity {

private TitleView mTitleView;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

mTitleView = findViewById(R.id.title_view);
mTitleView.setBackListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(MainActivity.this, "touched back!", Toast.LENGTH_SHORT).show();
}
});

mTitleView.setImageListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(MainActivity.this, "touched home!", Toast.LENGTH_SHORT).show();
}
});

mTitleView.setBackText("返回去");
mTitleView.setTitleText("我是标题");
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
这样,自定义ViewGroup的流程就结束了!让我们点击运行……
什么(O_o)???居然报错了??


嗯??我的TitleView加载失败了?为啥哟
没办法,一顿查资料问师父……

原来问题出在FrameLayout的构造方法上,让我们再回过头看一下,还原案发现场……
当时的情况是这样的:

那我不就alt+enter,创建构造函数

然后选了默认的第一个…问题就出在这里!!

 

posted @ 2019-09-10 17:23  李艳艳665  阅读(113)  评论(0编辑  收藏  举报