学习Android笔记

Android简介

Android智能操作系统,主要是手机,其他还有TV,穿戴设备,汽车等。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DNUAMhcb-1659312139502)(D:\AF2205\Android\day01(20220711)]\Android系统架构.png)

从上往下:

第一层:System Apps层

美团,微信,QQ,打电话,图库,通讯录。即包括系统的应用,又包括第三方安装的应用。java语言写的。

第二层:Java API FrameWork层

FrameWork层提供给APP层开发的各种方法和接口,这一层也是由java语言实现的。

包括Activity,Window,等

第三层:Native C/C++ Libraries和Android Runtime层

Libraries和ART:开源库。整个第三层都是用C/C++写的。

Android Runtime

Android Runtime(ART):

Java的程序都是在JVM(Java虚拟机)上运行的

手机端用的不是Java虚拟机,用的是Android虚拟机,Android Runtime(ART)。以前用的是Dalvik虚拟机。

Android的应用打出的包是apk格式的,ART会把Java编译出的class文件全部都放在一起,叫dex文件,dex文件经过优化,封装到apk中去。源程序—>class—>dex优化—>apk

手机上的每个应用都在一个独立的ART虚拟机中运行。

Core Libraries:核心库。

Native C/C++ Libraries

开源库

Hardware Abstraction Layer(HAL)

硬件抽象层。保护硬件厂家的驱动程序不开源。分开软件和硬件层进行测试。

Linux Kernel

Android基于Linux系统的,并进行优化的。C写的。

Android Studio环境搭建

下载地址:https://developer.android.google.cn/studio/

1、安装Android Studio

2、装SDK

3、jre

4、安装模拟器

创建Android应用程序

注意项目名,包名,项目存储路径的写法

AndroidManifest.xml清单文件:四大组件的注册,权限,包名等等

java源程序 (test)是测试包

res:资源:图片,字符串,布局文件等等

drawable:app所用到的图片资源

layout:布局:摆放View

mipmap:应用程序的图标

values:值

​ colors.xml颜色值

​ string.xml字符串

​ themes主题

build.gradle是app的编译配置

proguard-rules.pro混淆文件配置

控制界面的方式

方式一:通过xml配置

在xml中配置各种控件,在代码中通过setContentView(layout)来显示

此种方式比较简单快捷,但是不灵活,不能做动态配置。

方式二:通过java代码

所有的控件都通过new关键字创建处理,然后添加到相应的布局中,从而实现用户界面

此方法相对麻烦,但动态灵活。

方式三:混合方式:java代码+xml

固定不变的控件使用xml

动态变化多,行为控制比较负载的控件使用java代码

基本组件

TextView

TextView是文本框,显示文本用

属性:

layout_width控件的宽度

layout_height控件的高度

text控文本内容

textColor字体颜色

textSize字体大小

gravity内容对其方式

layout_gravity该控件在父控件中的对其方式

padding内边距:控件与内容的间距

layout_margin外边距:该控件与父控件的间距

EditText

可编辑的文本框,输入框

属性

hint提示文字,当text不为空的时候,隐藏

inputType校验输入数据的类型

监听器:

addTextChangedListener文本框内容变化监听器

Button

按钮,可接受点击、长按、触摸事件。

继承自TextView,所以TextView中的属性,Button都可以使用。

课后练习:写一个计算器,实现两个数之间的加减乘除

知识点:TextView,EditText,Button。在layout文件中布局,在activity文件中获取数据并进行处理。

layout文件

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

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/first_num"
            android:textSize="@dimen/num_text_size" />

        <EditText
            android:id="@+id/firstEdit"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:hint="@string/first_num_hint"
            android:textSize="@dimen/num_text_size" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/sec_num"
            android:textSize="@dimen/num_text_size" />

        <EditText
            android:id="@+id/secEdit"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:hint="@string/sec_num_hint"
            android:textSize="@dimen/num_text_size" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <Button
            android:id="@+id/addBtn"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="@dimen/btn_margin"
            android:text="@string/opr_add"
            android:textSize="@dimen/btn_text_size" />

        <Button
            android:id="@+id/minusBtn"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="@dimen/btn_margin"
            android:text="@string/opr_minus"
            android:textSize="@dimen/btn_text_size" />

        <Button
            android:id="@+id/productBtn"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="@dimen/btn_margin"
            android:text="@string/opr_product"
            android:textSize="@dimen/btn_text_size" />

        <Button
            android:id="@+id/divideBtn"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="@dimen/btn_margin"
            android:text="@string/opr_divide"
            android:textSize="@dimen/btn_text_size" />
    </LinearLayout>

    <TextView
        android:id="@+id/resultTV"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/reuslt"
        android:textSize="@dimen/num_text_size" />
</LinearLayout>

string文件

<resources>
    <string name="app_name">Demo0712_Task_Calculator</string>
    <string name="first_num">第一个数</string>
    <string name="sec_num">第二个数</string>
    <string name="first_num_hint">请输入第一个数</string>
    <string name="sec_num_hint">请输入第二个数</string>
    <string name="opr_add">+</string>
    <string name="opr_minus">-</string>
    <string name="opr_product">*</string>
    <string name="opr_divide">/</string>
    <string name="reuslt">结果是</string>

</resources>

