黑马程序员的视频: 只要精通一门技能就能防身,切不可范范而学不可只懂皮毛。
Log.v() 最低级,打印意义最小的日志信息
Log.d() 打印出调试信息,调试信息和分析问题
Log.i() 打印出重要的数据,用户的行为
Log.w() 打印出一些警告
Log.e() 打印出错误信息,如果程序进入catch语句,有重大错误必须尽快修复
DE729F04BB819
adb not responding 进入cmd 输入netstat -aon |findstr "5037"
杀死127.0.0.0的进程 一般是360等助手
alt+enter快速导入包
D:ANDSDK/tools/draw9patch
绘画9图
导入其他人包时
修改 build.gradle中的 BuildToolsVersion:"23.0.1"
hardwear.camera2
优化布局层次:
include merge ViewStub
光标变粗 fn+delete
Fragment: 好处在于 内部的控件和事件由自己管理
10.ViewPager: 写在mainactivity中
如果有listview 在tab01上 还是写在mainactivity中
LocationClient
BDLocationListener 耗时的操作
如果runapp出现
Error type 3
Error: Activity class {com.example.lw.nine_patch/com.example.lw.nine_patch.MainActivity} does not exist.
拔掉数据线 重新连接在重新启动
多用stackoverflow 提高自己英语水平
Layout-sw600dp文件夹和layout文件夹进是一个级别
隐藏消息框时 提示必须放在content之前
应该把extends appCompatactivity 改成 activity
或者直接 在activity manifest中声明 theme noactionbar
Android依赖外部文件库
1.file->new->import moudle->lib zxing
2.procject stucture->moudle->+ 选择libzxing
SharedPreference 两个参数
第一个参数指 SharePreferenced文件名称 第二个设定模式
getString(key,value)
新建class 里面有enum和interface
所以万事不要放弃,请坚持,请美丽的活着
19.Fiddler使用
Fiddler是最好的WEB调试工具之一,是一款非常流行并且实用的http抓包工具,它的原理是在本机开启了一个http的代理服务器,然后它会转发所有的http请求和响应,它记录所有的客户端和服务器的http、https请求。
允许监视、设置断点、修改输入输出数据,Fiddler对开发和测试来说都有很多帮助。
1.启动Fiddler,打开菜单栏中的 Tools > Fiddler Options,打开“Fiddler Options”对话框。
2.在Fiddler Options”对话框切换到“Connections”选项卡,然后勾选“Allow romote computers to connect”后面的复选框,然后点击“OK”按钮。
3.在本机命令行输入:ipconfig,找到本机的ip地址
4.打开android设备的“设置”->“WLAN”,找到你要连接的网络,在上面长按,然后选择“修改网络”,弹出网络设置对话框,然后勾选“显示高级选项”。
5.在“代理”后面的输入框选择“手动”,在“代理服务器主机名”后面的输入框输入电脑的ip地址,在“代理服务器端口”后面的输入框输入8888,然后点击“保存”按钮。
6.然后启动android设备中的浏览器,访问百度的首页,在fiddler中可以看到完成的请求和响应数据。
Chrome插件:
1.JSONView 对接api接口时,一般都是默认返回json格式,自动排列Json数据
下载东西不要死板 把地址放到迅雷里面下载(电脑分屏的原理)
1、Studio中有Project和Module的概念,前面说到Studio中一个窗口只能有一个项目,
即Project,代表一个workspace,但是一个Project可以包含多个Module,比如你项目引用的Android Library, Java Library等,这些都可以看做是一个Module;
2、上述目录中将java代码和资源文件(图片、布局文件等)全部归结为src,
在src目录下有一个main的分组,同时划分出java和res两个文件夹,java文件夹则相当于Eclipse下的src文件夹,res目录结构则一样.
23.++i和i++的区别
如果有表达式 a = i++ 它等价于 a = i ; i = i + 1;
如果有表达式 a = ++i 它等价于 i = i + 1; a = i;
int i=0;
while( i++ < 5 ) //先用i的原值与5比较,比较完成后,无论结果是真还是假,都要再进行i=i+1运算
{
System.out.print( i+ " ");
}
这个循环运行5次,输出 1 2 3 4 5,最后的i值是6
int i=0;
while( ++i < 5 ) //先进行i=i+1运算,然后用i的新值与5比较,判断结果是真还是假
{
System.out.print( i+ " ");
}
遇到重复定义 多使用数组
private int index;
private int images[]={R.drawable.image1,R.drawable.image2,R.darwable.image3}
public void run(){
index++;
index=index%3;//取余数
imageView.setImageResource(images[index]);
}
25.gravity和layout_gravity
android:gravity:是对view控件本身来说的,是用来设置view本身的内容应该显示在view的什么位置,默认值是左侧。
android:layout_gravity:是相对于包含改元素的父元素来说的,设置该元素在父元素的什么位置
http://ww1.sinaimg.cn/mw690/85d82f62jw1f3ibad8of3j20qo0qoju6.jpg
JsonObjectRequest jsonObjectRequest=new JsonObjectRequest(Request.Method.GET, JSONDateUrl, null,
new Response.Listener
@Override
public void onResponse(JSONObject response) {
Log.d("error","对不起,有问题");
}
} ,new Response.ErrorListener(){
@Override
public void onErrorResponse(VolleyError volleyError) {
Log.d("error","对不起,有问题");
}
});
右下角没有声音小图标 任务管理器 结束explorer.exe 然后文件新建 在输入explorer
28.Fragment和Actity通信
Fragment 与 Activity 可能还需要相互传递数据的方式:
- Activity 向 Fragment 传递数据 : 在 Activity 中创建 Bundle 数据包 , 并调用 Fragment 的 setArguments(Bundle bundle) 方法即可将 Bundle 数据包传给 Fragment 。
- Fragment 向 Activity 传递数据或 Activity 需要在 Fragment 运行中进行实时通信: 在 Fragment 中定义一个 内部回调接口 ,再让包含该 Fragment 的 Activity 实现该回调接口,这样 Fragment 即可调用该回调方法将数据传给 Activity 。
获取传来的值:
String str = (String)getArguments().get(“str”);
29.View
View 是最基本的UI组件,绘制矩形区域
View view=inflater.inflate(R.layout.fragment_list_refresh,container,false);
Android2.2中match_parent和fill_parent是一个意思 .两个参数意思一样,match_parent更贴切,于是从2.2开始两个词都可以用。那么如果考虑低版本的使用情况你就需要用fill_parent了
30.Listview adapter三个参数
lv=(ListView)view.findViewById(R.id.listview);
//通过泛型来指定需要适配的数据类型,再通过构造函数将适配的数据传入
//adapter三个参数 当前上下文getActivity() listview子项布局Id(这是系统自带简单text),需要适配的数据
lv.setAdapter(new ArrayAdapter
return view;
31.LayoutInflater对象 调用inflater.inflate() 动态加载布局
两个参数或者三个参数
inflate(resource,null)=inflate(reource,root,false)
inflate(resource,root)=inflate(reource,root,true)
参数1 布局Id 参数二root作用 false使得layout_height和layout_width生效 ture加载父布局
1.在类似 adapter 的 getView 和 fragment 的 onCreateView 等方法中,应该使用 inflate(resource, root, false) 而不是 inflate(resource, null)。后者会使得布局最外层的 layout_width, layout_height 等属性失效。
2.自定义 view 的构造方法中(特指参考文中的组合控件),我们应该使用 inflate(resource, root) 或 infalte(resource, root, true
新版v4有这个类 ActivityOptionsCompat 我们通过这个类添加动画和启动Activity
关注Material Design设计
R文件找不到
Android Studio 提示Cannot resolve symbol 'R'
1.Just clean your project and Sync Project with Gradle File.
2.检查xml文件 clean工程
在github上找demo 看源码
Android widget指应用程序嵌入在主屏幕的小部件 小插件
37.item selector
Android Selector主要是用来改变listview和button控件的默认背景
1)drawable目录下放置ic_clear.xml 添加selector
2)
android:drawable="@drawable/no_image"/>
< !--选中时的图片背景-->
3)引用:
listView中:(1)android:listselector="@drawable/ic_clear"
(2)android:background="@drawable/ic_clear"
(3)Drawable drawable=getResource.getDrawable(R.drawable.ic_clear)
listview.setSelector(drawable)
38.menu使用
android:showAsAction="never" 表示隐藏 在点击.扩展时会显示
android:showAsAction="always" 一直在标题栏显示
android:orderInCategory="3" 重要性 显示在第几个
item表示子项
group表示具有相同属性的一系列item组成
group属性:显示示或隐藏所有的菜单项 ,使用方法 setGroupVisible()
Enable 或 disable 所有的菜单项,使用方法 setGroupEnabled()
指定所有的菜单项是否是 checkable ,使用方法 setGroupCheckable()
android:checkableBehavior:single(只有一个菜单项能被选中) all none
在mainActivity中调用
public boolean onCreateOptionsMenu(){
getMenuInflater().inflate(R.menu.menu1, menu);
return true;
}
public boolean onOptionsItemSelected(menuItem item){
switch(itme.getId()){
case:
break;
case:
break;
}
return super.onOptionsItemSelected(item);
}
39.ToolBar menu和ActionBar的区别
ActionBar代替了顶部的标题栏,可以显示导航栏和标题功能,可以显示关键的Action,
Action在程序运行过程中始终保持可见状态 sdk21被弃用 推荐ToolBar
menu menu也可以执行程序的各种功能,但需要点击menu键才会显示,而且很多anroid设备不再有
menu键 menu也被抛弃
ToolBar 不是Android Design Support Library的一部分而是在这个库中需要与其他组件一起使用,隐藏 Action Bar 并且切换到 Toolbar,因为这些有奇妙功能的新库,包括 Design Support Library 的组件中,都被设计为和 Toolbar 协同工作
1.
2.放在 CoordinatorLayout 的东西必须被设计和实现成与它一起合作的,否则将不与任何其他兄弟 views(sibling views) 协作,提供一个组件让CoordinatorLayout与toolbar一起工作
只是简单的用AppBarLayout包裹 Toolbar
40.DrawerLayout侧滑学习 NavigationView
41.JAVA8的新特性
Android开发中,强烈推荐使用retrolambda这个gradle插件,这样你就可以在你的代码中使用lambda了。
42.Style定义和使用(zhihu那个demo布局)
在style.xml中定义style,可以减少重复布局
1)使用Android本身属性,例如
2)自定义style item 需要在style中使用命名控件的地方换成自定义控件的包名即可(注意:是包名,不带自定义控件的名字)
43.Material Design 中ToolBar
app:popupTheme,这个属性就是用来自定义我们弹出的菜单的样式,
app:popupTheme="ThemeOverlay.AppCompat.Light",那么这个Overflow弹出的是白底黑字
app:popupTheme="@style/AppTheme.PopupOverlay" 黑底白字
app:layout_scrollFlags=”scroll|enterAlways” 一旦向上滚动toolbar就可见
Scroll 表示向下滚动时,这个View会被滚出屏幕范围直到隐藏.
,enterAlwaysCollapsed 再定义android:minHeight="100dp" 最小高度何时进入
exitUntilCollapsed 再定义android:minHeight="100dp" 最小高度titleview何时进入
实现视差效果,在用户滚动的时候title的高度也会随着改变。
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
app:contentScrim="?attr/colorPrimary"
app:expandedTitleMarginEnd="64dp"
app:expandedTitleMarginStart="48dp"
app:layout_scrollFlags="scroll|exitUntilCollapsed">
在可以滚动的View上设置属性 app:layout_behavior.
44.tools属性
Layout tools:生成只在Android Studio IDE才能预览的效果
例如tools:text="test title"
tools:ignore="ContentDescription, RtlHardcoded" 将XML Editor 小黄点取消
45.ReclyclerView
Android:drawSelectorOnTop="true" 点击某一条记录,颜色会显示在最上面,记录上的文字被遮住,所以点击文字不放,文字就看不到
46.为什么使用Content Provider
Content Provider用于在不同应用程序之间共享数据
与SharedPreferences不同(全局可读写操作模式 不管是private multiprocess),
content provider可以选择对那一部分数据共享 可以保证隐私数据
两种用法 使用现有的内容提供器访问和操作数据 自己创建内容提供器并未数据提供外部访问接口
例如电话簿 短信 媒体库都提供了数据的外部访问接口
1.getContentResolver (ContentResolver类提供了真删改查的功能)
2.getContentResolver.query(Uri参数)
内容URI 权限+路径(包名+文件名)
content://com.example.app.provider/table1
内容URI装换成Uri对象
Uri uri=Uri.parse("content://com.example.app.provider/table1")
Cursor cursor=getContentResolver().query(uri,projection,selection,selectionArgs,sortOrder);
1.某个应用程序下的表2.查询的列名3.where约束条件4.为where占位符提供具体的值5.查询结果的排序方式
查询返回的cursor对象
if(cursor!=null){
while(cursor.moveToNext()){
String cloumn=cursor.getString(cursor.getColumnIndex("column1"));
Int column2=cursor.getInt(cursor.getCollumnIndex("column2"));
}
cursor.close();
}
插入更新(数据放到contentValues中)
ContentValues values=new ContentValues();
values.put("name","walsky");
values.put("pages",55);
getContentResolver().insert(uri,values);
values.put("name","wal");
values.put("pages",46);
getContentResolver().update(uri,values,"name = ? and pages = ?",new String[] {"text","1"})
删除
getContentResolver().delete(uri,"colum2=?",new String[] {"1"});
自己的内容提供器(extends ContentProvider,再重写6个方法)
onCreate() query() insert() delete() update() getType() (根据Uri返回MIME类型)
自己创建的privider 要注册
authority
exported="true" 表明是否能被访问
tools可以覆盖android的所有标准属性,将android:换成tools:即可。同时在运行的时候就连tools:本身都是被忽略的,不会被带进apk中。
AS alter+enter是查看错误的内容
48.Android
项目地址:https://android.googlesource.com/或https://github.com/android
以上两个项目,不解释
49.SQLite数据库
public class CoolweatherOpenHelper extends SQLiteOpenHelper{
public static final String Crete_Provice="Create table Province ("+
"id integer pirmary key autoincrement"
+"province_name text "+"province_code text )"
public static final String Create_City="Create table Ctiy ("+
"id integer primary key autoincrement "
+"city_name text "+"city_code text"
+"province_id integer )"
public static final String Create_Country="Create table country ("
+"id integer primary key autoincrement"+
" counter_name text"+"counter_code"+
"city_id integer ) "
public CoolweatherOpenHelper(Context context,String name,CursorFactory factory,int version){
super(context,name,factory,version);
}
public void OnCreate(SQLiteDataBase db)
db.execSQL(Crete_Provice);
db.execSQL(Create_City);
db.execSQL(Create_Country);
}
public void onUpdate(SQLiteDataBase db,int oldVersion,int newVersion){
db.execSQL("drop table if exits Book");
db.execSQL("drop table if exits Category");
onCreate(db);
}}myDbHelper=new CoolweatherOpenHelper(this,"BookStore.db",null,2);
50.天气API
http://www.weather.com.cn/data/cityinfo/101010900.html 返回JSON数据的天气
http://www.weather.com.cn/data/sk/101010900.html json数据
com.android.support:support-annotations:23.3.0
注释支持库
Retrofit retrofit = new Retrofit.Builder() //01:获取Retrofit对象
.baseUrl("https://api.github.com/") //02采用链式结构绑定Base url
.build();//03执行操作
GitHubService service = retrofit.create(GitHubService.class);
//04获取API接口的实现类的实例对象
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://api.example.com")
.addConverterFactory(GsonConverterFactory.create())
.build();
,
这个框架的请求方式是采用的注解方式指明请求的相对路径框架,然后参数指明具体内容
retrofit是使用注解来体现HTPP请求的:
接口方法上的注解和它的参数指示了一个请求是如何处理的。
每个方法必须有一个提供请求方法和相关URL的HTTP注解
/@GET("group/{id}/users"}
Call> groupList(@Path("id) int groupId);
/
请求URL可以在方法上使用替代区块和参数实现动态更新。替代区块是由{}和包围的字符串。对应的@Path注解参数必须使用相同的字符串。
- 界面实现一般分三个部分 Activity,Fragment,Adapter
ACivity:容器
Fragment:发起请求,展示数据,用户交互
Adapter:数据的绑定/交互
54.Appliacation类的使用
Application类是Android启动时为每个应用程序创建的唯一的Application类对象,用于系统信息的存储
自己定义的Application要在manifiest中注册 name
在Android中,可以通过继承Application类来实现应用程序级的全局变量,这种全局变量方法相对静态类更有保障,直到应用的所有Activity全部被destory掉之后才会被释放掉。
继承Application类,主要重写里面的onCreate()方法(android.app.Application包的onCreate()才是真正的Android程序的入口点),就是创建的时候,初始化变量的值。然后在整个应用中的各个文件中就可以对该变量进行操作了。
Volley一定要根据字符串解析
OKhttp是一个快速高效的HTTP Client,帮助实现连接池、
缓存等技术,OKhttp扮演者传输层的角色
OKhttp使用okio简化了数据的访问和存储,okio是java.io和java.nio的增强
Volley是一个简化网络任务的库,它负责处理请求、
加载、缓存、线程、同步问题,适合频繁交互的少量数据,可以处理
JSON、图片、缓存,支持一定程度的自定义
Volley可以轻松设置Okhhtp作为他的传输层