安卓视图逻辑分离的开发方式

  • 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)
    • 修改如下。
    • 此时运行代码,得到想要的结果了。
  • 初写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);}}
        
    • 运行结果如下。
  • 这次已经了解了app开发的最基础的流程和文件编辑结构。

安卓入门系列-03安卓的开发方式(逻辑与视图分离)相关推荐

  1. 安卓入门系列-09一个实战小项目(备忘录Memo)

    一个简单的安卓平台下的备忘录 背景 之前已经介绍了不少的控件(TextView和ListView等等)以及开发中最常见的组件(Activity)(Service的权重在我心中没有Activity重要, ...

  2. 机器学习入门系列三(关键词:逻辑回归,正则化)

    机器学习入门系列三(关键词:逻辑回归,正则化) 目录(?)[+] 一逻辑回归 逻辑回归 假设表示 决策边界 代价函数 其他优化方法 多元分类 二正则化 一.逻辑回归 1.逻辑回归 什么是逻辑回归问题, ...

  3. 【Python零基础快速入门系列 | 03】AI数据容器底层核心之Python列表

    • 这是机器未来的第7篇文章 原文首发地址:https://blog.csdn.net/RobotFutures/article/details/124957520 <Python零基础快速入门 ...

  4. 【物体检测快速入门系列 | 03】Windows部署Docker GPU深度学习开发环境

    这是机器未来的第3篇文章 原文首发链接:https://blog.csdn.net/RobotFutures/article/details/124815912 1. 概述 在<物体检测快速入门 ...

  5. 安卓入门系列-07常用UI控件(长文)

    常用UI控件 简介 这一篇介绍开发中的常用UI控件. 布局管理器 所有布局管理器都是ViewGroup的子类,都可作为容器类使用.继承自View,所以也可嵌套. 常见的布局之前已经提到了三种,这里不再 ...

  6. 安卓入门系列-02创建一个项目

    利用Android Studio创建一个项目 说明 Android Studio 是项目式开发,和eclipse有所不同,需要习惯. 创建项目 点击第一行,创建一个新项目. 在1处填入项目名称,2处填 ...

  7. 安卓入门系列-06常见布局之ConstraintLayout(约束布局)

    约束布局(ConstraintLayout)的使用 背景 之前已经提到了六大基础布局的最常见的两种,其余四种百度都有完整的教程,不多提及了.但是在布局的最后想提一下这个突然崛起的约束布局. 很多人说现 ...

  8. 安卓入门系列-01开发工具Android Studio的安装

    Android Studio的安装 背景 谷歌在早几年就关闭了第三方支持,现在官方主推的开发工具就是Android Studio,所以我的安卓开发也是从as开始的. 步骤 下载IDE 像安卓这类开发, ...

  9. 安卓进阶系列-03上弹选择框(PopupDialog)的使用

    主要介绍上弹选择框的使用,这个功能基于Dialog实现,为安卓开发常见控件之一.实现方式并非利用第三方控件而是利用安卓原生对话框控件,不过样式自定义了. 1.布局使用 <?xml version ...

最新文章

  1. 为什么linux的TTY登录程序getty/agetty一般都会设置一个-L的option?
  2. [家里蹲大学数学杂志]第418期南开大学2013年实变函数期末考试试题参考解答
  3. qt mysql 系统时间_使用QT和参数在SQLite数据库中插入日期时间
  4. 阿里云张献涛:公共云正不断向外延伸,一云多态是未来趋势
  5. 北京化工大学通信工程linux,北京化工大学通信工程专业解读
  6. OpenShift 4 - 用 Quay Operator 安装 Quay 环境(4.10 修正)
  7. mysql学习笔记(常用语句)
  8. mysql 存储过程调用 mybatis/hibernate
  9. 浏览器滚动条默认样式改变
  10. 计算机课程教学调查问卷,计算机基础课程调查问卷
  11. 牛牛的DRB迷宫II
  12. 根据生日定时发送生日祝福邮件
  13. mymps蚂蚁分类信息模板二次开发调用标签
  14. Ubuntu切换窗口,快速返回桌面
  15. k8s集群安装之kubeadm
  16. SparkSession
  17. 深入理解JVM的对象创建过程
  18. 深圳富士康有搞什么啊?又猝死了一个!
  19. gbase 8a 配置手册
  20. 华罗庚统筹法与计算机专业,华罗庚的《统筹方法》

热门文章

  1. 设计模式在Netty 中的应用-策略模式源码举例
  2. MyBatis 源码解读-settingsAsProperties()
  3. webpack打包css文件
  4. Spring AOP源码解析(二)—— AOP引入
  5. kafka不使用自带zk_Kafka监控必备——Kafka-Eagle 2.0.2正式发布
  6. excel自动生成舒尔特表_EXCEL自动生成的PPT
  7. LSTM股票价格预测
  8. J-LINK不能烧写(错误:JLink Warning: RESET (pin 15) high, but should be low. Please check target)
  9. ArcGIS特殊标注效果的简单实现
  10. 慕课-北京理工大学 机器学习 大学生上网时间 聚类,小白学习