第一行笔记-常用控件

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


















































































评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值