安卓入门系列-03安卓的开发方式(逻辑与视图分离)
安卓视图逻辑分离的开发方式
- App的控制方式
- 一般而言,App的控制由两部分组成:界面和逻辑。
- 这里界面的布局由资源文件(res文件夹)来控制,其中主要的布局文件是res下layout文件夹下的xml文件,安卓开发使用xml控制布局,res其他文件均为其服务。其中,xml文件是一种结构化数据存储的文件形式,在开发中很是常用,与json类似。
- 而逻辑也就是业务逻辑的主要处理由java目录下的java代码来控制,java丰富的包以及虚拟机的运行方式,提高了安卓开发的速度和效率。
- 初写layout布局文件
- 在原来的默认项目的基础上,双击res下的layout里的目前唯一的一个文件,activity_main.xml文件,其实这是IDE帮开发者生成的一个MainActivity的布局文件。我们看到如下的界面。
- 显然,这是一个图形拖动的布局设计界面,这种图形化的绝对设计方法是不合理的,因为安卓的手机版本很多,屏幕分辨率各不相同,代码控制的相对布局方法才是合适的。(这里建议且只建议这么书写布局文件)
- 点击下方的Text即切换编辑方式为代码控制。
- 经过上面的操作,看到了如下的代码文件。(右侧是预览效果通过最右侧的Preview决定是否开启,新手建议开启)
- 可以看到,这个文件的xml配置在第一行。(xml语法可以在w3cschool上学习,很简单)
- 随即的就是一个安卓第三方包的布局,ConstraintLayout布局标签。(后面会介绍两种基本布局:Relativelayout和LinearLayout,这是比较基础的)我们修改布局文件为Linearayout(指定线性布局方向为垂直)。运行程序。
- 代码如下
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context=".MainActivity"><TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:text="Hello World 1"/><TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:text="Hello World 2"/><TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:text="Hello World 3"/><TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:text="Hello World 4"/></LinearLayout>
- 此时通过预览发现,顶部的bar不是我们想要的,修改mainfests目录下AndroidManifest.xml,在根节点中找到application节点有这样一个属性。
android:theme="@style/AppTheme"
- 显然,可以看到这个主题是来自res下的style里面的定义。(这里两种处理:1.修改style的定义,不改动mainfest这个文件;2.修改manifest文件为其他主题,这个主题自己定义在style里面。我选择法1)
- 修改如下。
- 此时运行代码,得到想要的结果了。
- 在原来的默认项目的基础上,双击res下的layout里的目前唯一的一个文件,activity_main.xml文件,其实这是IDE帮开发者生成的一个MainActivity的布局文件。我们看到如下的界面。
- 初写java代码已经绑定组件
- 选择非测试的java代码包中的MainActivity.java文件,打开。
package com.zc.helloworld;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}}
- 这个代码比较简单,继承了安卓开发支持包里的AppCompatActivity。现在来让组件关联到java代码里面,以便业务逻辑的处理。
- 要想获得组件的控制,必须要唯一确定组件,这里开发为每一个组件提供了id这个属性,且封装到了R中。(R是资源文件)
- 修改xml布局文件如下。(为了方便演示加了一个按钮组件)
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context="com.zc.helloworld.MainActivity"android:orientation="vertical"><TextViewandroid:id="@+id/tv_01"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="Hello World 1"/><TextViewandroid:id="@+id/tv_02"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="Hello World 2"/><TextViewandroid:id="@+id/tv_03"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="Hello World 3"/><TextViewandroid:id="@+id/tv_04"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="Hello World 4"/><Buttonandroid:id="@+id/btn_01"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="I am Button"/></LinearLayout>
- java代码修改后的。(已经注释)
package com.zc.helloworld;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.Button;import android.widget.TextView;public class MainActivity extends AppCompatActivity {private Button btn;private TextView tv_01,tv_02,tv_03,tv_04;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);bindViews();// 绑定得到组件后,为按钮添加点击事件btn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// 获得当前文本内容,并添加一个字符串后设置新的文本内容String t1 = tv_01.getText().toString();tv_01.setText(t1+"Java is beautiful");String t2 = tv_02.getText().toString();tv_02.setText(t2+"Java is beautiful");String t3 = tv_03.getText().toString();tv_03.setText(t3+"Java is beautiful");String t4 = tv_04.getText().toString();tv_04.setText(t4+"Java is beautiful");}});}private void bindViews() {// 使用AppCompatActivity的findViewById方法找到指定的组件并且和变量绑定btn = (Button) findViewById(R.id.btn_01);tv_01 = (TextView) findViewById(R.id.tv_01);tv_02 = (TextView) findViewById(R.id.tv_02);tv_03 = (TextView) findViewById(R.id.tv_03);tv_04 = (TextView) findViewById(R.id.tv_04);}}
- 运行结果如下。
- 选择非测试的java代码包中的MainActivity.java文件,打开。
- 这次已经了解了app开发的最基础的流程和文件编辑结构。
安卓入门系列-03安卓的开发方式(逻辑与视图分离)相关推荐
- 安卓入门系列-09一个实战小项目(备忘录Memo)
一个简单的安卓平台下的备忘录 背景 之前已经介绍了不少的控件(TextView和ListView等等)以及开发中最常见的组件(Activity)(Service的权重在我心中没有Activity重要, ...
- 机器学习入门系列三(关键词:逻辑回归,正则化)
机器学习入门系列三(关键词:逻辑回归,正则化) 目录(?)[+] 一逻辑回归 逻辑回归 假设表示 决策边界 代价函数 其他优化方法 多元分类 二正则化 一.逻辑回归 1.逻辑回归 什么是逻辑回归问题, ...
- 【Python零基础快速入门系列 | 03】AI数据容器底层核心之Python列表
• 这是机器未来的第7篇文章 原文首发地址:https://blog.csdn.net/RobotFutures/article/details/124957520 <Python零基础快速入门 ...
- 【物体检测快速入门系列 | 03】Windows部署Docker GPU深度学习开发环境
这是机器未来的第3篇文章 原文首发链接:https://blog.csdn.net/RobotFutures/article/details/124815912 1. 概述 在<物体检测快速入门 ...
- 安卓入门系列-07常用UI控件(长文)
常用UI控件 简介 这一篇介绍开发中的常用UI控件. 布局管理器 所有布局管理器都是ViewGroup的子类,都可作为容器类使用.继承自View,所以也可嵌套. 常见的布局之前已经提到了三种,这里不再 ...
- 安卓入门系列-02创建一个项目
利用Android Studio创建一个项目 说明 Android Studio 是项目式开发,和eclipse有所不同,需要习惯. 创建项目 点击第一行,创建一个新项目. 在1处填入项目名称,2处填 ...
- 安卓入门系列-06常见布局之ConstraintLayout(约束布局)
约束布局(ConstraintLayout)的使用 背景 之前已经提到了六大基础布局的最常见的两种,其余四种百度都有完整的教程,不多提及了.但是在布局的最后想提一下这个突然崛起的约束布局. 很多人说现 ...
- 安卓入门系列-01开发工具Android Studio的安装
Android Studio的安装 背景 谷歌在早几年就关闭了第三方支持,现在官方主推的开发工具就是Android Studio,所以我的安卓开发也是从as开始的. 步骤 下载IDE 像安卓这类开发, ...
- 安卓进阶系列-03上弹选择框(PopupDialog)的使用
主要介绍上弹选择框的使用,这个功能基于Dialog实现,为安卓开发常见控件之一.实现方式并非利用第三方控件而是利用安卓原生对话框控件,不过样式自定义了. 1.布局使用 <?xml version ...
最新文章
- 为什么linux的TTY登录程序getty/agetty一般都会设置一个-L的option?
- [家里蹲大学数学杂志]第418期南开大学2013年实变函数期末考试试题参考解答
- qt mysql 系统时间_使用QT和参数在SQLite数据库中插入日期时间
- 阿里云张献涛:公共云正不断向外延伸,一云多态是未来趋势
- 北京化工大学通信工程linux,北京化工大学通信工程专业解读
- OpenShift 4 - 用 Quay Operator 安装 Quay 环境(4.10 修正)
- mysql学习笔记(常用语句)
- mysql 存储过程调用 mybatis/hibernate
- 浏览器滚动条默认样式改变
- 计算机课程教学调查问卷,计算机基础课程调查问卷
- 牛牛的DRB迷宫II
- 根据生日定时发送生日祝福邮件
- mymps蚂蚁分类信息模板二次开发调用标签
- Ubuntu切换窗口,快速返回桌面
- k8s集群安装之kubeadm
- SparkSession
- 深入理解JVM的对象创建过程
- 深圳富士康有搞什么啊?又猝死了一个!
- gbase 8a 配置手册
- 华罗庚统筹法与计算机专业,华罗庚的《统筹方法》
热门文章
- 设计模式在Netty 中的应用-策略模式源码举例
- MyBatis 源码解读-settingsAsProperties()
- webpack打包css文件
- Spring AOP源码解析(二)—— AOP引入
- kafka不使用自带zk_Kafka监控必备——Kafka-Eagle 2.0.2正式发布
- excel自动生成舒尔特表_EXCEL自动生成的PPT
- LSTM股票价格预测
- J-LINK不能烧写(错误:JLink Warning: RESET (pin 15) high, but should be low. Please check target)
- ArcGIS特殊标注效果的简单实现
- 慕课-北京理工大学 机器学习 大学生上网时间 聚类,小白学习