第一行代码Android----阅读笔记(UI开发_1)

这篇具有很好参考价值的文章主要介绍了第一行代码Android----阅读笔记(UI开发_1)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

第3章 UI开发

        在过去,Android应用程序的界面主要是通过编写XML的方式来实现的。写XML的好处是,不仅能够了解界面背后的实现原理,而且编写出来的界面还可以具备很好的屏幕适配性。

        不过最近几年,Google又推出了一个全新界面布局:ConstraintLayout。和以往传统的布局不同,ConstraintLayout不是非常适合通过编写XML的方式来开发界面,而是更加适合在可视化编辑器中使用拖动控件的方式来进行操作,并且Android Studio中也提供了非常完备的可视化编辑器。

        虽然现在Google官方更加推荐使用ConstraintLayout来开发程序界面,但由于ConstraintLay-out的特殊性书中很难展示如何通过可视化编辑器来对界面进行动态操作。因此本书中仍然采用编写XML的传统方式开发程序界面。

3.2 常用控件的使用方法

3.2.1 TextView

         新建一个UIWidgetTest项目。修改activity_main.xml中的代码,如下:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

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

        TextView用于在界面上显示一段文本信息,文字默认居左上角对齐。在此仅介绍上图中基本属性,TextView中其他属性,用到的时候查阅文档即可。

  • android:id ---- 给当前控件定义一个唯一标识符
  • android:layout_widthandroid:layout_height ---- 指定控件的宽度和高度。Android中所有控件都具有这两个属性,最新可选值有2种:match_parent和wrap_content。除了使用这两个值,也可以指定固定大小,但不同手机会出现屏幕适配问题。
  • android:gravity ---- 指定文字的对齐方式,可选值有top、bottom、left、right、center等。可以用“|”来同时指定多个值,这里指定center,效果等同于center_vertical | center_horizontal,表示文字在垂直和水平方向都居中对齐。
  • android:textSize属性 ---- 指定文字大小,Android中字体大小用sp作为单位
  • android:textColor属性 ---- 指定文字颜色。

3.2.2 Button

        在activity_main.xml中加入Button:

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

        由于系统会对Button中的所有英文字母自动进行大写转换,所以仅设置android:text="Button" 时,按钮实际显示“BUTTON”。如果这不是想要的效果,可以用android:textAllCaps="false"配置来禁用这一默认特性

        在MainActivity中为Button的点击事件注册一个监听器,前面用的到注册方法如下:

        Button button = (Button) findViewById(R.id.button);
        
        //使用匿名类方式注册监听器
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //此处添加逻辑
            }
        });

        这样每当点击按钮时,就会执行监听器中的onClick()方法,只需在这个方法中加入待处理的逻辑。如果不喜欢用匿名类的方式注册监听器,也可使用实现接口的方式进行注册,代码如下:

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button button = (Button) findViewById(R.id.button);
        button.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.button:
                //在此处添加逻辑
                break;
            default:
                break;
        }
    }
}

3.2.3 EditText

        EidtText允许用户在控件里输入和编辑内容,并可以在程序中对这些内容进行处理。修改activity_main.xml中的代码,加入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"/>

        Android控件的用法都很相似:给控件定义一个id,再指定控件的宽度和高度,然后再适当加入一些控件特有的属性。这里使用android:hint属性指定了一段提示性的文本,输入内容时,这段文本会自动消失。通过android:maxLines指定了EditText的最大行数为两行,这样当输入内容超过两行时,文本就会向上滚动

        可以结合使用EditText与Button来完成一些功能,比如通过点击按钮来获取EditText中输入的内容。修改MainActivity中的代码,如下所示:

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private EditText editText;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button button = (Button) findViewById(R.id.button);
        editText = (EditText) findViewById(R.id.edit_text);
        button.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.button:
                String inputText = editText.getText().toString();
                Toast.makeText(MainActivity.this, inputText,
                        Toast.LENGTH_SHORT).show();
                break;
            default:
                break;
        }
    }
}

        首先通过findViewById()方法得到EditText的实例,然后在按钮的点击事件里调用EditText的getText()方法获取到输入的内容,再调用toString()方法转换成字符串,最后使用Toast将输入的内容显示出来。

3.2.4 ImageView

        ImageView是用于在界面上展示图片的一个控件。图片通常都是放在以“drawable”开头的目录下的,并且要带上具体的分辨率。现在最主流的手机屏幕分辨率大多是xxhdpi的,所以在res目录下新建一个drawable-xxhdpi目录,然后将事先准备好的两张图片img_1.png和img_2.png复制到该目录当中。接下来修改activity_main.xml,如下:

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

        这里使用android:src属性给ImageView指定了一张图片,由于图片的宽和高未知,所以都设定为wrap_content,以保证图片可以完整显示。还可以在程序中通过代码动态地更改ImageView中的图片,修改MainActivity的代码,如下:

