Android:UI笔记

一.常用控件。

1.TextView

TextView用来在界面上显示一段文本信息。

布局文件代码:
<?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" >

    <TextView
        android:id="@+id/text_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:textSize="24sp"
        android:textColor="#00ff00"
        android:text="This is TextView" />
</LinearLayout>
gravity="center"  来指定文字的对齐方式,可选值有top、bottom、left、right、center等,可以用“|”来同时指定多个值。
textSize="24sp"   用来指定字体的大小。
textColor="#00ff00"   用来指定字体的颜色。

效果图:




2.Button。
指定一个按钮控件,可以在点击的时候触发事件。

布局文件代码:

<Button
        android:id="@+id/button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Button" />

java代码。
public class MainActivity extends Activity {
    protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.layout);
         Button button = (Button) findViewById(R.id.button);
         button.setOnClickListener(new OnClickListener() {
             @Override
             public void onClick(View v) {
                 Toast.makeText(MainActivity.this, "点击了我!", Toast.LENGTH_SHORT).show();
             }
         });
    }
}

点击的时候系统触发button中的事件,然后使用函数回调机制,调用重新书写的onClick函数,输出文字“你点击了我!”.

效果图:




3.EditText>

该空间允许用户在控件里输入文字和编辑内容,并且可以在程序中对这些内容进行处理。

布局代码:
<EditText

        android:id="@+id/edit_text"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Type something here"
        android:maxLines="2"/>

hint:这里可以预先显示一段文本用来提示。
maxLines:限制EditText最大行数,这里限制最大行数为2,超过两行时,文本会向上滚动。

效果图:





4.ImageView。

ImageView用于在界面上展示图片。

布局代码:

<ImageView
        android:id="@+id/image_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:src="@drawable/run"/>

src="@drawable/ic_launcher "   通过@drawable/run , 引用run图片在界面上输出。
图片放到res目录中的drawable下即可,使用的时候不要加后缀名。
可以在java代码中,得到ImageView的对象,然后使用setImageResource(R.drawable.xxx); 更换成xxx另一张图片。

效果图:



5.ProgressBar。

ProgressBar用来在界面上显示一个进度条,表示我们的程序正在加载一些数据。

布局代码:

<ProgressBar

        android:id="@+id/progress_bar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

可以显示一个圆形的进度条。

效果图:



所有的控件有visibility属性,可选值有三种:visible、invisible、gone。visible表示空间是可见的,这个值时默认值,不指定visible时控件都是可见的;invisible表示控件不可见,但是依然占据着原来的位置和大小;gone表示控件不可见并且不再占据认可屏幕空间。

这里定义一个Button控件,并使其被点击的时候显示或者隐藏ProgressBar控件。

java代码:

public class MainActivity extends Activity {
    protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.layout);
         Button button = (Button) findViewById(R.id.button);


         button.setOnClickListener(new OnClickListener() {

             @Override
             public void onClick(View v) {
                 ProgressBar progressBar = (ProgressBar) findViewById(R.id.progress_bar);
                 if(progressBar.getVisibility() == View.GONE) {
                     progressBar.setVisibility(View.VISIBLE);
                 } else {
                     progressBar.setVisibility(View.GONE);
                 }
             }
         });
    }
}


也可以使用style修改ProgressBar的样式。

布局代码:

<ProgressBar

        android:id="@+id/progress_bar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        style="?android:attr/progressBarStyleHorizontal"
        android:max="100" />

通过style指定ProgressBar为水平进度条,max代表进度条的最大值。

通过java代码使Button每次每点击时在原有进度条加上10作为新的进度。

public class MainActivity extends Activity {
    protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.layout);
         Button button = (Button) findViewById(R.id.button);


         button.setOnClickListener(new OnClickListener() {

             @Override
             public void onClick(View v) {
                 ProgressBar progressBar = (ProgressBar) findViewById(R.id.progress_bar);
                 int progress = progressBar.getProgress();
                 progress = progress + 10;
                 progressBar.setProgress(progress);
             }
         });
    }
}

