控件
控件种类有很多,这里只是简单介绍一下,详情到官网去查看。
先来预防一下,如果你也是把所有控件都写一遍,在同一个布局里面的话,如果有的控件太大就会导致下面的控件被隐藏,因为没有开启滑动。
改动布局如下
一般采用线性布局
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<!--android:id 给当前控件定义了一个唯 一标识符
android:layout_width 和 android:layout_height 指定了控件的宽度和高度。
match_parent 表示让当前控件的大小和父布局的大小一样,也就是由父布局来决定当前控 件的大小。
wrap_content 表示让当前控件的大小能够刚好包含住里面的内容,也就是由控件 内容决定当前控件的大小。
android:text 指定TextView中显示的文本内容
使用android:gravity 来指定文字的对齐方式,可选值有top 、bottom 、left
、right 、center 等,可以用“|”来同时指定多个值
通过android:textSize 属性可以指定文字的大小,通过android:textColor 属性可以指 定文字的颜色,
在Android中字体大小使用sp作为单位。
-->
<!--可以滚动的一个控件,只能在里面加载一个控件 -->
<ScrollView
android:id="@+id/scroll_view"
android:layout_width="match_parent"
android:layout_height="match_parent">
<!--一个线性布局,与ScrollView配合 -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<!--这里放的就是所有控件 -->
</LinearLayout>
</ScrollView>
</LinearLayout>
1. TextView
创建一个新empty activity项目。
进入活动的的主页面到布局文件。
添加如下代码。。
<!--android:id 给当前控件定义了一个唯 一标识符
android:layout_width 和 android:layout_height 指定了控件的宽度和高度。
match_parent 表示让当前控件的大小和父布局的大小一样,也就是由父布局来决定当前控件的大小。
wrap_content 表示让当前控件的大小能够刚好包含住里面的内容,也就是由控件内容决定当前控件的大小。
android:text 指定TextView中显示的文本内容
使用android:gravity 来指定文字的对齐方式,可选值有top 、bottom 、left
、right 、center 等,可以用“|”来同时指定多个值
通过android:textSize 属性可以指定文字的大小,通过android:textColor 属性可以指定文字的颜色,
在Android中字体大小使用sp作为单位。
-->
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="看什么!"
android:id="@+id/text_view"
android:gravity="center"
android:textSize="24sp"
android:textColor="#0000ff"/>
2. Button
在布局界面新建一个button。
添加如下代码
<!--android:id 给当前控件定义了一个唯 一标识符
android:layout_width 和 android:layout_height 指定了控件的宽度和高度。
match_parent 表示让当前控件的大小和父布局的大小一样,也就是由父布局来决定当前控 件的大小。
wrap_content 表示让当前控件的大小能够刚好包含住里面的内容,也就是由控件 内容决定当前控件的大小。
android:text 指定TextView中显示的文本内容
通过android:textSize 属性可以指定文字的大小,通过android:textColor 属性可以指 定文字的颜色,
在Android中字体大小使用sp作为单位。
系统会对Button中的所有英文字母自动进行大写转换,android:textAllCaps="false"禁用
-->
<Button
android:id="@+id/button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="按钮"
android:textColor="#4488a4"
android:textSize="20sp"
android:textAllCaps="false"/>
在主界面添加代码
两种方法
接口实现和匿名内部类
接口实现
protected void onCreate(Bundle savedInstanceState) {
...
//实例化按钮
Button button = (Button) findViewById(R.id.button);
//设置监听this相当于new 了一个View.OnClickListener(),实现是因为implements View.OnClickListener
button.setOnClickListener(this);
}
//接口实现的方法
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.button:
textView.setText("点击了按钮");
break;
default:
break;
}
}
匿名内部类
protected void onCreate(Bundle savedInstanceState) {
//实例化按钮
Button button = (Button) findViewById(R.id.button);
//匿名内部类监听按钮点击事件,并实现。
button_getedittext.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
textView.setText("点击了按钮");
}
});
3.EditText
在布局界面新建一个EditText。
添加如下代码
<!-- android:hint 属性指定了一段提示性的文本
android:maxLines 属性指定了EditText的最大行数
-->
<EditText
android:id="@+id/edit_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="输入一个字符串"
android:maxLines="1" />
在主界面添加代码
protected void onCreate(Bundle savedInstanceState) {
//实列化输入框
EditText editText =(EditText) findViewById(R.id.edit_text);
}
实际操作,例如通过点击把输入的内容输出到textView
protected void onCreate(Bundle savedInstanceState) {
//实例化按钮
Button button_getedittext =(Button) findViewById(R.id.button1);
//匿名内部类监听按钮点击事件,并实现。
//getText().toString()获取输入的字符串
//setText()更改textView的内容
button_getedittext.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String edittt = editText.getText().toString();
textView.setText(edittt);
}
});
}
4.ImageView
在布局界面新建一个ImageView。
添加如下代码
<!-- 用android:src 属性给ImageView指定了一张图片。
ImageView的宽和高都设定为wrap_content。
-->
<ImageView
android:id="@+id/image_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="-100dp"
android:layout_marginBottom="-100dp"
android:src="@drawable/deiqi_20210113"
android:visibility="visible" />
在主界面添加代码,并完成按钮点击更换图片的功能
protected void onCreate(Bundle savedInstanceState) {
//布尔值用来判断当前图片
boolean b = true;
//实例化图片
ImageView imageView = (ImageView) findViewById(R.id.image_view);
//实例化按钮
Button button_image = (Button) findViewById(R.id.button2);
//按钮的监听,实现点击换图片的效果
button_image.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//调用ImageView的setImageResource() 方法将显示的图片更改
if (b){
imageView.setImageResource(R.drawable.deiqi_2021011301);
b=false;
}else{
imageView.setImageResource(R.drawable.deiqi_2021011302);
b = true;
}
}
});
}
5. ProgressBa
在布局界面新建一个ProgressBa。
添加如下代码
<!--个进度条
Android控件的可见属性。所有的Android控件都具有这个属性,
可以通过 android:visibility 进行指定
visible 表示控件是可见的,这个值是默认值,不指定android:visibility 时,控件都是可见的。
invisible 表示控件不可见,但是它仍然占据着原来的位置和大小,可以理解成控 件变成透明状态了。
gone 则表示控件不仅不可见,而且不再占用任何屏幕空间。
style="@style/Widget.AppCompat.ProgressBar.Horizontal"变成一个横进度条
-->
<ProgressBar
android:id="@+id/porgress_bar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="visible"
// style="@style/Widget.AppCompat.ProgressBar.Horizontal"
android:max="100"/>
在主界面添加代码,完成点击隐藏显示进度条
protected void onCreate(Bundle savedInstanceState) {
//实例化进度条
ProgressBar progressBar = (ProgressBar) findViewById(R.id.porgress_bar);
//监听按钮,完成点击隐藏显示进度条
button_grabar.setOnClickListener(new View.OnClickListener() {
@Override
//通过getVisibility() 方法来判断ProgressBar是否可见,如果可 见就将ProgressBar隐藏掉,
// 如果不可见就将ProgressBar显示出来。
public void onClick(View v) {
//getProgress()获得进度条进度
//setProgress()更改进度条进度
//与android:max="100"有关
if(progressBar.getVisibility() == View.GONE){
progressBar.setVisibility(View.VISIBLE);
int progress = progressBar.getProgress();
progress = progress +10;
progressBar.setProgress(progress);
}else {
progressBar.setVisibility(View.GONE);
}
}
});
}
6.AlertDialog
AlertDialog可以在当前的界面弹出一个对话框,这个对话框是置顶于所有界面元素之上的,能够 屏蔽掉其他控件的交互能力。
在主界面添加代码,完成点击弹出AlertDialog对话框操作
protected void onCreate(Bundle savedInstanceState) {
//实例化按钮
Button button_alerdlog = (Button) findViewById(R.id.button4);
//按钮监听,完成AlertDialog弹出对话框操作
button_alerdlog.setOnClickListener(new View.OnClickListener() {
@Override
//点击事件
public void onClick(View v) {
//实例化一个对话框
AlertDialog.Builder dialog = new AlertDialog.Builder(MainActivity.this);
//通过setTitle获得标题
//通过setMessage获得文本内容
//setCancelable控制可否用Back键关闭对话框
//调用setPositiveButton() 方法为对话框设置 确定按钮的点击事件
dialog.setTitle("对话框");
dialog.setMessage("打开我干嘛?");
dialog.setCancelable(false);
dialog.setPositiveButton("确认", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//dismiss()关闭对话框
dialog.dismiss();
}
});
//调用setNegativeButton() 方法设置取消按钮的点击事件
dialog.setNegativeButton("退出", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//dismiss()关闭对话框
dialog.dismiss();
}
});
//调用show() 方法将对话框显示出来。
dialog.show();
}
});
}
7.ProgressDialog
ProgressDialog在界面上弹出一个对话框,都能够屏蔽掉其他控 件的交互能力。ProgressDialog会在对话框中显示一个进度条,其他与AlertDialog相似。
在主界面添加代码,完成点击弹出ProgressDialog对话框操作,通过定时器自动关闭对话。
protected void onCreate(Bundle savedInstanceState) {
//实例化按钮
Button button_prodia = (Button) findViewById(R.id.button5);
//按钮监听,完成ProgressDialog弹出对话框操作
button_prodia.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ProgressDialog progressDialog = new ProgressDialog(MainActivity.this);
progressDialog.setTitle("对话框");
progressDialog.setMessage("Loading...");
progressDialog.setCancelable(false);
progressDialog.show();
//定时器
final Timer timer=new Timer();
//schedule(),第一个参数,需要调度的任务,第二个参数为开始时停顿时间,第三个参数为每运行一次停顿时间
timer.schedule(new TimerTask() {
//定义一个属性
int index=0;
@Override
//定时器任务要执行的动作
public void run() {
index+=10;
progressDialog.show();
//setProgress()设置当前进度
progressDialog.setProgress(index);
if (index>100){
//关闭计时器
timer.cancel();
//关闭进度条对话框
progressDialog.dismiss();
}
}
},0,1000);
}
});
}
8.自定义控件
如果布局中有一些控件要求能够响应事件,我们还是需要在每个活动中为这些控件单独编写一次事件注册的代码。比如说标题栏中的返回按钮,其实不管是在哪一个活动中,这个按钮的功能都是相同的,即销毁当前活动。 而如果在每一个活动中都需要重新注册一遍返回按钮的点击事件,无疑会增加很多重复代码, 这种情况最好是使用自定义控件的方式来解决。
//新建TitleLayout继承自LinearLayout
public class TitleLayout extends LinearLayout {
//重写了LinearLayout中带有两个参数的构造函数。在布局中引入TitleLayout控件就会调 用这个构造函数。
//借助LayoutInflater实现构造函数中需要对标题栏布局进行动态加载。
public TitleLayout(Context context, AttributeSet attrs) {
super(context, attrs);
//通过LayoutInflater的from() 方法可以构建出一个LayoutInflater 对象,然后调用inflate() 方法就可以动态加载一个布局文件。
//inflate() 方法接收两个参数,第一个参 数是要加载的布局文件的id,这里我们传入R.layout.title,
//第二个参数是给加载好的布局再添加 一个父布局,这里我们想要指定为TitleLayout,于是直接传入this 。
LayoutInflater.from(context).inflate(R.layout.title, this);
}
}
在布局文件中添加这个自定义控件,添加自定义控件和添加普通控件的方式基本是一样的,只不过在添加自定义控件的时候,我们 需要指明控件的完整类名,包名在这里是不可以省略的。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<com.example.uicustomviews.TitleLayout
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>