public class MainActivity extends AppCompatActivity implements View.OnClickListener{

    private EditText editText;
    private ImageView imageView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button button = (Button) findViewById(R.id.button);
        editText = (EditText) findViewById(R.id.editText);
        imageView = (ImageView) findViewById(R.id.image_view);
        button.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.button:
                imageView.setImageResource(R.drawable.img_2);
                break;
            default:
                break;
        }
    }
}

        在按钮的点击事件里,通过调用ImageView的setImageResource()方法将显示的图片改为img_2。

3.2.5 ProgressBar

        ProgressBar用于在界面上显示一个进度条,表示程序正在加载一些数据

        修改activity_main.xml中的代码,如下:

    <ProgressBar
        android:id="@+id/progressBar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

        重新运行程序,会看到屏幕中有一个圆形进度条正在旋转。

问题背景:旋转的进度条表明程序正在加载数据,数据总会有加载完的时候,如何才能让进度条在数据加载完成时消失?

        Android控件的可见属性。所有的控件都具有这个属性,可以通过android:visibility进行指定,可选值有3种:visible、invisible和gone。

  • visible ---- 表示控件是可见的,这个值是默认值。
  • invisible ---- 表示控件不可见,但是它仍然占据着原来的位置和大小,即控件变成透明。
  • gone ---- 表示控件不仅不可见,而且不再占用任何屏幕空间。

        除此之外,还可以通过代码设置控件的可见性,使用的是setVisibility()方法,可以传入View.VISIBLE、View.INVISIBLE和View.GONE这3种值。

        尝试实现,点击一下按钮让进度条消失,再点击一下按钮让进度条出现的效果。修改MainActivity中的代码,如下:

public class MainActivity extends AppCompatActivity implements View.OnClickListener{

    private EditText editText;
    private ImageView imageView;

    private ProgressBar progressBar;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button button = (Button) findViewById(R.id.button);
        editText = (EditText) findViewById(R.id.editText);
        imageView = (ImageView) findViewById(R.id.image_view);

        progressBar = (ProgressBar) findViewById(R.id.progressBar);
        button.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.button:
                if (progressBar.getVisibility() == View.GONE){
                    progressBar.setVisibility(View.VISIBLE);
                }else{
                    progressBar.setVisibility(View.GONE);
                }
                break;
            default:
                break;
        }
    }
}

        在按钮点击事件中,通过getVisibility()方法来判断ProgressBar是否可见。

        另外,还可以给ProgressBar指定不同的样式,上面是圆形进度条,通过style属性可以将它指定成水平进度条,修改activity_main.xml中的代码,如下:

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

        指定水平进度条后,还可通过android:max属性给进度条设置一个最大值,然后在代码中动态地更改进度条的进度。修改MainActivity中的代码,如下:

    public void onClick(View v) {
        switch (v.getId()){
            case R.id.button:
                int progress = progressBar.getProgress();
                progress = progress + 10;
                progressBar.setProgress(progress);
                break;
            default:
                break;
        }
    }

        每点击因此按钮,就获取进度条当前进度,然后唉现有的进度上加10作为更新后的进度。

3.2.6 AlterDialog

        AlterDialog可以在当前的界面弹出一个对话框(类似于警告窗口),这个对话框是置顶于所有界面元素之上的,能够屏蔽掉其他控件的交互能力,因此AlterDialog一般都是用于提示一个非常重要的内容或者警告信息。比如为了防止用户误删重要内容,在删除前弹出一个确认对话框。修改MainActivity中的代码,如下:

    public void onClick(View v) {
        switch (v.getId()){
            case R.id.button:
                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();
                break;
            default:
                break;
        }
    }

        首先通过AlterDialog.Builder创建一个AlterDialog的实例,然后为这个对话框设置标题、内容、可否取消等属性,接下来调用setPositiveButton()方法为对话框设置确定按钮的点击事件,调用setNegativeButton()方法设置取消按钮的点击事件,最后调用show()方法将对话框显示出来。