效果图:




6.AlertDialog。

AlertDialog可以在当前的界面弹出一个对话框,这个对话框是置顶于所有界面元素之上的,能够屏蔽掉其他控件的交互能力。

AlertDialog控件不需要使用布局代码来实现,直接在java代码中写入即可。

java代码:

public class MainActivity extends Activity {
    protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.layout);
         Button button = (Button) findViewById(R.id.button);


         button.setOnClickListener(new OnClickListener() {

             @Override
             public void onClick(View v) {
                 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 dialog, int which) {
                          // TODO Auto-generated method stub


                      }
                 });
                 dialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {

                      @Override
                      public void onClick(DialogInterface dialog, int which) {
                          // TODO Auto-generated method stub

                      }
                 });
                 dialog.show();
             }
         });
    }
}

这里使用Button控件,使其再被点击的时候出现AlertDialog控件,定义一个AlertDialog.Builder 类型的对象,参数传入当前活动的上下文,然后分别使用setTitle、setMessage、setCancelable来设置标题、信息、是否可以通过back键退出(false不可退出、true可以退出),然后设置setPositiveButton(确定)和setNegativeButton(取消),写入相应的代码即可。也可以使用setNeutralButton设置其他的内容。最后通过show() 将控件显示出来。

效果图:




7.ProgressDialog。

ProgressDialog与AlertDialog类似,不过会在对话框中显示一个进度条。

同样的不需要布局代码,直接java代码即可实现:

public class MainActivity extends Activity {
    protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.layout);
         Button button = (Button) findViewById(R.id.button);


         button.setOnClickListener(new OnClickListener() {

             @Override
             public void onClick(View v) {
                 ProgressDialog progressDialog = new ProgressDialog(MainActivity.this);
                 progressDialog.setTitle("This is ProgressDialog");
                 progressDialog.setMessage("Loading...");
                 progressDialog.setCancelable(true);
                 progressDialog.show();
             }
         });
    }
}

使用的方法与上述的AlertDialog类似。可以使用dismiss()方法关闭对话框。(AlertDialog也可以通过dismiss方法关闭,因为AlertDialog和ProgressDialog都是继承Dialog,而dismiss是在Dialog中的。)

效果图:





二.四种布局。

1.LinearLayout。

LinearLayout又称线性布局。

布局代码:
<?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" >

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button" />

    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button" />

    <Button
        android:id="@+id/button3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button" />

</LinearLayout>

通过<LinearLayout></LinearLayout> 声明这个布局是线性布局的,同时使用 android:orientation="vertical"   指定排列方向是垂直排列。不指定的时候是水平的。

效果图:



当然,也可以指定水平排列,修改指定值为:horizontal 即可。

效果图:




对于其中的控件,可以通过指定的属性来对其对其排列。


<?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="horizontal" >

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="top"
        android:text="Button" />

    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:text="Button" />

    <Button
        android:id="@+id/button3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom"
        android:text="Button" />

</LinearLayout>

可以通过设置控件的:layout_gravity 属性来控制控件的对齐方式。(上述的gravity是对文字的对齐方式设置的,这里是针对布局对控件对齐方式进行设置的)


注意:

如果使用 android:orientation="vertical" 规定布局为垂直排列使,控件所有有关垂直方向上的属性值都失去效果,只能设置水平方向上的对齐方式(可选值为:left、right、center_horizontal、fill_horizontal 等)。
如果使用 android:orientation="horizontal" 规定布局为水平排列使,控件所有有关水平方向上的属性值都失去效果,只能设置垂直方向上的对齐方式(可选值为: top、bottom、center_vertical、fill_vertical 等)。
因为orientation的优先级高于控件的对其方式,所以当orientation设置完成时,控件的的该方向上的对齐方式均无效。