dimens文件

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <dimen name="num_text_size">20sp</dimen>
    <dimen name="btn_text_size">28sp</dimen>
    <dimen name="btn_margin">5dp</dimen>
</resources>

activity文件

package com.example.demo0712_task_calculator;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.text.TextWatcher;
import android.view.View;
import android.widget.AbsListView;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

/**
 * 做一款计算器,实现两个数之间的加减乘除。
 */
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    private EditText firstEdit;
    private EditText secEdit;
    private TextView resultTV;
    private Button addBtn;
    private Button minusBtn;
    private Button productBtn;
    private Button divideBtn;
    private int num1 = 0;
    private int num2 = 0;
    private int result = 0;

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

        firstEdit = findViewById(R.id.firstEdit);
        secEdit = findViewById(R.id.secEdit);
        resultTV = findViewById(R.id.resultTV);

        addBtn = findViewById(R.id.addBtn);
        minusBtn = findViewById(R.id.minusBtn);
        productBtn = findViewById(R.id.productBtn);
        divideBtn = findViewById(R.id.divideBtn);

//        CalListener listener = new CalListener();//方法一
//        addBtn.setOnClickListener(listener);//和方法二
//        minusBtn.setOnClickListener(listener);
//        productBtn.setOnClickListener(listener);
//        divideBtn.setOnClickListener(listener);

        addBtn.setOnClickListener(this);//方法三
        minusBtn.setOnClickListener(this);
        productBtn.setOnClickListener(this);
        divideBtn.setOnClickListener(this);
    }

    //方法二:方法一的优化,方法一的类在onCreate中只使用一次,可以将它创建成一个匿名内部类。new一个类的同时写出具体的实现方法。
    private View.OnClickListener listener = new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            //            Button btn = (Button) v;
//            Toast.makeText(MainActivity.this, "当前点击的是:" + btn.getText().toString(), Toast.LENGTH_SHORT).show();
            num1 = Integer.parseInt(firstEdit.getText().toString());
            num2 = Integer.parseInt(secEdit.getText().toString());
            switch (v.getId()) {//根据v的id来判断要进行哪个运算
                case R.id.addBtn:
                    result = num1 + num2;
                    break;
                case R.id.minusBtn:
                    result = num1 - num2;
                    break;
                case R.id.productBtn:
                    result = num1 * num2;
                    break;
                case R.id.divideBtn:
                    result = num1 / num2;
                    break;
            }
            resultTV.setText(getString(R.string.reuslt) + result + "");
        }
    };

    //方法三:让Activity实现OnClickListener这个接口。
    @Override
    public void onClick(View v) {
        //            Button btn = (Button) v;
//            Toast.makeText(MainActivity.this, "当前点击的是:" + btn.getText().toString(), Toast.LENGTH_SHORT).show();
        num1 = Integer.parseInt(firstEdit.getText().toString());
        num2 = Integer.parseInt(secEdit.getText().toString());
        switch (v.getId()) {//根据v的id来判断要进行哪个运算
            case R.id.addBtn:
                result = num1 + num2;
                break;
            case R.id.minusBtn:
                result = num1 - num2;
                break;
            case R.id.productBtn:
                result = num1 * num2;
                break;
            case R.id.divideBtn:
                result = num1 / num2;
                break;
        }
        resultTV.setText(getString(R.string.reuslt) + result + "");
    }

    //方法一:将重复的OnClickListener写成一个内部类,在onCreat中new出来使用。先写一个类,在new。
    class CalListener implements View.OnClickListener {
        @Override
        public void onClick(View v) {
//            Button btn = (Button) v;
//            Toast.makeText(MainActivity.this, "当前点击的是:" + btn.getText().toString(), Toast.LENGTH_SHORT).show();
            num1 = Integer.parseInt(firstEdit.getText().toString());
            num2 = Integer.parseInt(secEdit.getText().toString());
            switch (v.getId()) {//根据v的id来判断要进行哪个运算
                case R.id.addBtn:
                    result = num1 + num2;
                    break;
                case R.id.minusBtn:
                    result = num1 - num2;
                    break;
                case R.id.productBtn:
                    result = num1 * num2;
                    break;
                case R.id.divideBtn:
                    result = num1 / num2;
                    break;
            }
            resultTV.setText(getString(R.string.reuslt) + result + "");
        }
    }
}


收获

当有一个方法要在多处写出时,使用以下方法对其进行优化:

方法一:可以将其写成一个内部类,在onCreate中new出来,在调用使用new出来的对象名即可。

方法二:可以将其写成一个匿名内部类,在onCreate中不用再new了,在调用处使用对象名就可以。

方法三:可以让Activity实现该接口,重写该方法,在调用处直接使用this即可。

se R.id.divideBtn:
result = num1 / num2;
break;
}
resultTV.setText(getString(R.string.reuslt) + result + “”);
}
}
}


## 收获

当有一个方法要在多处写出时,使用以下方法对其进行优化:

方法一:可以将其写成一个内部类,在onCreate中new出来,在调用使用new出来的对象名即可。

方法二:可以将其写成一个匿名内部类,在onCreate中不用再new了,在调用处使用对象名就可以。

方法三:可以让Activity实现该接口,重写该方法,在调用处直接使用this即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值