3.2.7 ProgressDialog

        ProgressDialog和AlterDialog有点类似,都可以在界面上弹出一个对话框,都能够屏蔽掉其他控件的交互能力。不同的是ProgressDialog会在对话框中显示一个进度条,一般用于表示当前操作比较耗时,让用户耐心地等待。用法类似,修改MainActivity中代码,如下:

    public void onClick(View v) {
        switch (v.getId()){
            case R.id.button:
                ProgressDialog progressDialog = new ProgressDialog(MainActivity.this);
                progressDialog.setTitle("This is ProgressDialog");
                progressDialog.setMessage("Loading...");
                progressDialog.setCancelable(true);
                progressDialog.show();
                break;
            default:
                break;
        }
    }

        这里也是先构建一个ProgressDialog对象,然后同样可以设置标题、内容、可否取消等属性,最后也是通过调用show()方法将ProgressDialog显示出来。

        注意:如果在setCancelable()中传入false,表示ProgressDialog是不能通过Back键取消掉的,这是一定要在代码中做好控制,当数据加载完成后必须要调用ProgressDialog的dismiss()方法来关闭对话框,否则ProgressDialog将会一直存在。

3.3 详解3种基本布局

        布局是一种可用于放置很多控件的容器,它可以按照一定的规律调整内部控件的位置,从而编写出精美的界面。当然,布局的内部出了放置控件外,也可以放置布局,通过多层布局的嵌套,能够完成一些比较复杂的界面实现。新建一个UILayoutTest项目。

3.3.1 LinearLayout

        LinearLayout又称作线性布局,这个布局会将它所包含的控件在线性方向上依次排列。其中,通过android:orientation属性可以指定排列方向,可选值为verticalhorizontal。若不指定属性的值,则默认为horizontal。需要注意的是,如果LinearLayout的排列方式是horizontal,内部控件的宽度就不能指定为match_parent,因为单独一个控件会将整个水平方向占满。排列方式是vertical时同理。

  •  android:gravity -------------- 用于指定文字在控件中的对齐方式
  • android:layout_gravity ------- 用于指定控件在布局中的对齐方式

        需要注意,当排列方式是horizontal时,只有垂直方向上的对齐方式才会生效,因为水平方向上控件长度不固定,因而无法指定该方向上的对齐方式。排列方式是vertical时同理。修改新建项目UILayoutTest中activity_main.xml中的代码,如下:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    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_gravity="top"
        android:text="Button1"/>

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

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

</LinearLayout>

        android:layout_weight属性,这个属性允许使用比例的方式指定控件的大小。比如正在编写一个消息发送界面,需要一个文本编辑框和一个发送按钮,修改activity_main.xml中的代码:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

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

    <Button
        android:id="@+id/send"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="Send"/>

</LinearLayout>

        由于使用了android:layout_weight属性,此时控件的宽度就不应该再由android:layout_width来决定,这里指定成0dp是一种比较规范的写法。dp是Android中用于指定控件大小、间距等属性的单位。

        在EditText和Button里都将android:layout_weight属性指定为1,表示EditText和Button将在水平方向平分宽度。还可以通过指定部分控件的layout_weight值来实现更好的效果。比如,仅指定EditText的android:layout_weight属性,并将Button的宽度改回wrap_content。这表示Button宽度仍会按照wrap_content计算,而EditText则会占满屏幕所有的剩余空间。

3.3.2 RelativeLayout

        RelativeLayout又称作相对布局,它可以通过相对定位的方式让控件出现在布局的任何位置。修改activity_main.xml中的代码:

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

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

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

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

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

</RelativeLayout>

        android:layout_alignParentLeftandroid:alignParentTop表示Button 1和父布局的左上角对齐,其他按钮设置位置类似。上面代码中每个控件都是相对于父布局进行定位的,也可以相对于控件进行定位,修改activity_main.xml代码:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

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

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

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

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

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

</RelativeLayout>

        android:layout_above属性可以让一个控件位于另一个控件的上方,需要为这个属性指定相对控件id的引用,这里填入@id/button3,表示让该控件位于Button 3 的上方。注意:当一个控件去引用另一个控件的id时,该控件一定要定义在引用控件的后面,不然会出现找不到id的情况。

        RelativeLayout中还有另外一组相对于控件进行定位的属性,android:layout_alignLeft表示让一个控件的左边缘和另一个空间的左边缘对齐。

3.3.3 FrameLayout

        FrameLayout又称作帧布局,这种布局没有方便的定位方式,所有控件都会默认摆放在布局的左上角。修改activity_main.xml中的代码:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/text_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="This is TextView"/>

    <ImageView
        android:id="@+id/image_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@mipmap/ic_launcher"/>
    
