• Android笔记


    Android 开发

    Android 体系结构及开发环境

    Android 体系结构

    1. 应用程序 (Application)

    基于 Java 语言编写,基于Android 系统的 API 构建的

    1. 应用程序框架 (Application Framework)

    开发人员所使用的 API 框架

    1. 函数库 (Libraries、Android Runtime)
    2. Linux 内核 (Linux Kernel)

    开发环境的配置

    配置 JDK

    注意记住安装路径

    • 配置环境变量

      • JAVA_HOME: JDK 安装路径
      • PATH:             %JAVA_HOME%in
      • CLASSPATH: .;%JAVA_HOME%lib;%JAVA_HOME%lib ools.jar

      JDK1.5 后非必要,配置可保证向下兼容

    • 在命令行窗口中输入 java -version 是否配置成功

    安装 IDEA

    • 下载 IDEA

    • 激活 IDEA

    • 下载 Android SDK

      • 直接创建一个 Android Poject 按照提示安装即可

      此处未使用手动配置SDK,也可自行下载 Android SDK

      • Tools - Android - SDK Manager 可进行 SDK 管理
      • Tools - Android - AVD Manager 可进行 AVD 管理

      AVD:安卓虚机设备


    Android 应用程序开发

    Android 应用程序组成

    Activity 组件

    • 用户操作的可视化界面
    • Activity 的生命周期四种状态
      • Activity (活动):只有一个 Activity 处于活动状态,内容变亮
      • Paused (暂停):画面变暗,禁止状态
      • Stoped (停止):不可见
      • Dead (死亡):被系统回收或未启动
    流程图 (待补充)
    

    Intent 组件

    Intent 是一种消息机制,用于组件之间调用的方法或所需要的数据

    Intent 对象
    • 目标组件 (Components)
    • 动作 (Action)
    • 数据 (Data)
    • 类别 (Category)
    • 附加数据 (Extras)
    • 标志 (Flags)
    显示 Intent

    通过 Components 实现直接调用

    实现方法
    setComponent(ComponentName name)
    Intent(Context context, Class classObjectInThatContext)
    setClass(Context context, Class classObjectInThatContext)
    setClassName(Context context, String classNameInThatPackage)
    setClassName(String packageName, String classNameThatPackage)
    
    隐式 Intent

    用于不同应用之间的调用

    Broadcast Receiver 组件

    广播接收器是一个专用于接受广播通知并作出处理的组件

    Service 组件

    Service通常位于后台运行,它一般不需要与用户交互,因此Service组件没有图形用户界面

    Content Provider 组件

    用于应用程序之间的数据共享

    View与ViewGroup的概念

    View

    所有可视化控件的父类,提供组件描绘时间处理方法

    ViewGroup

    View类的子类,可以拥有子控件,可以看作是容器

    UI 布局

    公共属性

    属性 描述
    layout_width
    layout_height
    全屏:  match_parent
    自适应:warp_conent
    backgroung 设置背景颜色/图片
    gravity 居中:center | 居上:top
    居左:left      | 居右:right
    垂直居中:center_vertical
    水平居中:center_horizontal
    margin 外边距(marginLeft/Right/Top/Bottom)
    padding 内边距(同上,单位dp)

    线性布局 (LinearLayout)

    属性 描述
    orientation 竖向排列:verticall
    横向排列:horizonta
    weightSum 总权重
    layout_weight 权重(元素的权重占比)
    layout_gravity 设置自己在父元素中的位置

    相对布局 (RelativeLayout)

    属性 描述
    layout_toRightOf 控件左边缘与某控件的右边缘对齐
    layout_alignLeft 控件左边缘与某控件的左边缘对齐
    layout_alignRight 与上同理,另有Top | Bottom
    layout_alignParentLeft 控件左边缘与父控件左边缘对齐
    layout_alignParentRight 与上同理,另有Top | Bottom
    layout_centerParent 置于父控件中间位置
    layout_centerHorizontal 置于父控件水平方向的中心位置
    layout_centerVertical 置于父控件垂直方向的中心位置

    帧布局 (FrameLayout)

    属性 描述
    foreground 设置前景图像
    foregroundGravity 设置前景图像位置

    表格布局 (TableLayout)

    在表格布局中,TableRow 表示一行

    属性 描述
    collapseColumns 隐藏列
    stretchColumns 拉伸列
    shrinkColumns 收缩列

    绝对布局 (absoluteLayout)

    属性 描述
    layout_x 指定子元素的x坐标
    layout_y 指定子元素的y坐标

    网格布局 (GridLayout)

    属性 描述
    rowCount 设置网格行数
    columnCount 设置网格列数
    layout_row 设置元素位于哪行
    layout_column 设置元素位于哪列
    layout_rowSpan 设置元素纵向跨越行数
    layout_columnSpan 设置元素横向跨越行数

    约束布局 (ConstraintLayout)

    属性格式layout_constraint X _to XX Of
    格式说明:将某控件的 X 侧与某控件的 XX 侧对齐

    RTL布局

    百分比布局

    UI 控件

    公共属性

    属性 描述
    id 设置控件 id
    格式:@+id/id_name
    layout_width
    layout_height
    全屏:  match_parent
    自适应:warp_conent

    有文字控件的公共属性

    属性 描述
    text 文本内容

    | textSize | 字体大小 (单位sp,默认 14sp)
    | textColor | 字体颜色 支持3种方式
    @android:color/系统颜色
    @color/自定义   |   #RGB |
    | textStyle | 字体样式 (normal | bold | italic)
    | gravity | 字体位置 (top | bottom | left | right) |
    | singleLine | 单行显示 (true  |  false) |
    | minLine | 最小行数 |
    | maxLine | 最大行数 |

    文本框 TextView

    编辑框 EditView

    <EditView
        android:hint          = "xxx"        // 文本提示信息
        android:password      = "true"       // 设置密码框
        android:phoneNumber   = "true"       // 只能输入数字
        android:cursorVisible = "true/false" // 设定光标显示/隐藏
    />
    

    列表 ListView

    RecyclerView

    图像 ImageView

    <ImageView
        android:scr                = "@drawable/项目资源 | @android:drawable/系统资源"
        android:scaleType          = "center" // 定义伸缩类型 (详见下表)
        android:backgroud          = "#RGB"
        android:contentDescription = "xxx"    // 定义内容描述
    />
    
    属性 描述
    matrix 左上角起始的矩形区域,会裁剪
    fitXY 匹配控件宽高,会变形,不裁剪
    fitStart 伸缩匹配控件,顶部或左侧显示,不裁剪
    fitEnd 伸缩匹配控件,底部或右侧显示,不裁剪
    fitCenter 伸缩匹配控件,居中显示,不裁剪
    center 原尺寸,居中显示,会裁剪
    centerCrop 伸缩匹配控件,居中显示,会裁剪
    centerInside 原图或缩小匹配控件,居中显示,不裁剪

    图片浏览器 GridView

    基于网格索引的图片浏览器

    按钮 Button

    Button 常用子类 CheckButtonRadioButtonToggleButton

    图片按钮 ImageButton

    <ImageButton
        android:layout_width = "200dp"  // 此控件可以设置具体宽高
    />
    

    单选按钮 RadioButton 和 复选按钮 CheckButton

    下拉列表 Spinner

    进度条 ProgressBar

    <ProgerssBar
        style=""         // 设置进度条样式
    />
    android:max = "100"  //在进度条外设置进度条的最大值
    

    拖动条 SeekBar

    日期相关控件

    DatePicker、TimePicker、Calendar

    菜单

    菜单生成方式

    Java 代码动态生成
    final static int MENU_00 = Menu.FIRST;
    final static int MENU_01 = Menu.FIRST + 1;
    final static int MENU_02 = Menu.FIRST + 2;
    // 创建菜单
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        menu.add(0, MENU_00, 0, "menu0").setIcon(R.drawable.pic0);
        menu.add(0, MENU_01, 1, "menu1").setIcon(R.drawable.pic1);
        menu.add(0, MENU_02, 2, "menu2").setIcon(R.drawable.pic2);
        return true;
    }
    
    add() 方法
    MenuItem android.view.Menu.add(int groupId, int itemId, int order, CharSequence title);
    
    参数 描述
    groupId 组 ID (不需要设置未Menu.NONE)
    itemID 每一项的ID,具有唯一性
    order 排序信息
    title 显示标题
    setIcon() 方法

    设置菜单图标

    XML 菜单
    <?xml version = "1.0" encoding = "utf-8">
    <menu xmlns:android = "http://schemas.android.com/apk/res/android">
        <item
            android:id    = "@+id/main_menu_0"
            android:icon  = "@drawable/pic0"
            android:title = "menu0"
        />
        <item
            android:id    = "@+id/main_menu_1"
            android:icon  = "@drawable/pic1"
            android:title = "menu1"
        />
        <item
            android:id    = "@+id/main_menu_2"
            android:icon  = "@drawable/pic2"
            android:title = "menu2"
        />
    </menu>
    

    选项菜单 (Option Menu)

    图标菜单至多为 6 个,OptionsMenu被Activity或者Fragment对象持有

    处理方法
    // 创建菜单 (加载 XML 布局)
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }
    
    // 响应事件
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getIteaId()) {
            case R.id.main_menu_00:
                Toast.makeText(this, "menu1", Toast.LENGTH_SHORT). show(); break;
            case R.id.main_menu_01:
                Toast.makeText(this, "menu2", Toast.LENGTH_SHORT). show(); break;
            case R.id.main_menu_02:
                Toast.makeText(this, "memu3", Toast.LENGTH_SHORT). show(); break;
            default: break;
        }
        return super.onContextItemSelected(item);
    }
    

    快捷菜单/上下文菜单 (Context Menu)

    ContextMenu是被view对象持有

    // 为一个 Button 注册一个 Context Menu
    registerForContextMenu(mContButton);
    
    // 创建菜单并设置监听
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.toobar_menu,menu);
        return super.onCreateOptionsMenu(menu);
    }
    @Override
    public boolean onContextItemSelected(MenuItem item) {
        switch (item.getItemId()){
            case R.id.share_item:
                Toast.makeText(this,"context menu add",Toast.LENGTH_SHORT).show();
        }
        return super.onContextItemSelected(item);
    }
    

    弹出菜单 (PopupMenu)

    // 菜单逻辑封装
    private void showPopupMenu() {
        //创建PopupMenu,并绑定到mContButton
        PopupMenu popupMenu = new PopupMenu(this,mContButton);
        MenuInflater menuInflater = getMenuInflater();
        menuInflater.inflate(R.menu.toobar_menu, popupMenu.getMenu());
        //popupMenu.inflate(R.menu.toobar_menu);  API 14 可以采用这种方式
        popupMenu.show();
    
        //设置item的点击事件
        popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClick(MenuItem item) {
                switch (item.getItemId()){
                    case R.id.add_item:
                        Toast.makeText(this,"Add button clicked",Toast.LENGTH_SHORT).show();
                        break;
                    case R.id.remo_item:
                        invalidateOptionsMenu();
                        Toast.makeText(this,"Remove button clicked",Toast.LENGTH_SHORT).show();
                        break;
                    case R.id.more_item:
                        Toast.makeText(this,"More button clicked",Toast.LENGTH_SHORT).show();
                        break;
                    default:
                        break;
                }
                return  true;
            }
        });
    }
    // mContButton 的点击事件监听
    mContButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            showPopupMenu();
        }
    });
    

    事件处理

    基于监听的事件处理

    处理机制中涉及的对象:
    1. 事件源:事件发生的组件
    2. 事件:是对整个事件信息的封装
    3. 事件处理器:完成事件的处理
    常用处理机制
    在布局文件中指定处理函数
    <?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/loginButton"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:onClick="loginButtonClick"  // 指定单击事件的处理函数
            android:text="登陆" />
    </LinearLayout>
    
    // 编写事件处理函数
    public class MainActivity extends AppCompatActivity {
        public void loginButtonClick (View view){
            // pass
        }
    }
    
    通过具体的对象实现事件处理
    public class MainActivity extends AppCompatActivity {
        private Button loginButton;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            loginButton = findViewById(R.id.loginButton);  // 根据ID查找组件
            // 设置单击事件处理
            loginButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    // pass
                }
            });
        }
    }
    

    基于回调的事件处理机制

  • 相关阅读:
    《RTC — RTC相关操作以及如何同步系统时间》
    《关闭服务器,再次启动服务器提示bind:address already in use》
    《海思中内存分配和优化》
    《开发板 — 查看共享内存情况》
    《通过himm读取指定引脚并保存在共享内存中》
    《开发板 — 格式化TF卡》
    《网络编程 — UDP》
    《网络编程 — 服务器中bind的ip地址是什么》
    《使用gdb中core dump》
    《 Linux套接字编程中的5个隐患 》
  • 原文地址:https://www.cnblogs.com/qq188380780/p/12751887.html
Copyright © 2020-2023  润新知