ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Android开发

2022-08-22 17:03:32  阅读:503  来源: 互联网

标签:ViewHolder layout gradle 开发 Android com android


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的实现方式,则可大大降低内存的消耗

img

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 postDelayedremoveCallbacks

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()...非换行原因

image-20220613162945870

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插件卸载,用依赖导入

image-20220616163917035

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的类文件

image-20220620165212753

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:

image-20220621112025490

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

image-20220618170005110

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。

image-20220621115932683

8. 后台管理开发

8.1 遇到的问题

8.1.1 \ManagementForShopping\out\artifacts\shopping not found for the web module.

war包没有正确

image-20220624211240568image-20220624211253353

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文件选项)

image-20220625160732120

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

#写成 $

image-20220627110207589

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!!!

标签:ViewHolder,layout,gradle,开发,Android,com,android
来源: https://www.cnblogs.com/lxpblogs/p/16613397.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有