老王讲IT——第一、二、三章
Android Studio工程结构、控件
一、工程目录说明
每个App的工程结构都差不多,只要掌握了基本结构,后面开发起来就会得心应手。 1 工程目录说明 2 编译配置文件build.gradle 3 App运行配置AndroidManifest.xml 4 在代码中操纵控件
1.1 Android Studio的工程创建分两个层级:
第一个层级通过菜单File→New→New Project创建,这里的新项目是指新的工作空间,对应Eclipse的workspace。 第二个层级通过菜单File→New→New Module创建,这里的新模块是指一个单独的App工程,对应Eclipse的project。 第一次创建的app模块,下面有三个目录: manifests子目录,存放App的运行配置AndroidManifest.xml。 java子目录,存放的是App工程的代码文件。 res子目录,存放的是App工程的资源文件。
这个是Android的文件目录,里面有一个app文件包和Gradle Scripts文件包,
App
Java ------便于我们找到Main Activity类
res --------资源包
Gradle Scripts(固定脚本文件)
地路径、NDK的本地路径等。
1.2 project目录结构
project目录结构会经常使用,project目录和我们使用的 My Eclipse的相似,也会比较熟悉
接下来,我们对于目录的内容进行一一讲解:
文件 | 作用 |
---|---|
.gradle和.idea | 这两个目录下都是AS自动生成的一些文件,我们不需要关心,也不要去手动编辑; |
app | 项目中的代码和资 文件都是放在这个文件下的,之后会对这个文件夹进行详解; |
build | 这个文件夹也无需关心,放的都是编译自动生成的文件; |
gradle | 这个目录下放置了gradle wrapper的配置文件,使用gradle wrapper的方式不需要提前将gradle下载好,而是会根据本地的情况自动决定是否要联网下载gradle; |
.gitignore | 这个与版本控制有关,用来将指定的文件或目录排除在版本控制之外的; |
build.gradle | 这是项目全局的gradle文件,通常也不需要改动,之后会详细介绍里面的内容; |
gradle.properties | 这是全局gradle文件的配置文件; |
gradlew和gradlew.bat | 用来在命令行界面中执行gradle,其中前者在linux和mac系统中使用,后者在windows中; |
local.properties | 指定android SDK的路径; |
settings.gradle | 指定项目中所有引入的模块,具体可看文件,通常模块的引入都是自动完成的,基本不需要手动处理; |
1.2.1 探索最常用的project下的APP目录
build | 这个目录与外层的build目录类似,都是编译时自动生成的文件,我们不用管; |
---|---|
libs | 放置第三方jar包; |
androidTest | 用来编写测试用例用来,进行一些自动化测试; |
java | 放置所有的java逻辑代码; |
res | 放置所有的资源文件(包含图片,字符串,布局等); 所有以drawable开头的都是用来放图片的; 所有以mipmap开头的都是用来放图标的; layout是来放布局文件的; value开头的是用来放字符串、颜色、样式等配置的; |
AndroidManifest | 安卓项目的配置文件,非常重要,自大组件的注册,权限的声明都必须在这个文件中描述,之后的开发中,我们会经常用到这个文件; |
Test | 编写单元测试的,也是自动化测试的一种,目前是用不到的; |
.gitignore | 与外层的.gitignore一样,都是版本控制的; |
app.iml | Intellij IDEA自动生成的文件,我们不需要关心; |
bulid.gradle | 这是app模块的gradle构建脚本,之后会详解; |
1.2.2 res资源目录
目录 | 资源类型 |
---|---|
animator/ | 用于定义属性动画的 XML 文件。 |
anim/ | 用于定义渐变动画的 XML 文件。(属性动画也可保存在此目录中,但为了区分这两种类型,属性动画首选 animator/ 目录。) |
color/ | 用于定义颜色状态列表的 XML 文件。请参阅颜色状态列表资源 |
drawable/ | 位图文件(.png、.9.png、.jpg、.gif)或编译为以下可绘制对象资源子类型的 XML 文件: 位图文件 九宫格(可调整大小的位图) 状态列表 形状 动画可绘制对象 其他可绘制对象 请参阅 Drawable 资源。 |
mipmap/ | 适用于不同启动器图标密度的可绘制对象文件。如需了解有关使用 mipmap/ 文件夹管理启动器图标的详细信息,请参阅管理项目概览。 |
layout/ | 用于定义用户界面布局的 XML 文件。请参阅布局资源。 |
menu/ | 用于定义应用菜单(如选项菜单、上下文菜单或子菜单)的 XML 文件。请参阅菜单资源。 |
raw/ | 需以原始形式保存的任意文件。如要使用原始 InputStream 打开这些资源,请使用资源 ID(即 R.raw.filename)调用 Resources.openRawResource()。 但是,如需访问原始文件名和文件层次结构,则可以考虑将某些资源保存在 assets/ 目录(而非 res/raw/)下。assets/ 中的文件没有资源 ID,因此您只能使用 AssetManager 读取这些文件。 |
values/ | 包含字符串、整型数和颜色等简单值的 XML 文件。 其他 res/ 子目录中的 XML 资源文件会根据 XML 文件名定义单个资源,而 values/ 目录中的文件可描述多个资源。对于此目录中的文件,<resource\s> 元素的每个子元素均会定义一个资源。例如,<string> 元素会创建 R.string 资源,<color> 元素会创建 R.color 资源。 由于每个资源均使用自己的 XML 元素进行定义,因此您可以随意命名文件,并在某个文件中放入不同的资源类型。但是,您可能需要将独特的资源类型放在不同的文件中,使其一目了然。例如,对于可在此目录中创建的资源,下面给出了相应的文件名约定: arrays.xml:资源数组(类型数组)。 colors.xml:颜色值。 dimens.xml:尺寸值。 strings.xml:字符串值。 styles.xml:样式。 请参阅字符串资源、样式资源和更多资源类型。 |
xml/ | 可在运行时通过调用 Resources.getXML() 读取的任意 XML 文件。各种 XML 配置文件(如可搜索配置)都必须保存在此处。 |
font/ | 带有扩展名的字体文件(如 .ttf、.otf 或 .ttc),或包含 元素的 XML 文件。如需详细了解作为资源的字体,请参阅 XML 中的字体。 |
二、TextView控件
1、常用基本控件设置
控件名 | 备注 |
---|---|
LinearLayout | 设置全局(也可以称为容器,而TextView是组件,每一个组件必须在容器之中) |
layout_width | 设置宽度 |
layout_height | 设置高度 |
id | 设置id,想要调用可以在Java中调用Main Activity中调用 调用方法: TextView textView = findViewById(R.id.tv_one); textView.setText("Leo"); |
text | 设置文本 可以在res里面的String.xml中进行设置 |
textColor | 设置字体颜色 |
textSize | 设置字体大小 |
textStyle | 设置字体风格 bold加粗 italic斜体 |
background | 设置控件背景颜色 |
gravity | 设置控件内容对齐方向, textView中是文本 lmaseView中是图片等等 |
2、带阴影的TextView
控件名 | 备注 |
---|---|
shadowColor | 设置阴影颜色,需要和shadowRadius一起使用 |
shadowRadius | 设置阴影模糊程度,设置为0.1变成字体,建议设置为3.0 |
shadowDx | 设置水平偏移 |
shadowDy | 设置竖直偏移 |
3、显示跑马灯需要组件
控件 | 备注 |
---|---|
singleLine | 设置内容单行显示 设置值位true |
focusable | 是否可以获取焦点 设置值位true |
focusableInTouchMode | 用于控制视图在触摸下是否可以聚焦 |
ellipsize | 在这里可以省略文本 marquee跑马灯 |
marqueeRepeatLimit | 控制字幕动画重复的次数 |
4、案例跑马灯
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
>
<TextView
android:layout_width="match_parent"
android:layout_height="200sp"
android:id="@+id/tv_one"
android:text="@string/tv_one"
android:textColor="@color/black"
android:textSize="25sp"
android:textStyle="italic"
android:gravity="center_vertical"
android:shadowColor="@color/red"
android:shadowRadius="3.0"
android:shadowDx="10.0"
android:shadowDy="10.0"
android:singleLine="true"
android:ellipsize="marquee"
android:marqueeRepeatLimit="marquee_forever"
android:focusable="true"
android:focusableInTouchMode="true"
tools:ignore="MissingClass" />
<!-- <requestFocus/>获取焦点,现实跑马灯-->
</LinearLayout>
4.1、注意:
可能会出现没有获取到焦点,解决方法有三
方法一:
在TextView中添加
<requestFocus/> #获取焦点,然后再看
方法二:
在TextView中添加
android:clickable="true" #设置一个点击事件,获取焦点
方法三:
使用Java代码
#在main中的包中创建一个Java类 #名字为My_TextView #然后继承TextView 随后导入TextView中的前三个方法 #以下为代码
package com.example.application0801_2;
import android.content.Context;
import android.util.AttributeSet;
import android.widget.TextView;
import androidx.annotation.Nullable;
public class My_TextView extends TextView {
public My_TextView(Context context) {
super(context);
}
public My_TextView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
public My_TextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
public boolean isFocused() {
return true;
}
}
#创建完成之后返回acticity.xml
#将<TextView更改为
<com.example.application0801_2.TextView
三、Button控件
概述:
随着按钮的状态,去改变他的背景颜色,根据StateListDrawable来进行设置
1、StateListDrawable属性
StateListDrawable是Drawable资源的一种,可以根据不同的状态,设置不同的图片效果,关键节点<selector>,我们只需要将Button的background属性设置为该drawable资源即可轻松实现,按下按钮时不同的按钮颜色或背景
属性名 | 备注 |
---|---|
drawable | 引用的 Drawable位图 |
state_focused | 是否获得焦点 |
state__pressed | 控件是否被按下 |
state_enabled | 控件是否可用 |
state_selected | 控件是否被选择,针对有滚轮的情况 |
state_checked | 控件是否被勾选 |
state_checkable | 控件可否被勾选,eg:checkbox |
state_window_focused | 是否获得面口焦点 |
state_active | 控件是否处于活动状态,egsliding Tab |
state_single | 控件包含多个子控件时,确定是否只显示一个子控件 |
state_first | 控件包含多个子控件时,确定第一个子控件是否处于显示状态 |
state_middlle | 控件包含多个子控件时,确定中间一个子控件是否处于显示状态 |
state_last | 控件包含多个子控件时,确定最后一个子控件是否处于显示状态 |
然后我们经常使用的是前七八个,后面要使用的时候我们在仔细说
2、Button事件处理
在做以下三个事件之前先在Button组件里面设置id,然后在去Java类中调用这个id,使用id名调用实现的以下三中方法。、
Button bin = findViewById(R.id.btn);
2.1点击事件
bin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.e(TAG, "onClick: " );
}
});
2.2长按事件
bin.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View view) {
Log.e(TAG, "onLongClick: ");
return false;
}
});
2.3触摸事件
bin.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
Log.e(TAG, "onTouch: ");
return false;
}
});
注意:
以上三个就是点击事件中的三个Java代码,我们可以启动模拟器在控制台叫它打印出来显示结果
E/led: onTouch: //这个是触摸事件
E/led: onLongClick: //这个是长按事件
E/led: onTouch: //这个是你按着鼠标乱懂得现象
E/led: onClick: //这个是你松开鼠标得现象
这样在控制台打印出来得东西显示不太明显,咱们可以去触摸事件中的MotionEvent motionEvent 中可以看到这三个
ACTION_DOWN = 0//出现这个是在你一开始得时候出现,也就是你在点击是出现得
ACTION_UP = 1;//第二个是在你关闭时出现
ACTION_MOVE = 2;//这个是在你长按鼠标触发得触摸事件
//这三个得值是可以打印出来得,我们只需要咋触摸事件中加入motionEvent.getAction()我们遍能在控制台看到
四、EditText控件
2.1主要属性
属性 | 备注 |
---|---|
android:hint | 输入提示 |
androlid=textColorHint | 输入提示文字的颜色 |
androld:inputType | 输入类到 |
androld:drawableXoocx | 在输入框的指定方位添加图片 比如说: 左面就在后面加left 右面就在后面加right |
androld:drawablePadding | 设置图片与输入内容的间距 意思是:你在边框或者是旁边放入图片距离与提示字体的距离有关 |
androld:paddingXxxx | 设置内容与边框内容的距离 |
android:background | 背景色 |
2.2获取账号密码
实现用户在点击按钮的时候获取到账户名称和密码
activity.xml文件代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
xmlns:android="http://schemas.android.com/apk/res/android">
<EditText
android:id="@+id/username"
android:hint="请输入用户名"
android:textColorHint="#95a1aa"
android:inputType="phone"
android:layout_width="200dp"
android:layout_height="100dp"/>
<EditText
android:id="@+id/password"
android:hint="请输入密码"
android:textColorHint="#95a1aa"
android:inputType="textPassword"
android:drawableLeft="@drawable/ic_baseline_account_balance_24"
android:drawablePadding="20dp"
android:paddingLeft="20dp"
android:background="@color/white"
android:layout_width="200dp"
android:layout_height="100dp"/>
<Button
android:text="获取用户名"
android:id="@+id/Busername"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
MainActivity.java中的代码
public class MainActivity extends AppCompatActivity {
// 封装username 账户名称
private EditText username;
// 封装password 账户密码
private EditText password;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 调用button的id,使我们用户输入的东西在进行点击事件的时候获取的用户名
Button Busername = findViewById(R.id.Busername);
// 就是调用用户输入框的id,最后打印在控制台中
username = findViewById(R.id.username);
// 调用密码的id,是我们在进行点击事件的时候能够获取到用户密码
password = findViewById(R.id.password);
//点击事件
Busername.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// 用text记录用户输入的名字
String text = username.getText().toString();
// 记录用户输入的密码
String mima = password.getText().toString();
// 在控制台答应用户输入的账号
Log.e("欣知大数据", "用户输入账号: "+text+"\t用户输入密码"+mima);
}
});
}
}