1.常用控件
1.1TextView
主要用于在界面上显示文字信息。
<TextView
android:id="@+id/text1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/factor"
android:gravity="center"
android:textSize="24sp"
android:textColor="#00ff00"
/>
android:id 定义控件的标识符id。
android:layout_width和android:layout_height 指定控件的宽度和高度。可选值3种有match_parent、fill_parent和wrap_content。其中match_parent
和fill_parent的意义相同,官方推荐match_parent。match_parent表示当前控件的大小和父控件大小一样。wrap_content表示当前控件大小刚好可以包含住
里面的内容。除了上面的值也可以对控件的宽和高指定一个固定的大小。
android:text 指定TextView中显示的文本内容。
android:gravity指定文字的对齐方式,可选值有top、bottom、left、right、center等,可以用"|"来同时指定多个值。这里指定center等同于center_vertical|center_horizontal
表示文字在垂直水平方向都居中对齐。
android:textColor 指定文字的颜色。“”#00ff00“”表示颜色为rgb中的绿色。
android:textSize 指定文字的大小。文字的大小使用sp作为单位。
*sp是英文scale-independent pixel的缩写,意为缩放无关像素。是一种与密度无关的像素,这种像素会受用户字体偏好设置的影响。通常使用sp来设置屏幕上字体的大小。
*dp是英文density-independent pixel的缩写,意为密度无关像素。在设置边距、内边距或任何不打算按像素值指定尺寸的情况下,通常都是用dp这个单位。1dp单位
在设备屏幕上总是等于1/160英寸。使用dp好处是,无论屏幕密度如何,总能获得同样的尺寸。
边距 (margin),指定视图组件间的距离。是布局参数。
内边距(padding),指定视图外边框与其内容间的距离,非布局参数。
不以layout_开头的属性作用于组件。组件实例化时,会调用某个方法按照属性及属性值进行自我配置。
以layout_开头的属性作用于组件的父组件。这些属性统称为布局参数。会告诉父布局如何在内部安排自己的子元素。
1.2Button
Button是程序用于和用户交互的一种控件。
<Button
android:id="@+id/button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/calc"
/>
为Button的点击事件注册监听器使用匿名类的方式
Button b1 = (Button)findViewById(R.id.button);
b1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// Intent intent = new Intent(MainActivity.this ,ResultActivity.class); // . intent.putExtra("one",facotr1str); // intent.putExtra("two",facotr2str); // startActivity(intent);此处添加代码逻辑
每当点击按钮时,就会执行监听器中的onClick()方法。只需要在这个方法中加入待处理的逻辑就可以了。} });
也可以使用实现接口的方式来注册监听器。
public class MainActivity extends AppCompatActivity implements View.OnClickListener{ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main);
b1.setOnClickListener(this); } @Override public void onClick(View view) { switch (view.getId()) { case R.id.button: break; default: break; } }} 1.3EditTextButton b1 = (Button)findViewById(R.id.button);
EditText允许用户在控件里面输入和编辑内容,并可以在程序中对这些内容进行处理。
<EditText
android:id="@+id/edit1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Type something here"
android:maxLines="2"
/>
android:hint属性指定了提示性的文本。
android:maxLines属性指定了EditText的最大行数为两行,当输入的内容超过两行时,文本就会向上滚动。而EditText不会再继续拉伸。
通过在代码中获取EditText中的内容
EditText factor1 = (EditText)findViewById(R.id.edit1);
Sting facotr1str =factor1.getText().toString();
首先通过findViewById()方法得到EditText的实例,然后通过getText()方法获取到输入的内容,再调用toString()方法转换成字符串。
1.4 ImageView
ImageView是用于在界面上展示图片的控件。需要将准备好的图片放入"drawable"开头的目录下。
<ImageView
android:id="@+id/image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/img_1"/>
android:src属性指定ImageView的显示源文件。
可以在程序中通过代码动态地更改ImageView中的图片。例如在xml中指定的资源为drawable/img_1,在代码中修改为drawable/img_2.
ImageView imageView = (ImageView)findViewById(R.id.image_view);
imageView.setImageResource(R.drawable.img_2);
1.5 ProgressBar
ProgressBar用于在界面上显示一个进度条,表示程序正在加载一些数据。
<ProgressBar
android:id="@+id/progress_bar"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
运行程序会发现一个旋转的进度条。可以通过设置android:visibility属性让进度条消失。
android:visibility属性可选值有visible、invisible和gone.visible表示控件可见,invisible表示控件不可见,但它仍占据着原来的位置和大小,可以理解为变透明了。
gone表示不可见,而且不占用任何屏幕空间。不指定android:visibility属性,控件都是可见的。
通过程序来控制进度条的显示和消失。
ProgressBar mProgressBar = (ProgressBar)findViewById(R.id.progress_bar);
if(mProgressBar.getVisibility() == View.GONE) {
mProgressBar.setVisibility(View.VISIBLE);
}else
{
mProgressBar.setVisibility(View.GONE);
}
将ProgressBar通过style属性将它指定成水平进度条。max指定进度条的最大值
<ProgressBar
android:id="@+id/progress_bar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="?android:attr/progressBarStyleHorizontal"
android:max="100"/>
通过程序来设置加载进度条的位置。
mProgressBar.setProgress(i++);
mProgressBar.setSecondaryProgress(i+10);
setProgress()设置第一进度条位置,setSecondProcess()第二进度条位置.
1.6 AlertDialog
AlertDialog可以在当前界面弹出一个对话框,对话框置顶于所有界面的其他元素之上,能够屏蔽掉与其他控件的交互能力。因此一般用于提示一些非常重要的内容
或者警告信息。在代码中的使用方法是
AlertDialog.Builder dialog = new AlertDialog.Builder(MainActivity.this);
dialog.setTitle("This is Dialog");
dialog.setMessage("Something important .");
dialog.setCancelable(false);
dialog.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
}
});
dialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
}
});
dialog.show();
AlertDialog.Builder创建一个AlerDialog的实例,然后可以为这个对话框设置标题、内容、可否取消等属性。接下来调用setPositiveButton方法为对话框设置确定按钮的
点击事件,调用setNegativeButton()方法设置取消按钮的点击事件。最后调用show()方法将对话框显示出来。
2.四种布局
布局是一种可用于放置很多控件的容器,他可以按照一定的规律调整内部控件的位置从而编写出精美的界面。布局中也可以嵌套布局。
线性布局LinearLayout,是一种常用布局。会将它所包含的空间在线性空间上依次排列。可以通过android:orientation属性指定排列方向水平(horizontal)和竖直(vertical)。
默认的排列方式是horizontal。
android:gravity属性用于指定文字在控件中的对其方式。
android:layout_gravity属性用于指定控件在布局中的对齐方式。
android:layout_weight属性运行我们使用比例的方式来指定控件的大小。可以通过将android:layout_width指定为0,然后通过设置android:layout_weighti属性来觉得控件的大小。
相对布局RelativeLayout,通过相对定位的方式让空间的位置出现在布局的任何位置。
android:layout_alignParentTop
子部件的上边和父布局的上边对齐
android:layout_alignParentLeft 子部件的左边和父布局的左边对齐
android:layout_alignParentRight 子部件的右边和父布局的右边对齐
android:layout_alignParentBottom 子部件的底部和父布局的底部对齐
android:layout_centerInparent 子部件在父布局的中心
上面的属性可以设置为true或者false
android:layout_above 让一个控件位于另一个控件的上方,需要为这个属性指定相对id的引用。
android:layout_below 让一个控件位于另一个控件的下方,需要为这个属性指定相对id的引用。
android:layout_toLeftOf 让一个控件位于另一个控件的左侧,需要为这个属性指定相对id的引用。
android:layout_toRightOf 让一个控件位于另一个控件的右侧需要为这个属性指定相对id的引用。
上面的属性需要指定相对id。
android:layout_alignLeft 让一个控件的左边缘和另一个控件的左边缘对齐,需要为这个属性指定相对id的引用。
android:layout_alignRight 让一个控件的右边缘和另一个控件的右边缘对齐,需要为这个属性指定相对id的引用。
android:layout_alignTop 让一个控件的上边缘和另一个控件的上边缘边缘对齐,需要为这个属性指定相对id的引用。
android:layout_alignBottom 让一个控件的下边缘和另一个控件的下边缘边缘对齐,需要为这个属性指定相对id的引用。
帧布局FrameLayout,应用场景较少,没有方便的定位方式,所有空间都默认位于布局的左上角。
所有的空间都是直接或者间接继承自View的,所有的布局都是直接或者间接继承自ViewGroup的。
1.创建一个标题栏布局title.xml,在布局中放入两个Button和一个TextView,左边的Button用于返回,右边的用于编辑。中间的TextView用于显示一段标题文本。
android:layout_alignParentLeft 子部件的左边和父布局的左边对齐
android:layout_alignParentRight 子部件的右边和父布局的右边对齐
android:layout_alignParentBottom 子部件的底部和父布局的底部对齐
android:layout_centerInparent 子部件在父布局的中心
上面的属性可以设置为true或者false
android:layout_above 让一个控件位于另一个控件的上方,需要为这个属性指定相对id的引用。
android:layout_below 让一个控件位于另一个控件的下方,需要为这个属性指定相对id的引用。
android:layout_toLeftOf 让一个控件位于另一个控件的左侧,需要为这个属性指定相对id的引用。
android:layout_toRightOf 让一个控件位于另一个控件的右侧需要为这个属性指定相对id的引用。
上面的属性需要指定相对id。
android:layout_alignLeft 让一个控件的左边缘和另一个控件的左边缘对齐,需要为这个属性指定相对id的引用。
android:layout_alignRight 让一个控件的右边缘和另一个控件的右边缘对齐,需要为这个属性指定相对id的引用。
android:layout_alignTop 让一个控件的上边缘和另一个控件的上边缘边缘对齐,需要为这个属性指定相对id的引用。
android:layout_alignBottom 让一个控件的下边缘和另一个控件的下边缘边缘对齐,需要为这个属性指定相对id的引用。
帧布局FrameLayout,应用场景较少,没有方便的定位方式,所有空间都默认位于布局的左上角。
3.自定义控件
3.1 引入布局
使用引入布局的方式创建一个自定义的标题栏。1.创建一个标题栏布局title.xml,在布局中放入两个Button和一个TextView,左边的Button用于返回,右边的用于编辑。中间的TextView用于显示一段标题文本。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal" android:layout_width="match_parent"
android:layout_height="wrap_content">
<Button
android:id="@+id/title_back"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_margin="5dp"
android:text="Back"
android:textColor="#fff" />
<!-- android:background="@drawable/back_bg"-->
<TextView
android:id="@+id/title_text"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:gravity="center"
android:layout_weight="1"
android:text="Title Text"
android:textColor="#fff"
android:textSize="24sp"
/>
<Button
android:id="@+id/title_edit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_margin="5dp"
android:text="Edit"
android:textColor="#fff" />
<!-- android:background="@drawable/edit_bg"-->
</LinearLayout>
android:background用于为布局或控件指定一个背景,使用颜色或者图片填充。
android:layout_margin指定空间在上下左右方向上偏移的距离。也可以使用android:layout_marginLeft和android:layout_marginTop等属性指定控件在某个方向上的偏移距离。
通过修改activity_main.xml中的代码来应用定义的标题栏布局。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<include layout="@layout/title" />
</LinearLayout>
添加如下代码:
<include layout="@layout/title" />
通过include语句将标题栏布局引入。
将MainActivity中系统自带的标题栏隐藏掉:
ActionBar actionBar = getSupportActionBar();
if(actionBar != null)
{
actionBar.hide();
}
调用getSupportActionBar()方法获得ActionBar的实例,然后调用ActionBar的hide()方法将标题栏隐藏起来。
3.2使用自定义控件方式创建
引入布局的技巧解决了重复编写布局代码的问题。但是如果布局中有一些响应事件,需要在每个活动中为这些控件单独编写事件注册的代码。如果每个活动中响应事件的处理逻辑相同,会增加很多重复的代码。可硬通过自定义控件的方式来解决这个问题。新建TitleLayout继承自LinearLayout,让它成为自定义的标题栏控件。
public class TitleLayout extends LinearLayout
{
public TitleLayout(Context, AttributeSet attrs)
{
super(context, attrs);
LayoutLinflater.from(context).inflate(R.layout.title, this);
}
}
重写了LinearLayout中带有两个参数的构造函数,在布局中引入TitleLayout控件就会调用这个构造函数。然后在构造函数中需要对标题栏布局进行动态加载,需要借助LayoutInflater.通过LayoutInflater的from()方法可以构建出一个LayoutInflater对象,然后调用inflate()方法就可以动态加载一个布局文件。inflate()方法接收两个参数,第一参数是要加载布局的文件的id,这里要加载的是title,传入的是R.layout.title.第二个参数是给加载好的布局再添加一个父布局,这里我们指定为TitleLayout,于是直接传入this。
自定义控件创建好之后,需要在布局文件中添加自定义控件。添加自定义控件和添加普通控件的方式基本一样。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<com.example.missj.activitytest.TitleLayout
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
为标题栏中的按钮注册点击事件。修改TitleLayout中的代码。
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() {
@Override
public void onClick(View view) {
((Activity)getContext()).finish();
}
});
titleEdit.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v)
{
Toast.makeText(getContext(),"You clicked Edit button", Toast.LENGTH_SHORT).show();
}
});
}
}
首先通过findViewById()方法获得按钮的实例,然后分别调用setOnClickListener()方法给两个按钮注册了点击事件。
当点击返回按钮时销毁掉当前的活动,当点击编辑按钮时弹出一段文本。