Android应用开发的一般文件组织结构讲解

认识Android编程各个文件之间的联系和使用方法,以及认识Activity文件结构的大体可以看下图:

代码在src中的.java文件中编辑,gen目录下有一个R.java的文件,这个文件存储res目录下各种资源文件的id号,在主文件java中调用该资源的时候直接调用id号即可,如 R.layout.main ,这个条目得打开R.java文件中查看,"R"对应R.java文件,"layout"对应R.java文件中的layout类,"main"对应layout类中的一个静态常量声明。

实际上res中的每一个文件都会在R.java中自动产生静态常量,这是res目录和assets目录最大的不同之处,这样做的好处不言而喻,对资源的修改不会对代码产生任何的影响,因为代码中使用的只是ID号码而已。

res目录中的前三个文件夹是存放图片资源的,而且通常情况下同一张图片要有三个版本二,高低中分辨率。

第四个文件夹是存放布局文件的,main.xml,一个Activity对应一个xml文件,而且每个Activity都要在AndroidMainfest.xml中注册一下。default.properties文件在学java的时候接触过,无非也是对对代码的可重复性使用和修改提供了方便而已。第一个Java Activity程序,会体现出这些文件之间的关系和使用。

下面程序任务:添加一个显示文本和一个按钮

对Activity的初步认识:就像一个窗口,能显示信息,又像一个容器,能容纳功能空间,如button,在程序角度上看,又像一个 类,可以和其他的类(Activity)发生联系。

创建Activity的要点:

一个Activity就是一个类,类名随意起,不过必须继承Activity这个父类。
需要复写onCreate()方法
每一个Activity都应该在AndroidManifest.xml文件中进行配置
为Activity添加必要的控件
整体文件代码预览:

MyActivity.java 文件

package geeker.MyActivity;
import android.app.Activity;
import android.os.Bundle;
import android.widget.Button;
import android.widget.TextView;
public class MyActivity extends Activity {
  //成员变量的声明
  private TextView myTextView = null;
  private Button myButton = null;
  //重写OnCreate方法,会自动生成
  public void onCreate(Bundle savedInstanceState) {
    //调用父类方法,该句代码自动生成
    super.onCreate(savedInstanceState);
    //通过布局文件的id调用该Activity所使用的布局文件
    setContentView(R.layout.main);
    //通过findViewById()方法拿到布局文件中添加的控件
    //不过在布局文件中添加控件的时候必须定义id号,
    //如:android:id="@+id/myTextView"
    myTextView = (TextView)findViewById(R.id.myTextView);
    myButton = (Button)findViewById(R.id.myButton);
    //向控件上制定显示文字
    myTextView.setText("This is my first Activity !");
    myButton.setText("MY FIRST BUTTON");
  }
}

main.xml 文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  >
<TextView
  android:id="@+id/myTextView"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  />
<Button
  android:id="@+id/myButton"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  />
</LinearLayout>

R.jar 文件该文件自动生成,不要自己改动

/* AUTO-GENERATED FILE. DO NOT MODIFY.
 *
 * This class was automatically generated by the
 * aapt tool from the resource data it found. It
 * should not be modified by hand.
 */
package geeker.MyActivity;
public final class R {
  public static final class attr {
  }
  public static final class drawable {
    public static final int icon=0x7f020000;
  }
  public static final class id {
    public static final int myButton=0x7f050001;
    public static final int myTextView=0x7f050000;
  }
  public static final class layout {
    public static final int main=0x7f030000;
  }
  public static final class string {
    public static final int app_name=0x7f040001;
    public static final int hello=0x7f040000;
  }
}

其实走一遍添加Button的流程就明白各个文件间的联系了:

1. 先打开main.xml文件,加一个button按钮的布局

<Button
  android:id="@+id/myButton"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  />

2. 其实上一步完成后,编译运行已经能看到一个Button按钮了,但是我想在按钮上添加文字以说明该按钮的作用,在java中的程序为 :
Button bt = new Button();
bt.setText("MY FIRST BUTTON");

那么在Android程序中如何在.java源文件中拿到刚才在main.xml中添加的控件呢?

基于这个目的,在main.xml文件中加了此句:android:id="@+id/myButton",这一句使得R.java文件中多了一个叫id的类,该控件的id号就在这个类中出现了,这样做为了方便.java文件中的调用。

实际上如果不加上一句,该控件是不会在R.java文件中产生id号码的,因为只有在res目录中添加文件才会自动在R.java中产生id号,而添加一个控件只是在一个资源文件中做修改而已,所以不会自动产生id号。

