笔者近期在做项目时遇到了如下情况:有**超过10个**的子界面需要用到差不多的一个标题栏,如下图:
![](https://box.kancloud.cn/2016-03-01_56d551f03c301.jpg)
倘若直接在每个布局文件中写一个这样的Linearlayout,一方面重复性的代码总是让人不太舒服,另一方面,我需要对同样的一个**返回键**在不同的布局中定义不同的id,然后还要在java文件中实现它的功能,实在是太让人不爽了。
于是,笔者就想到了**自定义布局**。
**自定义布局**的好处就是在布局定义好之后,直接可以在布局文件中使用,如下图:
![](https://box.kancloud.cn/2016-03-01_56d551f052f20.jpg)
![](https://box.kancloud.cn/2016-03-01_56d551f066099.jpg)
不过由于每个布局的特殊性,所以还是需要一个方法——**设置textview的内容**,此处也是直接可以在代码中实现。
上一下项目文件:
![](https://box.kancloud.cn/2016-03-01_56d551f0769bf.jpg)
MainActivity:
~~~
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class MainActivity extends Activity {
private Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button=(Button)findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent=new Intent(MainActivity.this,TwoActivity.class);
startActivity(intent);
//此处千万外要注意,不要写finish(),在TwoActivity中按下返回键之后会摧毁TwoActivity的布局,
//然后显示的就是MainActivity的布局,倘若把MainActivity的布局给finnish掉后,程序会直接退出
}
});
}
}
~~~
TwoActivity:
~~~
import android.app.Activity;
import android.os.Bundle;
public class TwoActivity extends Activity{
private TitleLayout title;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_two);
//绑定TitleLayout
//设置TitleLayout中text内容
title=(TitleLayout)findViewById(R.id.title);
title.setTitleText("Light_Control");
}
}
~~~
TitleLayout:
~~~
import android.app.Activity;
import android.content.Context;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;
public class TitleLayout extends LinearLayout {
private Button titleBack;
private TextView titleText;
public TitleLayout(Context context, AttributeSet attrs) {
super(context, attrs);
//加载布局文件,与setContentView()效果一样
LayoutInflater.from(context).inflate(R.layout.my_view, this);
titleBack = (Button) findViewById(R.id.title_back);
titleText = (TextView) findViewById(R.id.title_text);
//设置返回键的点击效果
titleBack.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
((Activity) getContext()).finish();
}
});
}
//创建一个方法来改变title中text的内容
public void setTitleText(String text) {
titleText.setText(text);
}
}
~~~
activity_main:
~~~
<?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"
>
<Button
android:id="@+id/button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="这是第一个Activity"
android:textSize="30sp"
android:gravity="center"/>
</LinearLayout>
~~~
activity_two:
~~~
<?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="vertical">
<com.example.user_defined_view.TitleLayout
android:id="@+id/title"
android:layout_width="match_parent"
android:layout_height="wrap_content">
</com.example.user_defined_view.TitleLayout>
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:text="这是第二个Activity"
android:textSize="30sp"/>
</LinearLayout>
~~~
my_view:
~~~
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:orientation="horizontal"
android:layout_height="wrap_content"
android:background="#272727">
<Button
android:id="@+id/title_back"
android:layout_width="45dp"
android:layout_height="45dp"
android:layout_gravity="center_vertical"
android:background="@drawable/button_back"/>
<TextView
android:id="@+id/title_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="This is a Title"
android:padding="12dp"
android:layout_gravity="center_vertical"
android:textSize="20sp"
android:textStyle="bold"
android:textColor="#fff"/>
</LinearLayout>
~~~
最后附上源码地址:[http://download.csdn.net/detail/double2hao/9334387](http://download.csdn.net/detail/double2hao/9334387)
- 前言
- android SharedPreference的简单使用(登陆界面记住密码)
- android 通知Notification的使用小实例(振动,灯光,声音)
- android调用摄像头拍照,从相册中选择照片并裁剪
- android从相册中获取图片出错,图片无法裁剪的问题
- android 后台定时提醒(Service,AlarmManager的使用)
- android如何让后台服务service不被杀死(设置前台服务)
- android修改控件外观(使用drawable资源)
- android 自定义view的使用(最佳demo——返回标题栏)
- android viewpager+fragment做主界面(超容易理解的demo!)
- Fragment生命周期
- Android DrawerLayout 高仿QQ5.2双向侧滑菜单
- Android DrawerLayout侧滑菜单+nineoldandroids动画
- Android 通知栏Notification的整合 全面学习 (一个DEMO让你完全了解它)
- Android应用开发-护眼提醒-总结篇