Android自定义view——组合控件
来源:互联网 发布:固结快剪试验数据 编辑:程序博客网 时间:2024/05/17 03:19
前言
当我们需要使用标题栏时,很显然标题栏都是一样的,这个时候我们就很可能使用组合控件,既然是组合控件我们当然是把几个已有的控件组合到一起。这里我们打算实现如下效果:
组合两个button和一个TextView来模拟标题栏
对ActionBar的处理
我们自定义了标题栏我们便可以将原有的actionBar给隐藏,此时在MainActivity里:
// 隐藏Actionbar ActionBar actionBar = getSupportActionBar(); if (actionBar!=null){ actionBar.hide(); }
定义布局
既然是组合控件我们当然需要先定义一个布局把我们的两个Button和一个textView给关联起来
于是我们定义一个zidingyi.xml
<RelativeLayout android:layout_width="match_parent" android:layout_height="40dp" android:background="#ff6677" android:orientation="horizontal"> <Button android:id="@+id/back" android:layout_width="wrap_content" android:layout_height="40dp" android:text="返回" android:layout_alignParentTop="true" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" /> <TextView android:layout_width="wrap_content" android:layout_height="40dp" android:text="主题页" android:gravity="center" android:id="@+id/textView" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" /> <Button android:id="@+id/go" android:layout_width="wrap_content" android:layout_height="40dp" android:layout_alignParentEnd="true" android:layout_alignParentRight="true" android:layout_alignParentTop="true" android:text="更多" /> </RelativeLayout>
到这里我们布局就基本实现了如果我们想要引用该布局必然得重写RelativeLayout因为此时我们的具体布局都包含在这个RelativeLayout布局里面。所以接着我们
定义Title类继承RelativeLayout
public class Title extends RelativeLayout{//重写构造方法 public Title(Context context, @Nullable AttributeSet attrs) { super(context, attrs); LayoutInflater.from(context).inflate(R.layout.zidingyi,this);}
LayoutInflater.from(context).inflate(R.layout.zidingyi,this); //加载我们定义好的布局
其实到这我们自定义布局差不多就完成了,此时只需要在activity_main.xml引用
<com.example.administrator.zidingyiview.Title android:id="@+id/gg" android:layout_width="match_parent" android:layout_height="wrap_content"></com.example.administrator.zidingyiview.Title>
我们就算实现效果了,但是大家肯定想过,这样的话我们的这个自定义控件也没什么意义啊,我们使用include也可以实现这种效果,的确如此 ,因为我们的按钮没有监听事件,我们的TextView也不可以设置字体颜色字体大小等等,何谈自定义。所以我们继续来完善它
设置监听
由于我们的标题栏需要在多个Activity里面使用很显然我们不可以把监听写死,这时我们需要面向接口了
在我们的Title.class里面
// 重写里面的点击事件的接口 public interface setOnclick{ void Butt1(View view); void Butt2(View view); void Titles(View view); }
并在Title方法中
LayoutInflater.from(context).inflate(R.layout.zidingyi,this); //获取控件id Button back=findViewById(R.id.back); Button go=findViewById(R.id.go); titles = findViewById(R.id.textView);//设置监听 back.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { if (listener!=null){ //通过接口回调 listener.Butt1(view); } } }); go.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { if (listener!=null){ listener.Butt2(view); } } }); titles.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { listener.Titles(view); } });
可以看到我们获取了组合控件的id并且设置他们的监听事件只不过我们没有写死只是通过接口,这时
我们需要定义方法来来接收我们具体实现的点击事件
setOnclick listener; public void setListener(setOnclick listener){ this.listener=listener; }
到这我们的Title类就完成了
我们只需要在MainActivity里面
public class MainActivity extends AppCompatActivity implements Title.setOnclick{ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);// 隐藏Actionbar ActionBar actionBar = getSupportActionBar(); if (actionBar!=null){ actionBar.hide(); }// 设置自己的标题栏 Title gg=(Title)findViewById(R.id.gg); gg.setListener(this); } @Override public void Butt1(View view) { Toast.makeText(MainActivity.this,"对返回的具体操作",Toast.LENGTH_LONG).show(); } @Override public void Butt2(View view) { Toast.makeText(MainActivity.this,"对进入的具体操作",Toast.LENGTH_LONG).show(); } @Override public void Titles(View view) { Toast.makeText(MainActivity.this,"对标题的具体操作",Toast.LENGTH_LONG).show(); }}
实现我们自己写的接口 Title.setOnclick,重写我们的三个监听就可以做自己具体的点击事件操作了
到这里大家会发现还是差一步啊,如何我们想要对控件的大小颜色字体等更改时如何实现呢?
所以 我们继续实现,这里以TextView为例
实现对控件的细节等更改
首先要在values下面 新建attrs.xml文件,里面具体代码
<?xml version="1.0" encoding="utf-8"?><resources> <declare-styleable name="Title"> <attr name="Title_name" format="color"/>//设置标题颜色 <attr name="Title_Size" format="float"/>//设置标题字体大小 <attr name="Title_Font" format="string"/>//设置标题上面显示的内容 </declare-styleable></resources>
我们还需要在Title.clases里面实现最后一步,把我们的attrs里属性获取到
if (attrs!=null){ TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.Title); int color = array.getColor(R.styleable.Title_Title_name, Color.BLACK);//颜色 float aFloat = array.getFloat(R.styleable.Title_Title_Size, 12);//字体大小 String s = array.getString(R.styleable.Title_Title_Font); if (TextUtils.isEmpty(s)){ titles.setText(getResources().getString(R.string.app_name));//这个是如果我们没有设置标题默认工程名字 }else { titles.setText(s); } titles.setTextSize(aFloat); titles.setTextColor(color); array.recycle(); }
记得当用完array时一定得array.recycle();否则很容易 内存泄漏
最后在我们的activity_main.xml里面
<com.example.administrator.zidingyiview.Title android:id="@+id/gg" app:Title_name="#ff7" app:Title_Size="20" app:Title_Font="首页" android:layout_width="match_parent" android:layout_height="wrap_content"></com.example.administrator.zidingyiview.Title>
到这我们就大功告成了,我们既可以实现按钮的点击监听也可以实现对里面的属性设置了,具体效果见上图啦。
完整dome下载地址
http://download.csdn.net/detail/qiaoshi96_bk/9921248
- Android自定义view——组合控件
- android自定义View——组合控件
- android 自定义View研究(三) — 自定义组合控件
- Android 自定义view第二弹——组合控件
- Android 自定义组合控件View
- android:自定义view--组合控件
- Android自定义View 自定义组合控件
- Android自定义View----1. 自定义组合控件
- Android学习自定义View(三)——自绘控件和组合控件
- Android进阶——自定义View之重写ViewGroup组合系统控件实现自定义ToolBar模板
- Android自定义view组合控件解析
- Android自定义控件——组合控件
- 自定义View组合控件
- Android学习摘记——简单的自定义View(组合控件)
- Android进阶——自定义View之组合系统控件实现水珠形状的ItemView
- 自定义View---自定义组合控件
- Android自定义控件——自定义组合控件
- Android自定义组合控件——简单明了
- EventBus 事件总线之我的理解
- ArrayList源码解析(三)
- springboot学习笔记
- 如果你会oracle+mysql+java+hadoop
- Tensorflow相关概念
- Android自定义view——组合控件
- Vysor1.8.2 mac破解方法
- js中call、apply和bind
- 基于Swift的iOS应用程序开发:通过UITextFieldDelegate快速理解Delegate事件代理
- 第一天AsyncTask和HttpClient
- python 把爬取页面的所有地址和访问结果存入数据库
- 《Java设计模式之组合模式》
- 对象序列化与反序列化
- 电脑连不上网了!!(一)