</FrameLayout>

        运行程序会看到文字和图片都是位于布局的左上角。由于ImageView是在TextView之后添加的,因此图片压在了文字的上面。除了这种默认效果外,还可以使用layout_gravity属性指定控件在布局中的对齐方式,这和LinearLayout中的用法相似。修改activity_main.xml中的代码:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/text_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="left"
        android:text="This is TextView"/>

    <ImageView
        android:id="@+id/image_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="right"
        android:src="@mipmap/ic_launcher"/>

</FrameLayout>

        指定了TextView在FrameLayout中居左对齐,指定ImageView在FrameLayout中居右对齐。总体来说,FrameLayout由于定位方式的欠缺,导致应用场景相对偏少。

3.4 创建自定义控件

        控件和布局的继承结构如下图:

第一行代码Android----阅读笔记(UI开发_1),Android,笔记,ui

        可以看到,所用的所有控件都是直接或间接继承自View的,所用的所有布局都是直接或间接继承自ViewGroup的。View是Android中最基本的一种UI组件,它可以在屏幕上绘制一块矩形区域,并能响应这块区域的各种事件,因此,使用的各种控件其实就是在View的基础上又添加了各自特有的功能。而ViewGroup是一种特殊的View,它可以包含很多子View和子ViewGroup,是一个用于放置控件和布局的容器。

3.4.1 引入布局

        创建一个UICustomViews项目。虽然Android系统已经给每个Activity提供了标题栏功能,但这里先不使用它,创建一个自定义的标题栏。

问题背景:一般程序中可能有很多个Activity需要这样的标题栏,如果每次都编写一遍同样的标题栏代码,会导致代码的大量重复。

        引用布局的方式可以解决上述标题栏代码重复的问题。在layout目录下新建一个title.xml布局,代码如下:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@drawable/title_bg">

    <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:background="@drawable/back_bg"
        android:text="Back"
        android:textColor="#fff"/>

    <TextView
        android:id="@+id/title_text"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_weight="1"
        android:gravity="center"
        android:text="Title Text"
        android:textColor="#fff"
        android:textSize="24sp"/>

    <Button
        android:id="@+id/edit"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_margin="5dp"
        android:background="@drawable/edit_bg"
        android:text="Edit"
        android:textColor="#fff"/>

</LinearLayout>

        android:background用于为布局或控件指定一个背景,可以使用颜色或图片进行填充。这里提前准备了三张图片,分别作为标题栏、返回按钮和编辑按钮的背景。android:layout_margin属性可以指定控件在上下左右方向上的间距。当然也可以使用android:layout_marginLeft android:layout_marginTop等属性单独指定控件在某个方向上的间距。

        在程序中使用这个标题栏,修改activity_main.xml中的代码,如下:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

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

        只需通过一行include语句将标题栏布局引入进来就可以了。最后在MainActivity中将系统自带的标题栏隐藏掉,代码如下:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ActionBar actionBar = getSupportActionBar();
        if(actionBar != null){
            actionBar.hide();
        }
    }
}

        调用getSupportActionBar()方法获得ActionBar的实例,然后再调用ActionBar的hide()方法将标题栏隐藏起来。关于ActionBar的更多用法会在第12章中讲解。

3.4.2 创建自定义控件

        如果某些控件在不同的Activity中功能都是相同的,这种情况最好使用自定义控件。比如上述标题栏中的返回按钮,功能都是销毁当前Activity。新建TitleLayout继承自LinearLayout让它成为自定义的标题栏控件,代码如下:

public class TitleLayout extends LinearLayout {

    public TitleLayout(Context context, AttributeSet attrs){
        super(context, attrs);
        LayoutInflater.from(context).inflate(R.layout.title, this);
    }
}

        首先重写了LinearLayout中带有两个参数的构造函数在布局中引入TitleLayout控件就会调用这个构造函数。然后在构造函数中需要对标题栏布局进行动态加载,这要借助LayoutInflater实现。通过LayoutInflater的from()方法可以构建出一个LayoutInflater对象,然后调用inflate()方法就可以动态加载一个布局文件,inflate()方法接收两个参数,第一个参数是要加载的布局文件的id,第二个参数是给加载好的布局再添加一个父布局。

        自定义控件已经创建好了,然后需要再布局文件中添加这个自定义控件,修改activity_main.-xml中的代码,如下:

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

        在添加自定义控件时,需要指明控件的完整类名,包名在这里不可以省略。运行程序,此时效果和引入布局方式的效果是一样的。下面为标题栏中的按钮注册点击事件,修改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.edit);
        titleBack.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View view) {
                ((Activity) getContext()).finish();
            }
        });
        titleEdit.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast.makeText(getContext(), "You clicked Edit button", 
                        Toast.LENGTH_SHORT).show();
            }
        });
    }
}

        这样的话,每当在一个布局中引入TitleLayout时,返回按钮和编辑按钮的点击事件就已经自动实现好了。文章来源地址https://www.toymoban.com/news/detail-824559.html

