android学习笔记记录
-
黑马程序员的视频: 只要精通一门技能就能防身,切不可范范而学不可只懂皮毛。
-
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<JSONObject>() {
@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<String>(getActivity(),android.R.layout.simple_list_item_1,getData()));
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)
<item android:drawable="@drawable/pic1" />
<item
android:state_focused="false"
android:drawable="@drawable/no_image"/>
<item android:state_focused="true"
android:drawable="@drawable/textfield_search_selected"/>
< !--选中时的图片背景-->
<item android:state_selected="true" android:drawable="@drawable/pic4" />
<item android:state_focused="true" android:drawable="@drawable/pic5" />
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.<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
</style>
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本身属性,例如
<style name="cardQusetionTextStyle" parent="BaseCardTextStyle">
<item name="android:textsize">17sp</item>
<item name="android:textStyle">bold</item>
</style>
<style name="cardOverflowIconStyle">
<item name="android:contentDescription">@string/share_this_news</item>
<item name="android:layout_width">24dp</item>
<item name="android:layout_height">24dp</item>
<item name="android:src">@drawable/ic_card_overflow</item>
<item name="android:layout_alignParentRight">true</item>
</style>
2)自定义style item 需要在style中使用命名控件的地方换成自定义控件的包名即可(注意:是包名,不带自定义控件的名字)
<resources xmlns:android="http://schemas.android.com/apk/res/android" >
<style name="test" >
<item name="com.zhufuing:name_text">hello,world!</item>
</style>
</resources> com.zhufuing是需要使用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.support.design.widget.CollapsingToolbarLayout
android:id="@+id/collapsing_toolbar"
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">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
app:layout_scrollFlags="scroll|enterAlways"></android.support.v7.widget.Toolbar>
<ImageView
android:src="@drawable/cheese_1"
app:layout_scrollFlags="scroll|enterAlways|enterAlwaysCollapsed"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:scaleType="centerCrop"
app:layout_collapseMode="parallax" 我们添加一个定义了app:layout_collapseMode="parallax" 属性的ImageView。
android:minHeight="100dp"/>
</android.support.design.widget.CollapsingToolbarLayout>
在可以滚动的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 要注册
<provider
name
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<List<User>> 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作为他的传输层