1.知识点解析
1.1 dimen
1.尺寸资源;
2.在工程的res\layout\目录下创建一个test_dimen.xml布局文件。
3.在该布局文件中添加一个TextView和一个Button。
4.TextView的宽和高引用尺寸资源来设置,android:width="@dimen/text_width"
5.dimen定义:
<resources>
<dimen name="drawer_profile_height">180dp</dimen>
<dimen name="avatar_width">80dp</dimen>
<dimen name="avatar_height">80dp</dimen>
</resource>
1.2 ViewPager
参考连接:https://blog.csdn.net/harvic880925/article/details/38453725
1.ViewPager。它是google SDk中自带的一个附加包的一个类,可以用来实现屏幕间的切换。
2.代码:主布局文件中
<android.support.v4.view.ViewPager
android:id="@+id/viewpager"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center" />
3.新建三个layout,用于滑动切换的视图。
4.在java代码中将三个view添加add()到viewPager中。
viewList = new ArrayList<View>();// 将要分页显示的View装入数组中
viewList.add(view1);
viewList.add(view2);
viewList.add(view3);
1.3 butterknife的使用
1.ButterKnife是一个专注于Android系统的View注入框架;
2.以前总是要写很多findViewById来找到View对象,有了ButterKnife可以很轻松的省去这些步骤。
3.使用ButterKnife对性能基本没有损失,因为ButterKnife用到的注解并不是在运行时反射的,而是在编译的时候生成新的class。
4.下载插件:butterknife Zelezny
5.导入依赖:
compile 'com.jakewharton:butterknife:7.0.1'
implementation ...
1.4 Fragment
1.将一个Activity的界面进行碎片化,好让开发者根据不同的屏幕来进行不同的Fragment组合以来达到动态布局的效果。
2.如果采用Activity+Fragment的实现方式,则可大大降低内存的消耗
1.5 RecyclerView、Adapter、ViewHolder
1.RecyclerView:用户滑动屏幕切换视图时,上一个视图会回收利用。主要任务是视图回收再利用,循环往复。
好处:ListView只能在垂直方向上滚动,但是RecyclerView相较于ListView,在滚动上面的功能扩展了许多。它可以支持多种类型列表的展示要求。
LinearLayoutManager,可以支持水平和竖直方向上滚动的列表。
StaggeredGridLayoutManager,可以支持交叉网格风格的列表,类似于瀑布流或者Pinterest。
GridLayoutManager,支持网格展示,可以水平或者竖直滚动,如展示图片的画廊。
4.LayoutManager:RecyclerView不会亲自摆放屏幕上的列表项,摆放列表项的任务被委托给了LayoutManager。主要任务是指定RecyclerView的布局方式
1.Adapter:主要任务是创建ViewHolder和将模型层的数据绑定到ViewHolder上。从模型层获取数据,然后提供给RecyclerView显示。
2. 方法:
/**
* 创建ViewHolder,将模型层的数据绑定到ViewHolder上
*/
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return null;
}
/**
* 从模型层获取数据,然后提供给RecyclerView显示
* @param holder
* @param position
*/
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
}
/**
* 总共有多少个Item
* @return
*/
@Override
public int getItemCount() {
return 1;
}
*******要想使⽤ ListView,就需要编写⼀个 Adapter 将数据适配到 ListView上,⽽为了节省资源提⾼运⾏效率,⼀般⾃定义类ViewHolder 来减少 findViewById() 的使⽤以及避免过多地 inflate view,从⽽实现⽬标。
1.ViewHolder:主要任务是容纳View视图,加载其他view。
2.好处:在滚动期间减少对FindViewById()的调用,提高性能。
3.构造方法:
//构造方法
public BannerViewHolder(Context mContext,View itemView,ResultBeanData resultBeanData) {
super(itemView);
this.mContext = mContext;
this.banner = (Banner) itemView.findViewById(R.id.banner);
}
1.6 inflate
//1.作用:将一个layout.xml布局文件变为一个View对象。尤其在ListView、GridView、RecyclerView的Adapter还有组合自定义控件中,我们都会使用inflate()方法去加载一个布局,作为每个Item的布局。
//2.使用:加载一个View布局
inflater.inflate(R.layout.layout_inflate_test,null);
inflater.inflate(R.layout.layout_inflate_test, root,false);
inflater.inflate(R.layout.layout_inflate_test, root,true);
注意:
不要将R.layout.view写成R.id.view,二者不同!!!
1.7 postDelayed、removeCallbacks
1. 方法postDelayed的作用是延迟多少毫秒后开始运行。
2. 而removeCallbacks方法是删除指定的Runnable对象,使线程对象停止运行.
1.8 OkHttpUtils
1.是什么:OkHttpUtils一个专注于让网络请求更简单的网络请求框架,对于任何形式的网络请求只需要一行代码。
2.使用:一般的
get,post,put,delete,head,options请求
基于Post的大文本数据上传
多文件和多参数统一的表单上传
支持一个key上传一个文件,也可以一个Key上传多个文件
大文件下载和下载进度回调
大文件上传和上传进度回调
支持cookie的内存存储和持久化存储,支持传递自定义cookie
支持304缓存协议,扩展四种本地缓存模式,并且支持缓存时间控制
支持301、302重定向
支持链式调用
支持可信证书和自签名证书的https的访问,支持双向认证
支持根据Tag取消请求
支持自定义泛型Callback,自动根据泛型返回对象
1.9 @lombok注解
1.是啥:在项目中使用Lombok可以减少很多重复代码的书写。比如说getter/setter/toString等方法的编写。
2.使用:
@Getter/@Setter: 作用类上,生成所有成员变量的getter/setter方法。
@ToString : 作用于类,覆盖默认的toString()方法 ,可以通过of属性限定显示某些字段,通过。
exclude属性排除某些字段。
@AllArgsConstructor:生成全参构造器。
@NoArgsConstructor:生成无参构造器。
@Data: 该注解使用在类上,该注解会提供 getter 、 setter 、 equals 、 hashCode 、
toString 方法。
1.10 indicator_height
常用在平行滑动模块时:
改变下划线高度:indicator_height
改变下划线宽度:indicator_width
1.11 LayoutManager
1.LayoutManager是一个抽象类,有3个子类:
LinearLayoutManager: 线性布局管理器
GridLayoutManager: 表格布局管理器
StaggeredGridLayoutManager: 瀑布流布局管理器
2.构造方法:
LinearLayoutManager(Context context)
LinearLayoutManager(Context context,int orientation,boolean reverseLayout)
LinearLayoutManager(Context context, AttributeSet attrs, int defStyleAttr,int defStyleRes)
3.属性:
Context context :上下文,初始化时,构造方法内部加载资源用
int orientation :方向,垂直(RecyclerView.VERTICAL)和水平(RecyclerView.HORIZONTA ),默认为垂直.
boolean reverseLayout:是否倒序,设置为True,从最后一个item开始,倒序加载。此时,RecyclerView第一个item是添加进Adapter中的最后一个,最后一个item是第一个加进Adapter的数据,RecyclerView会自动滑到末尾,另外item整体是依靠下方的。
1.12 gradlew compileDebugJavaWithJavac
打印错误的好命令!!!
2. 遇到的问题
2.1 Could not find method compile()...非换行原因
2.2 Could not find method androidTestCompile()
换成“androidTestImplementation”
2.3 @Inject注解报错
1.@Inject标注作用是依赖注入,它根据作用的对象不同分为setter方法注入、构造方法注入、字段注入,可以根据实际情况来选择。
@Inject标注通过optional参数来定义注入的接口是否需要注入的实现类,默认情况必须显示声明注入接口的实现。
2.在项目build.gradle中导入
implementation "com.google.dagger:dagger-compiler:2.23.2"
2.4 Could not initialize class com.android.repository.api.RepoManager
1. 新的android studio (4.2)已经不支持旧有的了,有些方法和类会找不到。
去build.gradle中把这个classpath换成最新的版本。最好也把gradle和gradle wrapper的版本也弄到最新。
2.代码:
buildscript {
repositories {
jcenter()
google()
}
dependencies {
classpath 'com.android.tools.build:gradle:4.2.1'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
jcenter()
google()
}
}
2.5 android-apt plugin is incompatible with the Android Gradle plugin.
defaultConfig{
....
...
javaCompileOptions {
annotationProcessorOptions {
includeCompileClasspath true
}
}
}
2.6 Could not resolve all files for configuration ':app:debugRuntimeClasspath'.
1. 安卓版本升级之后导致的问题;
2. 在修改Project的build.gradle(注意:不是App的build.gradle),两处加上google()代码中添加google();
buildscript {
repositories {
jcenter()
google()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.0.0'
}
}
allprojects {
repositories {
jcenter()
google()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
2.7 Could not find method minSdk() for arguments [21] on DefaultConfig_
将minSdk: 改为自己的版本,或改为minSdkVersion:
android {
compileSdkVersion 32
defaultConfig {
applicationId "com.cheikh.lazywaimai"
minSdkVersion 21
targetSdkVersion 32
versionCode 1
versionName "1.0"
javaCompileOptions {
annotationProcessorOptions {
includeCompileClasspath true
}
}
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
...
}
2.8 解决AS编译报错:Failed to apply plugin [id com.android.application]
项目路径有中文
2.9 使用ButterKnife之后,代码没有颜色分区
第一步:在Android Studio下载Android ButterKnife Injections (Support Kotlin)这个插件
第二步:更改插件路径
1. 插件下载后的路径是在:C:\Users\Administrator\AppData\Local\google\AndroidStudio2021.1\plugins\Android-ButterKnife-Injections.jar(APPData是隐藏文件夹,需要在“隐藏/查看”中勾选“隐藏的项目”才能够看到)
2. 路径下还有之前下载过的ButterKnife的jar文件,需要删除掉
3.将Android-ButterKnife-Injections.jar这个文件放到Android Studio的安装路径下(我是安装到D盘,所以路径是D:\Android Studio\plugins)
第三步:重启Android Studio(重启之后,之前的颜色分区就回来啦)
无用!!!!
把下载的Butterknife插件卸载,用依赖导入
2.10 无法import android.support.v4.app.Fragment的解决办法
1.原因:项目使用了Androidx,support.v4.app不支持。
2.卸载butterknife插件。
3.as版本升级后,不支持support.v4...,需将依赖升级;
如:implementation 'com.android.support:support-annotations:28.0.0'
因为依赖的module中也使用了继承自FragmentActivity的类,且由于依赖的module年代久远,其中依赖的 supportcompat、support 包版本较旧,怀疑可能是这个主项目与依赖module里面这些依赖包版本不一致引起的。
2.11 org.gradle.api.internal.plugins.PluginApplicationException: Failed to apply plugin [id ‘com.android.application’]
1.原因:项目路径有中文。
2.解决:
在gradle.properties文件中添加android.overridePathCheck=true就可以了。
2.12 Project with path ‘‘ could not be found in project ‘‘.
1.在项目中的settings.gradle中添加include语句,类似于:
include ':***'
2.这里面填的是你找不到的那个包,正常来说这个包都是会在项目中写好的,按照报错语句寻找即可;
如:
include ':app'
include ':okhttputils'
2.13 Android A failure occurred while executing com.android.build.gradle.internal.tasks.Workers$Action...
1、禁用构建缓存
在gradle.properties中添加了android.enableBuildCache=false 即可!
2、修改gradle版本号,我之前是3.6.1,刚开始运行的时候没问题,不知道为啥,改成3.4.0即可!
2.14 Could not find method android() for arguments on root project
1.(方法一)将根项目的build.gradle(app) 注释掉,重新Syn。
android {
// compileOptions {
// sourceCompatibility JavaVersion.VERSION_1_8
// targetCompatibility JavaVersion.VERSION_1_8
// }
// defaultConfig {
// targetSdk 32
// minSdk 21
// }
// compileSdk 32
//}
2.(方法二)是因为app的gradle的顶部缺少这句话。
apply plugin: 'com.android.application'
2.15 找不到android.support.v4.app.FragmentActivity的类文件
1.原因:使用的Glide 3.17.0版本太低,项目又选择了使用Androidx依赖,而此glide版本只能使用support.v4.app。。。不接受Androidx,两者冲突!
2.解决:使用glide 4.11以上版本,在build中添加依赖,
implementation 'com.github.bumptech.glide:glide:4.13.2'
2.16 Android之recyclerview报错-No adapter attached; skipping layout解决方法
没有设置LayoutManager
//设置布局管理就ok了
layoutManager=new StaggeredGridLayoutManager( 2,StaggeredGridLayoutManager.VERTICAL );
rec_xkjd.setLayoutManager( layoutManager );
rec_xkjd.setAdapter( myXKJDadapter );
2.16 找不到符号 符号: 方法 crossFade() 位置: 类 RequestBuilder
1.原因:Glide版本升级后,适应了Androidx,但是有一些方法改变了。
2.错误:
Glide.with(context).load(url).crossFade().into(iv);//crossFade()方法会报错
Glide.with(context).load(url).crossFade().placeholder(defaultImage).into(iv);
3.纠正:
Glide.with(context).load(url).transition(withCrossFade()).into(iv);
Glide.with(context).load(url).transition(withCrossFade()).placeholder(defaultImage).into(iv);
2.17 每次运行META_INF里面老是多出两个错的jar包
在build里面的Android{}里面加:
packagingOptions {
exclude 'META-INF/DEPENDENCIES'
exclude 'META-INF/NOTICE'
exclude 'META-INF/LICENSE'
exclude 'META-INF/LICENSE.txt'
exclude 'META-INF/NOTICE.txt'
}
2.18 安卓 联网失败failed to connect to /192.168.133.1 (port 9090) from /10.30.209.38
该错误的产生原因:
1.服务端程序运行的电脑防火墙未关闭
2.客户端和服务器端程序运行在同一网络环境下
3.模拟器原因
4.客户端IP设置问题 (当时是再局域网下,但是客户端IP地址没有写局域网的IP地址)
解决方法:
1.确保客户端和服务器运行在同一WIFI下
2.查看IP是否填写错误,注意Android端的IP不能填写localhost或127.0.0.1,需要通过命令提示符—命令ipconfig查看主机使用的局域网ip地址!!!!!!
3.确认服务端防火墙处于关闭状态,如果没有可以通过控制面板关闭防火墙
4.更换模拟器,如果你使用的是Android studio的模拟器,那么你可以使用手机运行程序获取新建一个模拟器,我遇到的情况就是模拟器导致的问题。
2.19 You should include an annotationProcessor compile dependency on com.github.bumptech.glide:compiler in your application and a @GlideModule annot....
添加compiler:
2.20 Type androidx.coordinatorlayout.R$attr is defined multiple times
R$attr定义多次
clean一下项目即可
3. 标签使用
3.1 居中
3.1.1 Linearlayout
<LinearLayout
// 下面gravity属性的参数:center为居中,center_horizontal为水平居中,center_vertical为垂直居中 删除其他的就能得到自己想要的
android:gravity="center|center_horizontal|center_vertical" >
3.1.2 ImageView
//前提是要放在Relativelayout或Linearlayout中
android:layout_centerVertical="true"
3.2 layout_al@ignParent...
align:对齐
parent:容器
layout_alignParentBottom="true" //容器中底部
layout_alignParentLeft="true" //容器中居左
layout_alignParentRight="true" //容器中居右
3.3 gradient
实现三色渐变
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<corners android:radius="20dp"/>
<gradient
android:startColor="#FF5C13"
android:endColor="#FC7D0B"
android:angle="90" />
</shape>
4. 经典代码
4.1 欢迎页面延迟2秒进入主页面
//2秒钟进入主页面
new Handler().postDelayed(new Runnable(){
@Override
public void run() {
//在主线程中执行,启动主页面
startActivity(new Intent(Welcome.this,MainActivity.class));
//关闭欢迎页面
finish();
}
},2000);
5. xml布局标签
5.1 include
1.把一个XML布局引入进来当做自己的布局,跟直接把引用的这段代码写在include处的效果是一样的。
2.使用:
<include
android:id="@+id/titlebar"
layout="@layout/titlebar" />
6. AS + SVN
6.1 安卓提交代码
Android Studio是用gradle来构建项目的,有很多环境方面的文件都不需要增加到SVN版本库。
以下为列出不需要增加到版本库的文件:
1. .idea 文件夹,此文件夹是用来保存开发工具的设置信息。
2. .gradle 文件夹,此文件夹是用来保存gradle的依赖信息。
3. 所有的 build 文件夹,build文件夹是用来保存编译后的文件目录。
4. 所有的 .iml 文件,是用来保存开发工具信息。
5. local.properties 文件,是用来保存项目依赖信息。
6.2 局域网内其他主机无法ping通对方主机
1.主机地址错误:查看主机地址是否错误,局域网的就写局域网地址!!!!!
2.防火墙没有打开!!
3.对固定端口没有开放!!:https://blog.csdn.net/t18438605018/article/details/108812631
6.3 局域网内对方无法checkout本地的SVN仓库
查看主机地址是否错误,局域网的就写局域网地址!!!!!不是以太网适配器
7. JAVA异常
7.1 java.lang.IllegalArgumentException: Cannot set 'scaleX' to Float.NaN
不合法的参数异常:
因为传递了一个错误的参数。
7.2 解决java.lang.NullPointerException Attempt to read from field 'int android.view.View.mViewFlags' on a null...
1.异常:异常的解释是"程序 遇上了空指针",简单地说就是调用了未经初始化的对象或者是不存在的对象,这个错误经常出现在创建图片,调用数组这些操作中,比如图片 未经初始化,或者图片创建时的路径错误等等。
2.解决:Debug后发现position多个值时后返回null。
8. 后台管理开发
8.1 遇到的问题
8.1.1 \ManagementForShopping\out\artifacts\shopping not found for the web module.
war包没有正确
8.1.2 Springboot 连接数据库Access denied for user 'root'@'localhost'
输入命令
在application.yml文件中:
spring:
datasource:
url: jdbc:mysql://120.25.153.197:3306/pick
username: root
password: 6669
driver-class-name: com.mysql.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
cd mysql5.5/bin
D:\MySQL Server 5.5\bin>mysqld --skip-grant-tables
D:\MySQL Server 5.5\bin>mysql -u root -p 6669
执行“use mysql;”,使用mysql数据库。
执行“update user set password=PASSWORD("123456") where user='root';”(修改root的密码)
8.1.3 IDEA创建Mapper.xml文件(新建中没有mapper文件选项)
8.1.4 No qualifying bean of type 'com.xiaojian.pick.service.HomeService' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations:
原因:找不到合法的bean,在接口实现类中没有写@Service,在Controller中没有写@Controller,表名写错了。
8.1.5 There is no getter for property named 'type' in 'class java.lang.String'] with root cause
#写成 $
8.2 安卓前端如何与后端联系
8.3 SpringBoot注解
8.4 知识解析
8.5 常用工具
8.5.1 Lombok插件
用途:
使用注解@Data可直接使用实体对象的getter和setter方法等,不需要再实体中定义很多的代码,如下。
@Data
public class Mountain{
private String name;
private double longitude;
private String country;
}
Maven添加依赖:
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.10</version>
</dependency>
</dependencies>
0. 项目解析
0.1 框架
0.1.1 前端(安卓)
主体:FrameLayout帧布局,可以将将fragment添加到这个帧布局。
底部导航栏:RadioGroup,每个按钮对应一个Fragment,将每个fragmnet装入数组中,根据目前pos的值获取到数组中的fragment,然后将其添加到帧布局中。
0.1.2 后台
(1)框架:SpringBoot、Mybatis、Redis
(2)数据库:mysql
(3)图片路径:阿里云Oss
0.2 主页:
0.2.1 布局
两个部分组成:顶部搜索栏、RecycleView、ViewHolder
1.为什么要使用recycleView?
(1)使用recycleView,可以继承适配器,然后适配器中有CreateView()方法,用来创建每一个ViewHolder。
(2)OnBindView方法绑定数据,给每个ViewHolder视图设置数据。
2.为什么要使用ViewHolder?
ViewHolder通常出现在适配器里,为的是listview滚动的时候快速设置值,而不必每次都重新创建很多对象,从而提升性能。
0.2.2 功能
1.搜索
传参数到后台
2.轮播图
(1)使用Banner依赖包;
(2) 图片加载器Glide依赖包;
(3)点击事件,跳转到详情页面;
3.选择按钮
根据pos的值,传到intent,跳转到相应的列表
4.购物车
将详情页面的商品信息先添加到集合datas中,然后将datas添加到本地缓存(SharedPreferences)。
购物车显示:从本地缓存中直接获取,将Json数据转化为对象。
1.在主页Fragment中初始化数据,使用第三方库OkHttpUtils通过自定义HOME_URL获取数据;
2.获取后执行OkHttpUtils的回调函数,再将获取的数据传到adapter;
3.利用adapter创建ViewHolder、将数据绑定到ViewHolder、并显示数据在ViewHolder上;
4.主页是一个RecycleView,其中有很多的ViewHolder,如BannerViewHolder继承RecycleView.ViewHolder
0.3 发现:
0.3.1 布局
Tablayout、ViewPager
0.3.2 功能
0.4 购物车
0.4.1 布局
RecycleView、
0.4.2 功能
0.5 个人中心
0.5.1 布局
0.5.2 功能
Android商城项目链接:
Gitee:https://toscode.gitee.com/whude/shopping
Github:https://github.com/summerCndidnufihd/shoppingForAndroid
欢迎star!!!