我们可以看一下R.java文件中自动产生的ID代码:

public static final class id {
    public static final int myButton=0x7f050001;
    public static final int myTextView=0x7f050000;
  }

然后在.java文件中就可通过getViewById()方法拿到控件了。

拿到控件之后就可以像java程序中一样进行相关操作了,代码如:

private Button myButton = null;
myButton = (Button)findViewById(R.id.myButton);
myButton.setText("MY FIRST BUTTON");

实际上这个流程只体现了xml文件和R.java文件之间的联系(通过该句:android:id="@+id/myButton),以及.java与R.java之间的联系(通过该句:findViewById(R.id.myTextView) )。补充一下其他文件关系的代码体现:

MyActivity.java文件与Main.xml文件的联系时通过MyActivity.java文件中的setContentView(R.layout.main);体现的,因为一个Activity文件要对应一个布局文件。

MyActivity.java文件与AndroidManifest.xml文件之间的联系时通过AndroidManifest.xml文件中的。

<activity android:name=".MyActivity"
         android:label="@string/app_name">
      <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
      </intent-filter>
    </activity>

来体现的,这也说明了Activity创建的关键点之一:每一个Activity都应该在AndroidManifest.xml文件中进行配置。

PS:获取Android的文件列表的方法

有的时候我们的程序需要去对android的指定目录或者全局目录进行遍历获取其中的文件,但是获取文件的时候可能会遇到无法列出文件夹中的文件的问题,这就是我出现的问题,对于某个子文件夹进行获取listFiles()的时候返回为NULL,也就是不允许列出文件夹中内容。这个是由于android中的安全机制的缘故,由于android继承了Linux系统的传统,对于某个特定的目录有用户的权限,一共分为三种--可读,可写,可执行;虽然说我们可以设置某个特定的目录的权限,但是对于目录里面的子目录和子文件都可以进行权限的设置,也就是说出了根目录权限之外,子目录本身的权限也决定了子目录可否访问,这一点我们需要清楚了解,所以我们在判断完了是否是目录之外,我们还需要在进行listFiles()获取File[]数据后判断获取的数组是否为空,如果为空的话,文件夹是不可访问的。样例代码如下:

package net.nowamagic.file;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import android.util.Log;
/**
 * @author
 * function 用于扫描SD卡上的文件
 *
 */
public class FileScan {

  private static final String TAG = "FileScan";
  public HashMap<String, String> getMusicListOnSys(File file) {

    //从根目录开始扫描
    Log.i(TAG, file.getPath());
    HashMap<String, String> fileList = new HashMap<String, String>();
    getFileList(file, fileList);
    return fileList;
  }

  /**
   * @param path
   * @param fileList
   * 注意的是并不是所有的文件夹都可以进行读取的,权限问题
   */
  private void getFileList(File path, HashMap<String, String> fileList){
    //如果是文件夹的话
    if(path.isDirectory()){
      //返回文件夹中有的数据
      File[] files = path.listFiles();
      //先判断下有没有权限,如果没有权限的话,就不执行了
      if(null == files)
        return;

      for(int i = 0; i < files.length; i++){
        getFileList(files[i], fileList);
      }
    }
    //如果是文件的话直接加入
    else{
      Log.i(TAG, path.getAbsolutePath());
      //进行文件的处理
      String filePath = path.getAbsolutePath();
      //文件名
      String fileName = filePath.substring(filePath.lastIndexOf("/")+1);
      //添加
      fileList.put(fileName, filePath);
    }
  }

}
(0)

相关推荐

  • 浅谈Android开发中项目的文件结构及规范化部署建议

    一.几句话 使用Gradle及其推荐的项目框架 把密码等敏感数据放入gradle.properties 不要自己写Http客户端,使用Volley或OkHttp库 使用Jackson库来解析JSON数据 避免Guava并出于Dalvik 65K methods limit不要使用过多的库 使用Fragment来绘制UI界面 Activity主要用来管理Fragment 布局文件XML也是代码,好好组织它们 在布局文件里,使用styles以避免重复的属性 使用多个style文件而不是一个巨大的st

  • Android源码中的目录结构详解

    Android 2.1 |-- Makefile |-- bionic                        (bionic C库) |-- bootable                (启动引导相关代码) |-- build                        (存放系统编译规则及generic等基础开发包配置) |-- cts                        (Android兼容性测试套件标准) |-- dalvik                    

  • 使用Docker来加速构建Android应用的基本部署思路解析

    意义 极大的缩短安卓开发到测试到产品到渠道的距离. 给安卓程序员减轻负担. Google做的环境已经特别到位了,放到docker里面明显不会有多大的坑(误,逃). Dockerfile https://github.com/lijianying10/FixLinux/blob/master/dockerfiles/androidautobuild/Dockerfile 团队协作的故事 在敏捷开发的站立会议上,我作为一个后端程序员发现安卓程序员发布的时间大概是半个小时左右的时间,我觉得时间太长了应

  • 浅谈Android系统的基本体系结构与内存管理优化

    Android运行环境一览 Android基于linux内核,面向移动终端的操作系统.主要包括以下几个方面: Application Framework: 这一层为应用开发者提供了丰富的应用编程接口,如 Activity Manager,Content Provider,Notification Manager,以及各种窗口 Widget 资源等.所有的APP都是运行在这一层之上. Dalvik 虚拟机: Dalvik VM采用寄存器架构,而不是JVM的栈架构,更适于移动设备.java源代码经过

  • Windows下React Native的Android环境部署及布局示例

    搭建基础环境 JDK(必须,不解释) SDK(建议使用Android Studio,集成SDK以及模拟器) genymotion(如果是使用真机或者Android Studio自带的模拟器,可以选择不装) NVM(node版本控制器,需要node4.0以上版本) 以上配置不是必须,可自行选择适合自己的环境,部分安装过程可能会涉及到翻墙,需要配置代理 配置踩坑记录 genymotion 这里选择genymotion模拟器来讲解,也会提一下Android Studio自带的模拟器的一些注意点,使用真

  • android sdk安装及开发环境部署

    引言在windows安装Android的开发环境不简单也说不上算复杂,本文写给第一次想在自己Windows上建立Android开发环境投入Android浪潮的朋友们,为了确保大家能顺利完成开发环境的搭建,文章写的尽量详细,希望对准备进入Android开发的朋友有帮助.本教程将分为五个步骤来完成Android开发环境的部署. 第一步:安装JDK. 第二步:配置Windows上JDK的变量环境 . 第三步: 下载安装Eclipse . 第四步:下载安装Android SDK . 第五步:为Eclip

  • 仅5步搞定Android开发环境部署 Android开发环境搭建教程

    在windows安装Android的开发环境不简单也说不上算复杂,本文写给第一次想在自己Windows上建立Android开发环境投入Android浪潮的朋友们,为了确保大家能顺利完成开发环境的搭建,文章写的尽量详细,希望对准备进入Android开发的朋友有帮助. 本教程将分为五个步骤来完成Android开发环境的部署. 第一步:安装JDK. 第二步:配置Windows上JDK的变量环境 . 第三步: 下载安装Eclipse . 第四步:下载安装Android SDK . 第五步:为Eclips

  • Android编程入门之HelloWorld项目目录结构分析

    本文实例讲述了Android编程入门之HelloWorld项目目录结构.分享给大家供大家参考,具体如下: 我们介绍了如何搭建Android开发环境及简单地建立一个HelloWorld项目,本篇将通过HelloWorld项目来介绍Android项目的目录结构.本文的主要主题如下: 1.HelloWorld项目的目录结构 1.1.src文件夹 1.2.gen文件夹 1.3.Android 2.1文件夹 1.4.assets 1.5.res文件夹 1.6.AndroidManifest.xml 1.7

  • 实现android自动化测试部署与运行Shell脚本分享

    我的配置是linux 64, android4.2.2的sdk. 实现的细节都在代码注释里了,变量名以及echo的内容也是说明的一部分. 主流程为: 1.检测是否指定端口的模拟器已经运行,若有则关闭 2.创建模拟器 3.启动模拟器 4.用ant build包,通过检查bin目录下有没有apk来确定是否成功 5.检查指定端口的模拟器是否已正常运行 6.用adb安装apk 7.启动apk的activity,让程序自己跑 8.用shell ps循环检测程序是否已退出,若已退出,检查是否sdcard是是

  • Android应用开发的一般文件组织结构讲解

    认识Android编程各个文件之间的联系和使用方法,以及认识Activity文件结构的大体可以看下图: 代码在src中的.java文件中编辑,gen目录下有一个R.java的文件,这个文件存储res目录下各种资源文件的id号,在主文件java中调用该资源的时候直接调用id号即可,如 R.layout.main ,这个条目得打开R.java文件中查看,"R"对应R.java文件,"layout"对应R.java文件中的layout类,"main"对

  • Android编程开发之打开文件的Intent及使用方法

    本文实例讲述了Android编程开发之打开文件的Intent及使用方法.分享给大家供大家参考,具体如下: 在写文件管理系统时会用到各种打开不同格式的文件的需求,由于Android系统默认内置了一些可以打开的系统应用,但还是不能满足需求,比如打开视频文件.word等,需要安装相应的播放软件才可以使用,这时程序会通过Intent查找可以使用的软件实现通过代码打开一个文件需要2部分,一部分是要获取到不同文件的后缀,以便根据需求匹配相应的Intent,另一个就是不同格式的文件打开的Intent不同 1.

  • Android NDK开发(C语言-文件读写)

    目录 1.文件读写 1.1打开文件 1.2关闭文件 1.3读取文件 1.4写入文件 1.5读写二进制I/O文件 1.6获取文件的大小 1.7文本简单加密.解密 1.8二进制文件简单加解密 1.文件读写 一个文件,无论它是文本文件还是二进制文件,都是代表了一系列的字节.C 语言不仅提供了访问顶层的函数,也提供了底层(OS)调用来处理存储设备上的文件. 1.1打开文件 我们可以使用 fopen( ) 函数来创建一个新的文件或者打开一个已有的文件,这个调用会初始化类型 FILE 的一个对象,类型 FI

  • Android中的build.gradle文件深入讲解

    一.什么是Gradle gradle是一个项目构建工具,java开发中有两个大名鼎鼎的项目构建Maven,Ant,其中maven简单易控深受开发者喜爱. 项目构建工具是什么?能干吗? 开发某些项目时,需要很多jar或者库的支持,还没开始开发就下载了n多个库,浪费了时间不说,这些库之间兼容性又无法保证.删了?白下载了.不删?又不兼容.此时就需要使用项目构建工具,简单的说就是一个可以根据简单的配置文件自动去下载相应包/库的软件.自动的还很简单,不用岂不亏了.多个项目构建工具各有特点,但是核心思想一样

  • Android开发实现Files文件读取解析功能示例

    本文实例讲述了Android开发实现Files文件读取解析功能.分享给大家供大家参考,具体如下: package com.example.file; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; import android.widg

  • Android开发之资源文件用法实例总结

    本文实例总结了Android开发之资源文件用法.分享给大家供大家参考,具体如下: 这里记录在Android开发中经常用到的一些用法 arrays.xml定义数组 例: <resources> <!-- share items --> <string-array name="app_share_items"> <item>新浪微博</item> <item>腾讯微博</item> </string-

  • Android开发中的文件操作工具类FileUtil完整实例

    本文实例讲述了Android开发中的文件操作工具类FileUtil.分享给大家供大家参考,具体如下: package com.ymerp.android.tools; import java.io.BufferedReader; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java

  • Android开发Jetpack组件ViewModel使用讲解

    目录 前言 ViewModel概述 ViewModel使用 ViewModel源码 前言 学习ViewModel之前首先我们得简单了解下MVP和MVVM,因为ViewModel是MVVM中的一个元素 MVP MVVM 在MVP中View想要调用Model数据层,需要经过中间层Presenter, 这样就实现了View和Model的解耦,这也是MVP和MVC的差别: 但是如果一个Activity中有太多交互,那么我们的View接口数量就会很庞大达到十几个也不足为奇,并且在View层调用了Prese

  • Android开发Jetpack组件Room使用讲解

    目录 简介 Room使用步骤 1 添加依赖 2 创建Entity实体类 3 声明Dao对象 4 声明Database对象 5 获取数据 6 最终使用 简介 Room 是 Google 官方推出的数据库 ORM 框架.ORM 是指 Object Relational Mapping,即对象关系映射,也就是将关系型数据库映射为面向对象的语言.使用 ORM 框架,我们就可以用面向对象的思想操作关系型数据库,不再需要编写 SQL 语句. Room使用步骤 1 添加依赖 build.gradle {app

  • Android开发Jetpack组件LiveData使用讲解

    目录 LiveData概述 LiveData优势 共享资源 LiveData使用 1 LiveData基本使用 2 Transformations.map() 3 Transformations.switchMap() 4 MediatorLiveData.addSource()合并数据 LiveData概述 LiveData 是一种可观察的数据存储器类: 与常规的可观察类不同,LiveData 具有生命周期感知能力,意指它遵循其他应用组件(如 Activity.Fragment 或 Servi

随机推荐