ValueDescription
topPut the object at the top of its container, not changing its size. 
将对象放在其容器的顶部,不改变其大小.
bottomPut the object at the bottom of its container, not changing its size. 
将对象放在其容器的底部,不改变其大小.
leftPut the object at the left edge of its container, not changing its size. 
将对象放在其容器的左侧,不改变其大小.
rightPut the object at the right edge of its container, not changing its size. 
将对象放在其容器的右侧,不改变其大小.
center_verticalPlace object in the vertical center of its container, not changing its size. 
将对象纵向居中,不改变其大小. 
垂直对齐方式:垂直方向上居中对齐。
fill_verticalGrow the vertical size of the object if needed so it completely fills its container. 
必要的时候增加对象的纵向大小,以完全充满其容器. 
垂直方向填充
center_horizontalPlace object in the horizontal center of its container, not changing its size. 
将对象横向居中,不改变其大小. 
水平对齐方式:水平方向上居中对齐
fill_horizontalGrow the horizontal size of the object if needed so it completely fills its container. 
必要的时候增加对象的横向大小,以完全充满其容器. 
水平方向填充
centerPlace the object in the center of its container in both the vertical and horizontal axis, not changing its size. 
将对象横纵居中,不改变其大小.
fillGrow the horizontal and vertical size of the object if needed so it completely fills its container. This is the default. 
必要的时候增加对象的横纵向大小,以完全充满其容器.
clip_verticalAdditional option that can be set to have the top and/or bottom edges of the child clipped to its container’s bounds. The clip is based on the vertical gravity: a top gravity clips the bottom edge, a bottom gravity clips the top edge, and neither clips both edges. 

附加选项,用于按照容器的边来剪切对象的顶部和/或底部的内容. 剪切基于其纵向对齐设置:顶部对齐时,剪切底部;底部对齐时剪切顶部;除此之外剪切顶部和底部.

垂直方向裁剪

clip_horizontalAdditional option that can be set to have the left and/or right edges of the child clipped to its container’s bounds. The clip is based on the horizontal gravity: a left gravity clips the right edge, a right gravity clips the left edge, and neither clips both edges. 

附加选项,用于按照容器的边来剪切对象的左侧和/或右侧的内容. 剪切基于其横向对齐设置:左侧对齐时,剪切右侧;右侧对齐时剪切左侧;除此之外剪切左侧和右侧.

水平方向裁剪





layout_weight 来设置控件的长度。


<?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="horizontal" >

    <EditText

        android:id="@+id/input"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:hint="Type something"/>

    <Button
        android:id="@+id/button1"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="Button" />


</LinearLayout>

这里将layout_width 设置为了0dp,但是这里的数值不影响控件的显示,因为此时的控件是由下面的layout_weight 控制的。

效果图:



这里是将所有控件的layout_weight 的值加起来,然后计算各自控件所占的比例,这里是先计算所有的weight值时:1+1=2,然后计算EditView的宽度为:1/2,然后计算Button的宽度:1/2,得到的各自控件的宽度。


若果将布局代码修改如下:

<?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="horizontal" >

    <EditText

        android:id="@+id/input"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:hint="Type something"/>

    <Button
        android:id="@+id/button1"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="Button" />

    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button" />
        />



</LinearLayout>

在后面再加上一个Button控件,这时的效果图如下:



可以看到,也是按照EditView、Button、Button 放置的,但是在最右边留置了一个Button的位置,然后在剩下的屏幕空间在平均分割给EditView和第一个Button的宽度。



2.RealativeLayout。

相对布局。

相对父布局的控件布局:


<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:text="Button" />

    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:text="Button" />
        />
     <Button
        android:id="@+id/button3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:text="Button" />

     <Button
        android:id="@+id/button4"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentBottom="true"
        android:text="Button" />

     <Button
        android:id="@+id/button5"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_alignParentBottom="true"
        android:text="Button" />

</RelativeLayout>

效果图:



相对于控件的布局:


