受欢迎的大连网站建设,手把手教你建网站,广西做网站,win7 iis配置网站 视频教程常用控件和布局的继承结构#xff0c;如下图#xff1a;
#xff08;待续。。。。#xff09;
所有的控件都是直接或间接继承自View的#xff0c;所用的所有布局都是直接或间接继承自ViewGroup的#xff0c;View是Android中最基本的一种UI组件#xff0c;它可以在屏幕上…常用控件和布局的继承结构如下图
待续。。。。
所有的控件都是直接或间接继承自View的所用的所有布局都是直接或间接继承自ViewGroup的View是Android中最基本的一种UI组件它可以在屏幕上绘制一块矩形区域并能响应这块区域的各种事件ViewGroup是一中特殊的View它可以包含很多的子View和子ViewGroup是一个用于放置控件和布局的容器。
我们可以利用上面的继承结构来创建自定义控件创建自定义控件的两种简单方法如下所示。
我们先创建一个UICustomViews项目。
1、引入布局
Android系统已经给每个活动提供了标题栏功能但我们决定先不使用它而是创建一个自定义的标题栏。
只需要两个Button和一个TextView然后在布局中摆好就可以了但是一般我们的程序中可能有很多个活动都需要这样的标题栏如果在每个活动的布局中都编写一遍同样的标题栏代码明显的就会导致代码的大量重复这个时候我们可以引入布局的方式来解决这个问题。我们在layout目录下新建一个布局文件title.xml代码如下
?xml version1.0 encodingutf-8?
LinearLayout xmlns:androidhttp://schemas.android.com/apk/res/androidandroid:layout_widthmatch_parentandroid:layout_heightwrap_contentButtonandroid:idid/title_backandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:layout_gravitycenterandroid:layout_margin5dpandroid:background#000android:textBackandroid:textColor#f00/TextViewandroid:idid/title_textandroid:layout_width0dpandroid:layout_heightwrap_contentandroid:layout_gravitycenterandroid:layout_weight1android:gravitycenterandroid:background#000android:textTitle Textandroid:textColor#f5fandroid:textSize24sp/Buttonandroid:idid/title_editandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:layout_gravitycenterandroid:layout_margin5dpandroid:background#000android:textEditandroid:textColor#f00/
/LinearLayout
我们在LinearLayout中分别加入了两个Batton和一个TextView左边的Button可用于返回右边的Button可用于编辑中间的TextView则可以用来显示一段标题文本。熟悉一下属性其中android:backgroud用于为布局或控件指定一个背景可以使用颜色或者是照片来进行填充。
另外在两个Button中我们都使用了android:layout_margin这个属性它可以指定控件在上下左右方向上偏移的距离当然也可以使用android:layout_marginLeft或者android:layout_marginTop等属性来单独指定控件在某个方向上偏移的距离。
那么标题栏文件title.xml我们已经编写完成那我们如何在程序中使用这个标题栏呢修改acticity_main.xml中的代码如下
?xml version1.0 encodingutf-8?
LinearLayout xmlns:androidhttp://schemas.android.com/apk/res/androidxmlns:apphttp://schemas.android.com/apk/res-autoxmlns:toolshttp://schemas.android.com/toolsandroid:layout_widthmatch_parentandroid:layout_heightmatch_parenttools:contextcom.example.uicustomviews.MainActivity include layoutlayout/title//LinearLayout
我们只需要通过一行include语句将标题栏布局引进来就可以了。
但是最后不要忘了在MainActivity中将系统自带的标题栏隐藏掉代码如下
package com.example.uicustomviews;import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;public class MainActivity extends AppCompatActivity {Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main); ActionBar actionBar getSupportActionBar();if(actionBar ! null){actionBar.hide();}}
}
我们调用了getSupportActionBar()方法来获得ActionBar的实例然后再调用ActionBar的hide()方法将标题栏隐藏起来。
使用这种方式不管有多少布局需要标题栏只需要一行include语句就可以了。
测试用例如下2、创建自定义组件
引入布局的技巧确实解决了重复编写布局代码的问题但是如果布局中有一些控件要求能够响应事件我们还是需要在每个活动中为这些控件单独编写一次事件注册的代码。比如说标题栏的返回按钮不管在哪一个活动中都是用来销毁当前活动。为了不增加重复代码我们使用自定义控件的方式来解决。
新建TitleLayout继承自LinearLayout让它成为我们自定义的标题栏控件代码如下
package com.example.uicustomviews;import android.content.Context;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.widget.LinearLayout;public class MainActivity extends AppCompatActivity {Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);ActionBar actionBar getSupportActionBar();if(actionBar ! null){actionBar.hide();}}public class TitleLayout extends LinearLayout {public TitleLayout(Context context, AttributeSet attrs) {super(context, attrs);LayoutInflater.from(context).inflate(R.layout.title, this);}}
}
我们重写了LinearLayout中带有两个参数的构造函数在布局文件中引入TitleLayout控件就会调用这个构造函数然后在构造函数中需要对标题进行动态加载这就是要LayoutInflator来实现了。通过LayoutInflator的from()方法可以构建出一个LayoutInflater对象然后调用inflator()方法就可以动态加载一个布局文件inflate()接收两个参数第一个参数是要加载的布局文件的id我们传入的是R.layout.title第二个参数是给加载好的布局再添加一个父布局我们指定为TitleLayout,于是直接传入this。
现在自定义控件已经建好3、我们还需要在布局文件中添加这个自定义控件修改activity_main.xml中的代码如下
?xml version1.0 encodingutf-8?
LinearLayout xmlns:androidhttp://schemas.android.com/apk/res/androidandroid:layout_widthmatch_parentandroid:layout_heightmatch_parent com.example.uicustomviews.TitleLayoutandroid:layout_widthmatch_parentandroid:layout_heightwrap_content //LinearLayout
重新运行程序
为标题栏的按钮注册点击事件修改TitleLayout中的代码如下
package com.example.uicustomviews;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.Toast;public class TitleLayout extends LinearLayout {public TitleLayout(Context context, AttributeSet attrs) {super(context, attrs);LayoutInflater.from(context).inflate(R.layout.title, this); Button titleBack (Button) findViewById(R.id.title_back);Button titleEdit (Button) findViewById(R.id.title_edit);titleBack.setOnClickListener(new OnClickListener() {Overridepublic void onClick(View v) {((Activity) getContext()).finish();}});titleEdit.setOnClickListener(new OnClickListener() {Overridepublic void onClick(View v) {Toast.makeText(getContext(), You clicked Edit button,Toast.LENGTH_SHORT).show();}});}}
首先通过findViewById()方法得到按钮的实例然后分别调用setOnClickListener()方法给两个按钮注册了点击事件当点击返回按钮时销毁当前的活动当点击编辑按钮时弹出一段文本。
效果如下图