到了这里,关于第一行代码Android----阅读笔记(UI开发_1)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Android知识笔记】UI体系(六)

    本篇主要记录一些Activity相关的问题,以及以一些Fragment相关问题。 1. 为什么 Activity.finish() 之后 10s 才 onDestroy ? 问题描述: 在 A Activity 启动 B Activity,并结束 A 页面,B 页面在启动时进行大量的动画场景,源源不断的向主线程消息队列发送消息。A Activity 的 onPause 正常执行,

    2024年02月09日
    浏览(39)
  • 【Android知识笔记】UI体系(二)

    常说的UI线程到底是哪个线程?UI线程一定是主线程吗? 下面先给出两条确定的结论: UI线程就是刷新UI所在的线程 UI是单线程刷新的 关于第二条为什么UI只能是单线程刷新的呢?道理很简单, 因为多线程访问的话需要加锁 ,太卡,所以一般系统的UI框架都是采用单线程实现

    2024年02月15日
    浏览(37)
  • Android的UI开发——RecyclerView

    RecyclerView提供了三种布局管理器即: LinearLayoutManager 线性布局管理器 StaggeredGridLayoutManager 瀑布流布局管理器 GridLayoutManager 网格布局管理器 这三种布局管理器都是通过 setLayoutManager 方法来设置 1.LinearLayoutManager 线性布局管理器 效果如图:         1).新建一个类存放信息。

    2024年02月03日
    浏览(53)
  • Android的UI开发——ListView

    效果如下: 新建fruit_xml文件,意为列表存放的格式。 MainActivity.java中代码 新建一个类Fruit 新建一个类FruitAdapter                                                                                                                                 用于将上下文、

    2024年02月03日
    浏览(42)
  • Android UI 开发·界面布局开发·案例分析

    目录 ​编辑 1.  线性布局(LinearLayout) 2.  相对布局(RelativeLayout) 3.  表格布局(TableLayout) 4.  帧布局(FrameLayout) 5.  网格布局(GridLayout) 6.  绝对布局(AbsoluteLayout) 补充内容:关于selector状态选择器         LinearLayout线性布局是一种最简单的布局方式,它有垂

    2024年02月03日
    浏览(38)
  • 【Android】UI布局之线性布局(登录界面代码)

    1、布局管理 组件在activity中呈现的方式,包含组件大小、间距、对齐方式 Android提供了两种布局的实现方式: .在xml配置文件中声明,通过setContentView(R.layout.main)方法呈现在activity中,通过findViewById()方法获得组件实例。(一般推荐这种方式) 动态生成组件以及设置相关布局

    2024年02月11日
    浏览(45)
  • Android TV UI开发常用知识

    Google官方为Android TV的UI开发提供了一系列的规范组件,在leanback的依赖库中,这里介绍一些常用的组件,使用前需要导入leanback库。 这些Fragment有设计好的样式,只需要根据场景选择对应的Fragment,并往里面填充内容即可。 可以理解为一个水平的tab页面。左边是tab,右边是ta

    2024年02月07日
    浏览(41)
  • 作为 Android 开发者,如何深入学习 Android UI?

    Android BoomMenu 使用指南 PhotoView的使用指南 SubsamplingScaleImageView使用指南 CircleImageView用法及源码解析 Android 图片裁切框架 uCrop 的用法 Gif-drawable的使用 Android选择与上传图片之Matisse教程 Richeditor-Android使用说明 TextSurface源码解析 Material-Dialogs使用说明 Taosty使用说明 DialogUtil源码解

    2024年04月26日
    浏览(45)
  • 22个值得收藏的android开源代码-UI篇

    http://jcodecraeer.com/a/opensource/2014/1016/1791.html FloatingActionButton =============================================================================== 一个类似Android版Google+浮动功能按钮的控件,可以响应ListView的滚动事件。当列表向上滚动的时候会自动显示,向下滚动的时候自动隐藏。 [外链图片转存中…

    2024年04月15日
    浏览(56)
  • Android开发中关于Ui的语法糖

    android:layout_margin=“10dp”,android:padding=\\\"10dp\\\"区别 android:layout_margin=\\\"10dp\\\" : 适用对象:用于调整 View 与其父容器或相邻 View 之间的距离,即外边距(margin)。 效果:设置该属性后,View 与其父容器或相邻 View 之间会产生一定的间隔,增加 View 之间的距离。 android:padding=\\\"10dp\\\" :

    2024年02月08日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包