<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:text="Button" />

    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_above="@id/button1"
        android:layout_toLeftOf="@id/button1"
        android:text="Button" />
        />
     <Button
        android:id="@+id/button3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_above="@id/button1"
        android:layout_toRightOf="@id/button1"
        android:text="Button" />

     <Button
        android:id="@+id/button4"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/button1"
        android:layout_toLeftOf="@id/button1"
        android:text="Button" />

     <Button
        android:id="@+id/button5"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/button1"
        android:layout_toRightOf="@id/button1"
        android:text="Button" />

</RelativeLayout>


效果图:




3.FrameLayout。

所有的控件都在左上角。


<?xml version="1.0" encoding="utf-8"?>
<FrameLayout 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="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button" />

    <ImageView
        android:id="@+id/image"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/ic_launcher"   />

</FrameLayout>


效果图:




4.TableLayout。

以表格的方式排列控件。


<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:stretchColumns="1" >

    <TableRow >

        <TextView

            android:layout_height="wrap_content"
            android:text="Account:"   />
        <EditText
            android:id="@+id/account"
            android:layout_height="wrap_content"
            android:hint="Input your account"   />

    </TableRow>

    <TableRow >

        <TextView

            android:layout_height="wrap_content"
            android:text="Password:"   />
        <EditText

            android:id="@+id/password"
            android:layout_height="wrap_content"
            android:inputType="textPassword"   />
    </TableRow>

    <TableRow >
        <Button
            android:id="@+id/login"
            android:layout_height="wrap_content"
            android:layout_span="2"
            android:text="Login"   />
    </TableRow>
</TableLayout>

<TableRow>代表表格的一行,然后里边定义了两个控件,表示两列。
最后的第三行,使用layout_span="2" 让Button控件占据两列。
最上面的stretchColumns  属性,使列表拉伸从而占满整个屏幕的宽度,这里的属性值是一,代表让第二列拉伸开来。

效果图:





三.自定义控件。

1.引入布局。

<include layout="@layout/title" />

在布局中使用include 可以将另一个布局文件加载进来。

2.自定义控件。

MainActivity.java代码:
public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         requestWindowFeature(Window.FEATURE_NO_TITLE);
         setContentView(R.layout.activity_main);
    }
}

在主活动中,依然是加载了activity_main布局。

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" >

    <com.example.uicustomviews.TitleLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        ></com.example.uicustomviews.TitleLayout>

</LinearLayout>

但是在activity_main 中,引入了自定义的一个控件,TitleLayout ,这个是自定义的,需要用java代码来实现。使用这个控件的时候需要将包名和类名都写全。

TitleLayout.java代码:

package com.example.uicustomviews;

import android.app.Activity;
import android.content.Context;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.Toast;
import android.view.*;

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 v) {
                 ((Activity) getContext()).finish();
             }
         });
         titleEdit.setOnClickListener(new OnClickListener() {

             @Override
             public void onClick(View v) {
                 Toast.makeText(getContext(), "You Click Edit !", Toast.LENGTH_SHORT).show();
             }
         });
    }
}

这里是自定义控件的代码,继承了LinearLayout类,然后使用构造函数初始化父类,使用LayoutInflater.from()方法可以构建出一个LayoutInflater的对象(官方API: Obtains the LayoutInflater from the given context.),再调用inflate()方法就可以动态的加载一个布局文件,inflate第一个参数是要加载布局文件的id,第二个参数是给加载好的布局再添加一个父布局。

title布局代码:

<?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="wrap_content"
    android:background="@drawable/title" >

    <Button

        android:id="@+id/title_back"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_margin="5dip"
        android:background="@drawable/back" />

    <TextView
        android:id="@+id/title_text"
        android:layout_width="0dip"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_weight="1"
        android:gravity="center"
        android:text="Hello!"/>

    <Button

        android:id="@+id/title_edit"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:background="@drawable/edit"  />
</LinearLayout>

这里就是对title布局的一些修改,加入一些图片之类的排版。

效果图:















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值