第一行笔记-常用控件

来源:互联网 发布:无人机与人工智能 编辑:程序博客网 时间:2024/06/03 19:51

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);      
Button b1 = (Button)findViewById(R.id.button);
b1.setOnClickListener(this); } @Override public void onClick(View view) { switch (view.getId()) { case R.id.button: break; default: break; } }}
1.3EditText
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,应用场景较少,没有方便的定位方式,所有空间都默认位于布局的左上角。


3.自定义控件

所有的空间都是直接或者间接继承自View的,所有的布局都是直接或者间接继承自ViewGroup的。

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()方法给两个按钮注册了点击事件。
当点击返回按钮时销毁掉当前的活动,当点击编辑按钮时弹出一段文本。


















































































原创粉丝点击