Lyaout·
Match_parent表示让当前空间的大小和父布局的大小一样,也就是由父布局来决定当前空间的大小。
Wrap_content表示让当前控件的大小能够刚好包含住里面的内容,也就是由控件内容决定当前控件的大小
Gravity设置linearlayout绝对布局中控件的设置位置
Textsize设置文字的大小
TextColor设置文字的颜色
取消系统对BUTTON英文字母自动字母大小
在写一个登陆界面的时候出现的问题
1.布局问题,我现在还不能熟练使用约束布局,导致出现的效果是堆在一起的乱码
2.图形问题,我现在对界面的设计还处于一个初步的阶段,我还不能设计出一个用户能够接受的界面
3.目前所学的东西只能做出一个窗口显示传值,但是登录系统的用户信息应该都存在数据库当更新后数据库进行更新,当需要提取出数据的时候就从数据库中提取 这样就不会因为再次打开活动 所有信息丢失
4.之前一直出现的活动炸掉的情况现在我也可以避免了,
Java中集合类的概括
http://developer.51cto.com/art/201309/410205_all.htm
http://www.cnblogs.com/leeplogs/p/5891861.html
List的用法
http://blog.csdn.net/vaniice/article/details/6102015
Android 中Context的概括
http://www.jianshu.com/p/94e0f9ab3f1d
迭代器(Iterator):
关于layoutinflater的一些用法
http://blog.csdn.net/guolin_blog/article/details/12921889
主要用于动态的添加布局
在用WebView中遇到的一些问题
1.没有修改网络权限,导致网页显示失败
<uses-permissionandroid:name="android.permission.INTERNET"/>
ListView组件的用法
一:
1.首先在layout.xml布局文件中注册ListViiew组件
2.修改Activity java文件中的内容,先定义一个容器,可以就使用String数组,装入你要显示的内容
3.写一个ArrayAdapter<string>对象,通过构造函数,①传入活动②传入子项布局组件,可以传一个内置的,simple_list_item_1这个布局里面只有一个TextView
4.最后通过setAdapter把上文的对象传入,也就是把适配器对象传递进去,这样ListView和数据之间的关联就建立完成了。
二:
(如果要想显示出文字和图片)
1.先写一个文字和图片的集合类,把String内容 和ImageID图片 写入两个数据成员
2.在自定义一个子项布局,添加TextView和ImageView两个组件
3.再自定义一个适配器,写一个类继承ArrayAdapter类,并泛型指向所写的集合类。
4.首先需要重写父类的构造方法,传入了三个参数,第一个参数是活动上下文Context,第二个参数是子项布局,第三个参数就是集合类
5.再重写父类的一个方法getView(),这个方法会在每个子项在屏幕中显示的时候调用,getView,形参分别为1.position(我叫这个为引线)2.View,3.ViewGroup
6. 首先获得一个当前集合类的实例---getItem(position)
7.然后通过LayoutInflater来为这个子项加载布局,这一步很关键
8.接下来调用View的findViewById()方法分别获取到ImageView和TextView的实例,分别调用它们的setImageResource()和setText()方法来设置显示的图片和文字,最后将布局返回。
9.再来修改Activity class中的内容,先用list<集合类>定义一个要显示内容和图片的集合,这里用list泛型指向集合类,再在这个类中写一个初始化集合类的方法
10.接下里实例化一个写好的自定义适配器类的对象,分别传入三个参数,第一个参数就是这个活动本身,第二个参数是写好的子项布局文件,第三个参数就是写好的list集合类集合
11.同样再把这个适配器和listView进行匹配
其他点:
1.提升ListView的运行效率
之前没有说过的getView方法中第二个参数View这个参数对象可以进行之前加载好的布局进行缓存
只有当converView这个对象为空的时候才再进行构建,否则就之前传出这个view
但是优化进行到这里,还是可以继续优化,虽然现在已经不会再重复去加载布局,但每次在getView()方法中还是会调用view的findViewById()方法来获取一次控件的实例。
1.新增了一个内部类ViewHolder用于对控件的实例进行缓存,当converView为null的时候,创建一个ViewHolder对象,并将控件的实例都存放哎ViewHolder里,然后调用View的setTag()方法将ViewHolder对象存储在View中,当converView不为null的时候则调用View的getTag()方法将ViewHolder重新取出。这样所有控件的实例都缓存在了ViewHolder里,就没有必要每次都通过findViewById()方法来获取控件实例了。
2.为ListView添加点击事件
RecyclerView的用法:
这个滚动组件弥补了listView的不足,首先要使用它必须先添加依赖库,
在dependencies中添加compile‘com.android.support:recyclerview-v7:25.0.1’
这个可以依据自己所用的版本号进行小的修改
同样的,在创建自定义适配器的时候要先建立一个内容类,这个类中将显示你要求显示的数据,比如文字,图片之类。
1.新建一个适配器类,然后继承于RecyclerView.Adapter并且泛型指向FruitAdapter.ViewHolder。ViewHolder是FruitAdapter自定义适配器类中的内部类
2.定义这个适配器类的内部类ViewHolder让它继承于RecyclerView.ViewHolder定义要显示的数据对象,重写构造方法,super(view)并且添加要显示的组件
3.接下来构造器的构造函数实现了把写好的集合传入进来,赋值给了一个全局变量
4.因为这个适配器是继承自RecyclerView.Adapter这个父类适配器,所以必须要重写它的三个方法,OnCreaterViewHolder() OnBindViewHolder() getItemCount()
OnCreaterViewHolder()这个方法是用于创建ViewHolder实例,在这个方法中将fruit_item布局加载进来,然后创建一个ViewHolder实例,并且加载出来的布局传入到构造函数当中,View就是加载创建的布局
OnBindViewHolder()这个方法是用于对RecyclerView子项数据进行赋值,会在每个子项被滚动到屏幕内时候执行,我们通过position参数得到当前项的内容类的实例,然后再将数据设置到ViewHolder的ImageView和TextView当中。
5.再在活动中添加,先初始化要显示的内容类集合->实例化RecyclerView对象->创建一个LinearLayouyManager对象用于手动更改活动窗口的对齐方式->再创建一个适配器,把RecyclerView中加入适配器
学习疑问,现在还是对适配器里面的view参数viewgroup参数有疑问,为什么重写getView方法就可以,view的实质是什么。
数据存储学习
Android中主要有三种存储数据的方式。
之前写登录界面的时候为了存储数据,我使用了集合类中的map,使用键值对的方式存储用户的数据,但是这种存储都是在内存中,易丢失数据。
一.文件存储
Context类中提供了一个openFileOutput()方法,可以将数据存储到指定的文件中
两个参数,1.文件名(这个文件名不包含所属路径android中的文件都存储在一个地方)
2.文件的操作模式,(默认)MODE_PRIVATE文件名相同时覆盖原有文件
MODE_APPEND文件名相同时 合并
首先已知Context类就是活动类本身
1.首先通过openFileOutput()方法得到一个fileOutputstream对象
2.在通过上诉得到的对象构建一个OutputStreamWriter对象
3.再通过上诉得到的对象构建一个BufferedWriter对象
4.通过BufferedWriter对象对文件进行操作
关于如何在电脑位置中找到所写文件:借助Android Device Monitor tool
二.文件读取
Context类中提供了openFileInput()方法,只有一个参数----文件名
1.老套路先通过间接创建对象最终创建一个BufferedReader对象
2.把文本内容全部读取出来,并存放在一个StringBuilder中
3.将文件中的数据一行一行的读取
三.SharedPreferences存储
这种存储方式是使用的键值对的方式,这和我之前使用Map集合大同小异,不过这种存储方式可以做到持续化存储
要进行这种方式的存储,当然首先就要获得这种方式的对象
Android中提供了三种方式获得SharedPrerences
① Context类中提供了getSharedPreference()方法 两个参数:1.第一个参数文件名
2.指定操作模式
② Activity 类中的getPreferences()方法 一个参数 指定操作模式,默认为活动名文文件名
③ PreferenceManager 类的getDefaultSharedPreferences()方法
这是一个静态方法,传入一个Context参数,默认的将当前应用程序的包名作为文件名
存储数据三大步骤:
1.调用SharedPreferences对象的edit()方法来获取一个SharedPreferences.Editor对象
2.向SharedPreferences.Editor对象中添加数据
3.调用apply()方法将添加的数据提交
四.SharedPreferences读取
1.先用Activity类中的getSharePrefernces()方法获得一个对象
2.用这个对象的get....()方法通过键值对的匹配获得数据,第一个参数是键,第二个参数是如果读取失败即将要返回给用户的值
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button saveData = (Button) findViewById(R.id.save_data);
saveData.setOnClickListener(newView.OnClickListener() {
@Override
public void onClick(View view) {
SharedPreferences.Editor editor = getSharedPreferences("data",MODE_PRIVATE).edit();
editor.putString("name","Tom");
editor.putInt("age",28);
editor.putBoolean("married",false);
editor.apply();
}
});
Button restoreData = (Button) findViewById(R.id.restore_data);
restoreData.setOnClickListener(newView.OnClickListener() {
@Override
public void onClick(View view) {
SharedPreferences pre = getSharedPreferences("data",MODE_PRIVATE);
String name = pre.getString("name","");
intage = pre.getInt("age",0);
}
});
使用网络技术
一.webView的用法
1.在布局文件中添加WebView组件
2.在活动中获取WebView实例
3.调用WebView的getsetting()方法设置一些浏览器的属性
如,可以用setJavaScriptEnabled()方法来让WebView支持javaScript
4.调用setWebViewClient(new WebViewClient()方法,并传入一个WebViewClient()实
例,作用是当一个网页跳转到另一个网页时,我们希望目标网页仍然在当前
WebView中显示,而不是在系统浏览器。
5.最后调用loadUrl()方法把网址传入
另外,网络申请是需要权限的,在注册表XML文件中添加
<uses-permissionandroid:name="android.permission.INTERNET"/>
二.使用HttpURLConnection存储
1.先new一个URL对象
2.获取HttpURLConnection的实例,对URL对象使用openConnection()方法
3.设置HTTP请求所使用的方法使用,setRequestMethod(“GET”)
GET表示希望从服务那里获得数据,POST表示希望提交数据给服务器
4.使用getInputStream()方法获取从服务器返回的输入流
5.使用disconnect()关闭HTTP连接
三.发送请求到服务器
1.先将请求方式改为POST setRequestMethod(“POST”)
2.再通过实例化一个DataOutPutStram对象 构造方法实参为HttpURLConnection对象调用的getOutputStream()
3.再对上实例化的方法使用writeBytes方法,实参使用键值对的方式,数据之间用&隔开
四.使用OkHttp
1.先在项目中添加OkHttp库
dependencies {
compile fileTree(dir:'libs',include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
excludegroup:'com.android.support',module:'support-annotations'
})
compile'com.android.support:appcompat-v7:25.0.1'
compile'com.android.support.constraint:constraint-layout:1.0.2'
compile'com.squareup.okhttp3:okhttp:3.4.1'
testCompile'junit:junit:4.12'
}
2.创建一个OkHttpClient的实例
3.发起一条Http的请求 需要创建一个Request对象
OkHttpClient client = newOkHttpClient();
Request request =newRequest.Builder().build();
4.可以在Builder()和build()中插入url对象,
5.再调用OkHttpClient对象中的newCall()方法来创建一个Call对象,再调用execute()方法发送请求并且获取服务器返回的数据
OkHttpClient client =newOkHttpClient();
Request request = newRequest.Builder().url("http://www.baidu.com").build();
try{
Response response = client.newCall(request).execute();
}catch(IOException e) {
e.printStackTrace();
}
使用Jsoup解析Html
Jsoup文档
https://jsoup.org/cookbook/introduction/parsing-a-document
http://www.open-open.com/jsoup/
学习网站
http://www.jianshu.com/p/a620a2664f58
如何从一个网站上提取图片
先通过jsoup从网站上获取元素,然后获得Element对象 这个对象就是img元素
再通过absUrl获得绝对地址
关于HTTP中的POST和GET的区别
Http定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE。URL全称是资源描述符,我们可以这样认为:一个URL地址,它用于描述一个网络上的资源,而HTTP中的GET,POST,PUT,DELETE就对应着对这个资源的查,改,增,删4个操作。到这里,大家应该有个大概的了解了,GET一般用于获取/查询资源信息,而POST一般用于更新资源信息。
初探服务
服务是android中实现程序后台运行的解决方案,非常适合去执行那些不需要和用户交互而且要求长期运行的任务。服务的运行不依赖于任何用户界面,即使程序被切换到后台
一,线程的基本用法
三个方法1.继承Thread类2.实现Runnable接口3.直接构造匿名内部类 第一种方式的耦合性高
二.
关于线程的问题
http://blog.sina.com.cn/s/blog_67b74aea0101e9x8.html