True100 column Http://prog3.com/sbdm/blog Http://prog3.com/sbdm/static.blog/images/logo.gif Android development on the road, and we hope to progress together! Http://prog3.com/sbdm/blog/true100 Zh-cn Http://prog3.com/sbdm/blog Five 12:13:34 2016/1/31 <![CDATA[[原]Android学习笔记之:实现树形层级ListView]]> Http://prog3.com/sbdm/blog/true100/article/details/50608654 Http://prog3.com/sbdm/blog/true100/article/details/50608654 True100 17:48:08 2016/1/29 We do open the time, one hundred percent will be used to display the list control ListView, but sometimes we show the data is divided into multiple levels,

For example, our provinces and counties such as the list, this data is a kind of affiliation, if you want to show in a page,
What should we do? Before I first think of the idea is to use Expandablelistview, but only to achieve the two show,
All of a sudden see light suddenly, the original can be done. Thanks to the teacher's selfless dedication, the study of knowledge to make a note, the future will certainly be used to!
Directly attached to the code, the code has a corresponding note:
The main interface Activity, the layout is only a ListView:

Public Class MainActivity Extends Activity{
PrivateMListView ListView;
PrivateMAdapter TreeListViewAdapter<TestBean>;
PrivateMDatas List<TestBean> =NewArrayList<TestBean> ();

@Override
Protected Void OnCreate(savedInstanceState Bundle) {
Auto-generated method stub / / TODO
Super.onCreate (savedInstanceState);
SetContentView (R.layout.activity_main);
This.mListView = (ListView) findViewById (R.id.listview);
InitTestDatas ();
Try{
MAdapter =NewTreeListViewAdapter<TestBean> (mListView,This, mDatas,Zero);
}
Catch(E Exception) {
E.printStackTrace ();
}
This.mListView.setAdapter (mAdapter);
MAdapter.setmTreeListener (NewTreeViewOnItemClick () {


@Override
Public Void OnTreeItemClick(IntPosition, Node, node) {
Toast.makeText (MainActivity.This,"You click on the:"+ node.getName (), Toast.LENGTH_SHORT).Show ();
}
});
This.mListView.setOnItemLongClickListener (NewOnItemLongClickListener () {


@Override
Public Boolean OnItemLongClick(AdapterView<? > arg0, arg1 View,Final IntArg2,LongARG3) {
FinalEDT EditText =NewEditText (MainActivity.This);
NewAlertDialog.Builder (MainActivity.This.setTitle () () ()"Insert"(.SetView (EDT).SetPositiveButton () ()"Submit",NewOnClickListener () {

@Override
Public Void OnClick(dialog DialogInterface,IntWhich) {
If(TextUtils.isEmpty (edt.getText ().ToString () ()) {
Toast.makeText (MainActivity.This,"Please fill in the content"(Toast.LENGTH_SHORT).Show () ();
}
Else{
MAdapter.insertNodeData (arg2, edt.getText ().ToString ());
}
}
} (.SetNegativeButton) ()"Cancel",Null().Create ().Show ();
Return True;
}
});
}


Private Void InitTestDatas(1)
Bean TestBean =Null;
= beanNewTestBean (One,Zero,"File directory 1");
MDatas.add (bean);
= beanNewTestBean (Two,Zero,"File directory 2");
MDatas.add (bean);
= beanNewTestBean (Three,Zero,"File directory 3");
MDatas.add (bean);
= beanNewTestBean (Four,One,"File directory 4");
MDatas.add (bean);
= beanNewTestBean (Five,One,"File directory 5");
MDatas.add (bean);
= beanNewTestBean (Six,Two,"File directory 6");
MDatas.add (bean);
= beanNewTestBean (Seven,Two,"File directory 7");
MDatas.add (bean);
= beanNewTestBean (Eight,Three,"File directory 8");
MDatas.add (bean);
= beanNewTestBean (Nine,Three,"File directory 9");
MDatas.add (bean);
= beanNewTestBean (Ten,Zero,"File directory 10");
MDatas.add (bean);
}
}

Data adapter base class:

* *
* tree ListView data adapter class
* @description:
* LDM @author
* @dateTwo thousand and fifteen-Ten-NinemorningNine:Forty-seven:01
* /
Public Abstract ClassExtends BaseAdapter TreeViewBaseAdapter<T> {
ProtectedContext Context;
ProtectedDatas List<T>;
ProtectedMAllNodes List<Node>;
ProtectedMVisibleNodes List<Node>;
ProtectedMInflater LayoutInflater;
ProtectedTreeLv ListView;
ProtectedMTreeListener TreeViewOnItemClick;


Public TreeViewBaseAdapter(treeLv Context, context List<T>, datas ListView,IntThrows) IllegalAccessException IllegalArgumentException, defaultExpandLevel {
This.context = context;
This.treeLv = treeLv;
MInflater = LayoutInflater.From(context);
MAllNodes = TreeHelperTools.getSortedNodes (datas, defaultExpandLevel);
MVisibleNodes = TreeHelperTools.filterVisibleNodes (mAllNodes);
This.treeLv.setOnItemClickListener (NewOnItemClickListener () {


@Override
Public Void OnItemClick(adapterview <?>查看arg0,arg1,int位置,ARG3){
expandorcollapse(位置);
如果(mtreelistener!=){
mtreelistener。ontreeitemclick(位置,mvisiblenodes。得到(位置));
}
}
});
}


公共 无效 setmtreelistener(treeviewonitemclick mtreelistener){
mtreelistener = mtreelistener;
}


* * * *
*设置ListView点击项目节点时,是否应该展开
* @说明:
* @作者LDM
* @日期2015-10-10上午9:05:08
*
受保护的 无效 expandorcollapseint位置){
节点n = mvisiblenodes。得到(位置);
如果(氮!=){
如果(N isleaf()){
返回;
}
n.setexpand(!联合国isexpand());
mvisiblenodes = treehelpertools filtervisiblenodes(mallnodes);
notifydatasetchanged();
}
}


“重写”
公共 int getCount(){
/ /待办事项自动生成方法存根
返回mvisiblenodes。size();
}


“重写”
公共对象GetItemint位置){
/ /待办事项自动生成方法存根
返回mvisiblenodes。得到(位置);
}


“重写”
公共  getitemidint位置){
/ /待办事项自动生成方法存根
返回位置;
}


“重写”
公共getviewint的位置,查看convertview,ViewGroup母){
节点= mvisiblenodes。得到(位置);
convertview = getcontentview(节点位置,convertview,母);
返回convertview;
}


公共 摘要getcontentview(节点节点,int的位置,查看convertview,ViewGroup母);
公共 接口treeviewonitemclick {
无效ontreeitemclick(int位置,节点节点;
}
}

我们使用的适配器

公共 treelistviewadapter<T>延伸 treeviewbaseadapter<T{


公共treelistviewadapter(ListView treelv,语境,列表<T>数据,int defaultexpandlevel)抛出非法存取异常,IllegalArgumentException {
好极 了(treelv,背景,资料,defaultexpandlevel);
}


“重写”
公众视野getcontentview(节点、国际地位,认为convertview,ViewGroup母){
viewholder架=如果(convertview = =){
持有人=新的viewholder();
convertview = minflater膨胀(r.layout.tree_listview_item,父母,);
holder.mitemiv =(图片)convertview findViewById(r.id.mitemiv);
holder.mitemtv =(TextView)convertview findViewById(r.id.mitemtv);
convertview settag(架);
}
其他的{
人=(viewholder convertview gettag());
}
架。mitemiv。setpadding(节点。getlevel() *三十);
如果(节点。geticon() = =—){
架。mitemiv。setvisibility(观。看不见的);
}
其他的{
架。mitemiv。setvisibility(观。可见);
架。mitemiv。setimageresource(节点。geticon());
}
架。mitemtv。setText(节点。getname());
返回convertview;
}


私人静态 viewholder{
mitemiv ImageView;
TextView mitemtv;
}


* * * *
*动态插入数据
*“描述:
*作者LDM
*“日期2015-10-10上午10:08:03
*
公共无效insertnodedata(int的位置,字符串标签){
节点= mvisiblenodes得到(位置);
int indexOf = mallnodes indexOf(节点);
结insertnode =新的节点(—getid(),标签),节点;
insertnode Setparent(节点);
节点。getchildren()添加(insertnode);
mallnodes添加(指标+。,insertnode);
mvisiblenodes = treehelpertools filtervisiblenodes(mvisiblenodes);
notifydatasetchanged();
}
}

数据处理的工具类:

公共  treedatashelpertools{
* * * *
*将用户提供的数据转化成树层级上可用数据
*“描述:
*“日期2015-10-9下午4:07:24
*
公共 静态<列表<节点>datas2nodes(列表中的数据)抛出非法存取异常,IllegalArgumentException {
列表<节点>节点=新的ArrayList <结>();
节点节点对于(吨:数据){
int我的身份—int控制—;
字符串标号=“”/ /节点=新node();
类类getclass() = T;
场域的基本getdeclaredfields() = [];/ /反射获取类中的字段
对于(字段字段:字段){
如果(现场。getannotation(treenodeid。类)!=){/ /根据字段上的注解来获取对应的值
领域。setAccessible(真正的);/ /在Java的反射使用中,如果字段是私有的,那么必须要对这个字段设置才能正常使用,否则报错
ID =领域。getInt(T);
}
如果(现场。getannotation(treenodepid。类)!=){
领域。setAccessible(真正的);
PID =领域。getInt(T);
}
如果(现场。getannotation(treenodelabel。类)!=){
领域。setAccessible(真正的);
标签=(字符串)字段;
}
}
节点=新的节点(标识、标识);
节点(节点);


}
/ /设置节点中的父子节点关系
对于int我=;我<节点。size();i++){
节点:节点(我);
对于int我+;J <节点。size();j++){
节点米=节点;
如果(M. getpid() = =,getid()){/ /如果M的父节点PID = = N的ID,是父节点则m,n是子节点
联合国getchildren()添加(M);
m.setparent(N);
}
其他的 如果(M. getid() = =,getpid()){
M. getchildren()添加(N);
n.setparent(M);
}
}
}
/ /设置节点图片
对于(节点:节点){
setnodeicon(N);
}
返回节点;
}


* * * *
*为我们的节点数据设置对应的图标
*“描述:
*“日期2015-10-9下午4:46:29
*
私人 静态 无效 setnodeicon(节点){
如果(N getchildren() size() >。与联合国isexpand()){/ /如果有子节点且展开状态
n.seticon(r.drawable。icon_unable);
}
其他的 如果(N getchildren() size() >。& &!联合国isexpand()){
n.seticon(r.drawable。icon_enable);
}
其他的{
n.seticon(—);
}
}


公共 静态<列表<节点>getsortednodes(列表< >数据,intdefaultexpandlevel)抛出非法存取异常,IllegalArgumentException {
列表<节点>结果=新的ArrayList <结>();
< >节点的节点列表= datas2nodes(资料);
/ /首先获取根节点数据
< > rootnodes = getrootnodes列表节点(节点);
对于(节点:rootnodes){
ADDNODE(结果,节点,defaultexpandlevel,);
}
返回结果;


}


* * * *
*获取数据中的所有根节点数据
*“描述:
*“日期2015-10-9下午5:00:32
*
私人 静态列表<节点>getrootnodes(列表<节点>节点){
列表<节点>根=新的ArrayList <结>();
对于(节点节点:节点){
如果(节点。isroot()){
根。添加(节点);
}
}
返回根;
}


* * * *
*获取到可见的节点数据
*“描述:
*“日期2015-10-9下午5:12:58
*
公共 静态列表<节点>filtervisiblenodes(表<结> mallnodes){
列表<节点>节点=新的ArrayList <结>();
对于(节点:mallnodes){
如果(节点。isroot() | |节点。isparentexpand()){
setnodeicon(节点);
节点(节点);
}
}
返回节点;
}


* * * *
*把一个节点的所有子节点都放入结果中
*“描述:
*“日期2015-10-9下午5:05:57
*
私人 静态 无效 ADDNODE(列表<节点>结果,节点节点,intdefaultexpandlevel,int之间){
结果:添加(节点);
如果(defaultexpandlevel > =之间){
setexpand(节点。真正的);
}
如果(节点。isleaf()){返回}
对于int我=;我<节点。getchildren()。size();i++){
ADDNODE(结果,节点。getchildren()。让(我),defaultexpandlevel,之间+);
}
}
}

数据实体豆:

公共  testbean{
“treenodeid
私人 int身份证件/ /添加对应的注解
“treenodepid
私人 int控制;
“treenodelabel
私人字符串标号;
私人字符串降序;


公共 testbeanint身份证件int字符串标签){
好极 了();
,我是;
,控制;
标签=标签;
}


公共 testbean(){
/ /待办事项自动生成的构造函数存根
}


公共 int getID(){
返回身份证件
}


公共 无效 压缩文件SetIDint{){
,我是;
}


公共 int getpid(){
返回控制;
}


公共 无效 setpidint){
,控制;
}


公共字符串getlabel(){
返回标签;
}


公共 无效 setlabel(字符串标签){
标签=标签;
}


公共字符串GetDesc(){
返回desc;
}


公共 无效 setdesc(字符串倒序){
计算机描述;
}

}

数据展示中的节点类,我们可以通过反射+注解把任意实体豆如testbean映射成我们想要的节点

公共  {
私人 int身份证件/ /所在节点ID
私人 int控制/ /父节点的ID
私人字符串名称;/ /对应的内容
私人 int水平;/ /所在ListView中树层级
私人 布尔isexpand =/ /所在节点是否展开
私人 int图标;/ /图标图标
私人节点父;/ /父节点节点
私人儿童=节点列表新的ArrayList <结>();/ /对应的子节点数据集
公共 (){
}

公共 int身份证件int字符串名称){
,我是;
,控制;
名字=名字;
}


公共 int getID(){
返回身份证件
}


公共 无效 压缩文件SetIDint{){
,我是;
}


公共 int getpid(){
返回控制;
}


公共 无效 setpidint){
,控制;
}


公共字符串getName(){
返回姓名;
}


公共 无效 集名称(字符串名称){
名字=名字;
}


* * * *
*当前节点所在的层级
*“描述:
*“日期2015-10-9下午4:02:29
*
公共 int 取得级别(){
返回父= =:父母getlevel() +。;
}


公共 无效 setlevelint水平){
水平=水平;
}


公共 布尔 isexpand(){
返回isexpand;
}


公共 无效 setexpand布尔isexpand){
isexpand = isexpand;
如果(!isexpand和孩子。size() >){/ /如果当前节点没有展开,则其子节点展开状态也是:没展开
对于(节点节点:儿童){
setexpand(节点。);
}
}
}


公共 int GetIcon(){
返回图标;
}


公共 无效 操作SetIconint图标){
图标=图标;
}


公共getParent(){
返回父;
}


公共 无效 Setparent(节点父){
父母=父母;
}


公共列表<节点>方法(){
返回儿童;
}


公共 无效 setchildren(列表<节点>儿童){
儿童=儿童;
}


* * * *
*判断当前节点有没有子节点
*“描述:
*作者LDM
*“日期2015-10-9下午3:59:42
*
公共 布尔 isleaf(){
返回孩子size() = =。;
}


* * * *
*是不是根节点
*“描述:
*作者LDM
*“日期2015-10-9下午3:58:15
*
公共 布尔 根基(){
返回父= =;
}


* * * *
*当前节点所在父节点是否展开
*“描述:
*作者LDM
*“日期2015-10-9下午3:58:34
*
公共 布尔 isparentexpand(){
如果(家长= =){
返回 ;
}
其他的{
返回parent.isexpand;
}
}
}

用到的注解类:

“目标”(ElementType。场)/ /定义注解的作用目标:字段、枚举的常量
保留(retentionpolicy。运行时)/ /注解策略:注解会在类字节码文件中存在,在运行时可以通过反射获取到
公共@接口 treenodeid{
}
“目标”(ElementType。场)/ /定义注解的作用目标:字段、枚举的常量
保留(retentionpolicy。运行时)/ /注解策略:注解会在类字节码文件中存在,在运行时可以通过反射获取到
公共@接口 treenodelabel{
}
``

“目标(ElementType。场)/定义注解的作用目标:字段、枚举的常量
“保留(retentionpolicy。运行时间)/注解策略:注解会在类字节码文件中存在,在运行时可以通过反射获取到
接口treenodepid {
}

ListView的项目对应布局文件:

作者:true100发表于2016 / 1 / 29 17:48:08原文链接
阅读:78评论:0查看评论
]]>
<![CDATA[[原]AndroidStudio中使用开源框架android-gif-drawable]]> http://prog3.com/sbdm/blog/true100/article/details/50606040 http://prog3.com/sbdm/blog/true100/article/details/50606040 true100 2016 / 1 / 29 11:21:38 一般情况下,我们在Android项目中只能使用。png,jpg等格式的静态图片,诸如GIF格式的动态图片是加载不了的。

有了Android GIF冲这个开源框架,在项目中使用GIF GIF冲的Android动态图片不再是问题。
开源地址是:http:/ / GitHub。COM /核心–/ Android GIF冲。其主要作用就是可以展示GIF格式的图片及动画,还可以对动画进行监听操作。开源库中封闭了gifimageview,gifimagebutton,giftextview等控件。和我们普通的ImageView,ImageButton,TextView使用方法基本一样,只要在布局文件中添加这些控件,然后就可以直接设置GIF图片作为背景等。
首先在androidstudio中配置相关依赖库代码,在配置文件Gradle文件中添加建造:

依赖{
编译filetree(目录“库”,包括:[“*”)
编译“pl.droidsonroids .gif:Android GIF冲:1.1。”
}

布局文件,以gifimageview和giftextview为例:

<?xml version=“1”encoding=“utf-8”?>
<线性布局 xmlns:Android=“http://schemas.android.com/apk/res/android”
    安卓:layout_width=“match_parent”
    安卓:layout_height=“match_parent”
    安卓:方向=“垂直”>

    <pl.droidsonroids.gif.gifimageview
        安卓:身份证=“@ +身份证/ test_gif”
        安卓:layout_width=“match_parent”
        安卓:layout_height=“wrap_content”
        安卓:layout_margin=“15dp”/ >

    <pl.droidsonroids.gif.giftextview
        安卓:layout_margin=“15dp”
        安卓:layout_width=“wrap_content”
        安卓:layout_height=“wrap_content”
        安卓:背景=“@冲/测试”
        安卓:文本=“这个TextView的背景好酷”
        安卓:文字颜色=“# ffffff”/ >
< /线性布局>

代码:

公共  主要活动 延伸 appcompatactivity{
    私人gifimageview test_gif;


    “重写”
    受保护的 无效 onCreate(束savedinstancestate){
        好极 了onCreate(savedinstancestate);
setContentView(r.layout。activity_main);
test_gif =(gifimageview)findViewById(r.id.test_gif);
        / /设置图片数据
test_gif。setimageresource(r.drawable。试验);
        最后android.widget.mediacontroller媒体控制器=新的Android的媒体控制器(widget。);
媒体控制器。setmediaplayer((gifdrawable)test_gif。getdrawable());
test_gif setonclicklistener(。新的onclicklistener() {视图。
            “重写”
            公共 无效 onclick(查看第五){
show()媒体控制器;
使(test_gif snackbar,“可以点击哦”,show() snackbar。length_long);
}
});
}
}

其中项目中的图片是我在百度上随便找的一张GIF格式的图片,运行效果就是手机上有两张动态图片,其中一张上有文字”这个TextView的背景好酷”。

作者:true100发表于2016 / 1 / 29 11:21:38原文链接
阅读:66评论:0查看评论
]]>
<![CDATA[[原]AndroidStudio使用开源框架PhotoView]]> http://prog3.com/sbdm/blog/true100/article/details/50605692 http://prog3.com/sbdm/blog/true100/article/details/50605692 true100 2016 / 1 / 29 10:40:49 PhotoView是一个开源的图片查看库,可以实现图片的浏览,手势放大缩小等操作,

以及支持在ViewPager中翻页浏览图片等功能PhotoView使用简单,还可以对缩放模式进行设置,
其开源地址为:https://github.com/chrisbanes/photoview
我们在使用的时候,主要是用到PhotoView这个控件,它继承自ImageView,实现了iphotoview接口,对图片的缩放进行了处理。
在androidstudio中使用也很方便。
首先新建项目,在项目的配置文件Gradle文件中进行代码配置,主要是添加如下一句代码建造:

依赖{
编译的COM。commit451:PhotoView:1.2.4”
}

清洁下我们的项目,不报错的话就可以直接使用这个开源库了。

<?xml version=“1”encoding=“utf-8”?>
<线性布局 xmlns:Android=“http://schemas.android.com/apk/res/android”
    安卓:layout_width=“match_parent”
    安卓:layout_height=“match_parent”>

    <uk.co.senab.photoview.photoview<!——要使用PhotoView且要写完整路径——>
安卓:layout_margin =“15dp”
安卓:ID =“”+身份证/ test_iv”
安卓:layout_width =“match_parent”
安卓:layout_height =“100dp”/>
< /线性布局>

代码中处理:

公共  主要活动 延伸 appcompatactivity{
    私人test_iv PhotoView;
    私人photoviewattacher photoviewattacher;

    “重写”
    受保护的 无效 onCreate(束savedinstancestate){
        好极了onCreate(savedinstancestate);
setContentView(r.layout。activity_main);
test_iv =(PhotoView)findViewById(r.id.test_iv);
        / /直接加载图片资源文件件
/ / test_iv。setimageresource(r.drawable。试验);
        / /加载本地文件如项目中资产下文件
loadlocalpic();
photoviewattacher =新的photoviewattacher(test_iv);
        / / photoviewattacher。setzoomable(假);/ /设置不能缩放
}

    私人 无效 loadlocalpic(){
        试试看{
输入流InputStream = getassets()开放(。“测试。png”);
位图= BitmapFactory decodestream(InputStream);
test_iv setimagebitmap(位图);
}抓住(IOException e){
E. printstacktrace();
}
}
}

网上也有不少关于这个框架的原码解析,正在学习中的…

作者:true100发表于2016 / 1 / 29 10:40:49原文链接
阅读:112评论:0查看评论
]]>
<![CDATA[[原]Android Design Support Library常用控件(下)]]> http://prog3.com/sbdm/blog/true100/article/details/50600456 http://prog3.com/sbdm/blog/true100/article/details/50600456 true100 2016 / 1 / 28 14:30:44 在之前一篇文章Android设计支持库常用控件(上)中介绍了几个常用的控件,如floatingactionbutton,等snackbar。 这篇文章再介绍另外几个常用的控件appbarlayout,nestedscrollview,coordinatorlayout及collapsingtoolbarlayout等等。 主要的几个控件都放在布局中,有简单的注释,更多的属性有功能还需要深入学习。
  <?xml version=“1”encoding=“utf-8”?><! --CoordinatorLayout is an enhanced FrameLayout. The effect of two as a layout layout root as a sub view coordinate gestures effects of a coordinated layout -- >
<Android.support.design.widget.CoordinatorLayout Xmlns:android="Http://schemas.android.com/apk/res/android"
    Xmlns:app="Http://schemas.android.com/apk/res-auto"
    Android:id="@+id/coordinator"
    Android:layout_width="Match_parent"
    Android:layout_height="Match_parent"
    Android:fitsSystemWindows="True">
    <! --AppBarLayout is a ViewGroup container components, the parent class is LinearLayout. The purpose is to support the swipe gesture operation -- > for the material design AppBar
    <Android.support.design.widget.AppBarLayout
        Android:layout_width="Match_parent"
        Android:layout_height="200dp">
        <! --CollapsingToolbarLayout package Toolbar, provides a folding effect, generally used as a sub view of the AppbarLayout. -- >
        <! --Content scrim:ToolBar is folded into the background when the top fixed -- >
        <! - due to the characteristics of CollapsingToolbarLayout, the application of the title text in the contraction and expansion of the state will automatically transition. The unfolded state change the title text, 4 attributes -- > margin
        <! - app:expandedTitleMargin, app:expandedTitleMarginBottom, app:expandedTitleMarginEnd, and app:expandedTitleMarginStart-->
        <Android.support.design.widget.CollapsingToolbarLayout
            Android:id="@+id/coll_tb_layout"
            Android:layout_width="Match_parent"
            Android:layout_height="Match_parent"
            App:contentScrim="#FF00FF"
            App:expandedTitleMargin="30dp"
            App:layout_scrollFlags="Scroll|exitUntilCollapsed">
            <! --layout_collapseParallaxMultiplier set parallax scrolling factor, value: 0~1-->
            <ImageView
                Android:layout_width="Match_parent"
                Android:layout_height="Match_parent"
                Android:scaleType="FitXY"
                Android:src="@drawable/test"
                App:layout_collapseParallaxMultiplier="0.5">
            <! --Toolbar is similar to ActionBar-->
            <! --layout_collapseMode (folding mode) two values:
Pin - is set to this mode when the CollapsingToolbarLayout is fully retracted after the Toolbar can also be retained on the screen.
Parallax - set for this mode, when the contents of the scroll, View in the CollapsingToolbarLayout (such as ImageView) can also scroll to achieve parallax scrolling effect,
Usual and layout_collapseParallaxMultiplier (set parallax factor) collocation use.
-- >
            <Android.support.v7.widget.Toolbar
                Android:id="@+id/toolbar"
                Android:layout_width="Match_parent"
                Android:layout_height="Attr/actionBarSize?"
                Android:background="#77db93"
                Android:minHeight="20dp"
                App:layout_collapseMode="Parallax"
                App:popupTheme="@style/ThemeOverlay.AppCompat.Light"
                App:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">< /Android.support.v7.widget.Toolbar>
        < /Android.support.design.widget.CollapsingToolbarLayout>
    < /Android.support.design.widget.AppBarLayout>
    <! --NestedScrollView, similar with ScrollView, but there is no effect taking place ScrollView
    <! - > - when the control of the layout_behavior is set to slide, it triggers a change in the state of the control that sets the layout_scrollFlags. -- >
    <Android.support.v4.widget.NestedScrollView
        Android:layout_width="Match_parent"
        Android:layout_height="Wrap_content"
        App:layout_behavior="@string/appbar_scrolling_view_behavior">

        <LinearLayout
            Android:layout_width="Match_parent"
            Android:layout_height="Wrap_content"
            Android:orientation="Vertical">

            <ImageView
                Android:layout_width="Wrap_content"
                Android:layout_height="Wrap_content"
                Android:layout_margin="10dp"
                Android:src="@mipmap/ic_launcher">

            <ImageView
                Android:layout_width="Wrap_content"
                Android:layout_height="Wrap_content"
                Android:layout_margin="10dp"
                Android:src="@mipmap/ic_launcher">

            <ImageView
                Android:layout_width="Wrap_content"
                Android:layout_height="Wrap_content"
                Android:layout_margin="10dp"
                Android:src="@mipmap/ic_launcher">

            <ImageView
                Android:layout_width="Wrap_content"
                Android:layout_height="Wrap_content"
                Android:layout_margin="10dp"
                Android:src="@mipmap/ic_launcher">

            <ImageView
                Android:layout_width="Wrap_content"
                Android:layout_height="Wrap_content"
                Android:layout_margin="10dp"
                Android:src="@mipmap/ic_launcher">

            <ImageView
                Android:layout_width=“wrap_content”
                安卓:layout_height=“wrap_content”
                安卓:layout_margin=“10dp”
                安卓:SRC=“@ mipmap / ic_launcher”/ >

            <ImageView
                安卓:layout_width=“wrap_content”
                安卓:layout_height=“wrap_content”
                安卓:layout_margin=“10dp”
                安卓:SRC=“@ mipmap / ic_launcher”/ >

            <ImageView
                安卓:layout_width=“wrap_content”
                安卓:layout_height=“wrap_content”
                安卓:layout_margin=“10dp”
                安卓:SRC=“@ mipmap / ic_launcher”/ >

            <ImageView
                安卓:layout_width=“wrap_content”
                安卓:layout_height=“wrap_content”
                安卓:layout_margin=“10dp”
                安卓:SRC=“@ mipmap / ic_launcher”/ >

            <ImageView
                安卓:layout_width=“wrap_content”
                安卓:layout_height=“wrap_content”
                安卓:layout_margin=“10dp”
                安卓:SRC=“@ mipmap / ic_launcher”/ >

            <ImageView
                安卓:layout_width=“wrap_content”
                安卓:layout_height=“wrap_content”
                安卓:layout_margin=“10dp”
                安卓:SRC=“@ mipmap / ic_launcher”/ >

            <ImageView
                安卓:layout_width=“wrap_content”
                安卓:layout_height=“wrap_content”
                安卓:layout_margin=“10dp”
                安卓:SRC=“@ mipmap / ic_launcher”/ >
        < /线性布局>
    < /android.support.v4.widget.nestedscrollview>

    <android.support.design.widget.floatingactionbutton
        安卓:身份证=“@ +身份证/ float_btn”
        安卓:layout_width=“wrap_content”
        安卓:layout_height=“wrap_content”
        安卓:layout_gravity=“底层|权”
        安卓:layout_margin=“10dp”
        安卓:SRC=“@ mipmap / ic_launcher”
        应用:fabsize=“正常”/ >
< /android.support.design.widget.coordinatorlayout>

活动中代码:

公共  主要活动 延伸 appcompatactivity{
    私人coordinatorlayout协调员;
    私人floatingactionbutton float_btn;
    私人工具栏工具栏;
    私人snackbar snackbar;
    私人collapsingtoolbarlayout coll_tb_layout;
    “重写”
    受保护的 无效 onCreate(束savedinstancestate){
        好极了onCreate(savedinstancestate);
setContentView(r.layout。test_main_layout);
float_btn =(floatingactionbutton)findViewById(r.id.float_btn);
协调员=(coordinatorlayout)findViewById(r.id.coordinator);
工具栏=(工具栏)findViewById(r.id.toolbar);
coll_tb_layout =(collapsingtoolbarlayout)findViewById(r.id.coll_tb_layout);
coll_tb_layout settitle(。“这里显示标题”);
setsupportactionbar(工具栏);
        / /使用应用图标来返回主页,必须通过调用sethomebuttonenabled(真的)方法确
getsupportactionbar() sethomebuttonenabled(。真正的);
        / /应用程序图标能够向上导航,ActionBar中调用etdisplayhomeasupenabledtrue(真正的)方法。
getsupportactionbar() setdisplayhomeasupenabled(。真正的);
float_btn setonclicklistener(。新的onclicklistener() {视图。
            “重写”
            公共 无效 onclick(查看第五){
snackbar = snackbar。使(协调员,“我是snackbar,美吧!”,length_long snackbar);
show() snackbar;
setaction(snackbar。“知道啦”新的onclicklistener() {视图。
                    “重写”
                    公共 无效 onclick(查看第五){
dismiss() snackbar;
}
});
}
});
}
}

实现可以滑动的效果,几个简单的截图,还不知道如何把动态效果上传上来:
这里写图片描述

作者:true100发表于2016 / 1 / 28 14:30:44原文链接
阅读:78评论:0查看评论
]]>
<![CDATA[[原]Android Design Support控件之DrawerLayout简单使用]]> http://prog3.com/sbdm/blog/true100/article/details/50598828 http://prog3.com/sbdm/blog/true100/article/details/50598828 true100 2016 / 1 / 28 10:18:10 安可以让我们在项目中很方便地实现侧滑菜单效果现在主流的应用如QQ等都。
采用的这种效果。这两天也是在学习Android设计支持的相关知识,网上有关这方面的文章介绍非常多,但是为了方便以后使用,还是把学习的知识做个简单记录这次的代码也是在上一篇博客Android。设计支持控件介绍之tablayout的基础上添加的布局和代码。
主界面布局:

<?xml version=“1”encoding=“utf-8”?>
<android.support.v4.widget.drawerlayout xmlns:Android=“http://schemas.android.com/apk/res/android”
    xmlns:APP=“http://schemas.android.com/apk/res-auto”
    安卓:身份证=“@ +身份证/ drawer_view”
    安卓:layout_width=“match_parent”
    安卓:layout_height=“match_parent”>


    <android.support.design.widget.navigationview
        安卓:身份证=“@ +身份证/ navigation_view”
        安卓:layout_width=“200dp”
        安卓:layout_height=“match_parent”
        安卓:layout_gravity=“左”
        安卓:fitssystemwindows=“真”
        应用:headerlayout=“@布局/ content_main”><!——content_main与上篇文章中一样-->
    < /android.support.design.widget.navigationview>
< /android.support.v4.widget.drawerlayout>

侧滑菜单左侧的布局

<?xml version=“1”encoding=“utf-8”?>
<线性布局 xmlns:Android=“http://schemas.android.com/apk/res/android”
    xmlns:APP=“http://schemas.android.com/apk/res-auto”
    安卓:layout_width=“match_parent”
    安卓:layout_height=“match_parent”
    安卓:方向=“垂直”
    安卓:衬垫=“10dp”>

    <TextView
        安卓:layout_width=“wrap_content”
        安卓:layout_height=“wrap_content”
        安卓:layout_margintop=“40dp”
        安卓:文本=“菜单一”/ >

    <TextView
        安卓:layout_width=“wrap_content”
        安卓:layout_height=“wrap_content”
        安卓:layout_margintop=“20dp”
        安卓:文本=“菜单两”/ >

    <TextView
        安卓:layout_width=“wrap_content”
        安卓:layout_height=“wrap_content”
        安卓:layout_margintop=“20dp”
        安卓:文本=“菜单三”/ >

    <TextView
        安卓:layout_width=“wrap_content”
        安卓:layout_height=“wrap_content”
        安卓:layout_margintop=“20dp”
        安卓:文本=“菜单四”/ >

    <TextView
        安卓:layout_width=“wrap_content”
        安卓:layout_height=“wrap_content”
        安卓:layout_margintop=“20dp”
        安卓:文本=“菜单五”/ >
< /线性布局>

片段界面布局

<?xml version=“1”encoding=“utf-8”?>
<线性布局 xmlns:Android=“http://schemas.android.com/apk/res/android”
    xmlns:APP=“http://schemas.android.com/apk/res-auto”
    安卓:layout_width=“match_parent”
    安卓:layout_height=“match_parent”
    安卓:方向=“垂直”
    安卓:衬垫=“10dp”>
    <TextView
        安卓:身份证=“@ +身份证/ content_tv”
        安卓:layout_width=“wrap_content”
        安卓:layout_height=“wrap_content”
        安卓:layout_margintop=“40dp”
        安卓:文本=“菜单一”/ >
< /线性布局>

主界面代码,testadapter及testfragment代码也同上一篇文章一样。

公共  主要活动 延伸 fragmentactivity{
    / /便捷实现标签显示
    私人tablayout tab_layout;
    私人ViewPager ViewPager;
    私人testadapter madapter;
    私人片段>片段;
    私人列表<字符串>标题;
    私人安drawer_view;

    “重写”
    受保护的 无效 onCreate(束savedinstancestate){
        好极了onCreate(savedinstancestate);
setContentView(r.layout。drawer_layout);
initviews();
initviewpages();
}

    私人 无效 initviewpages(){
片段=新的ArrayList <>();
头衔=新的ArrayList <>();
        对于int我=我<我+ +){
字符串标题=“标签”+我;
标题(标题);
tab_layout。addtab(tab_layout。newtab()。setText(标题));/ /添加选项卡标题
片段片段新的testfragment();
束束=新的bundle();
束。putString(“内容”“这是第”+我+“个片段页面”);
setarguments(束)的片段;
片段(片段);
}

madapter =新的testadapter(getsupportfragmentmanager()、标题、片段);
setadapter ViewPager(madapter);
tab_layout setupwithviewpager(ViewPager);
tab_layout settabsfrompageradapter(madapter);

}

    私人 无效 initviews(){
tab_layout =(tablayout)findViewById(r.id.tab_layout);
ViewPager =(ViewPager)findViewById(r.id.viewpager);
drawer_view =(安)findViewById(r.id.drawer_view);
drawer_view。closedrawer(gravitycompat。开始);
}
}

效果图:
这里写图片描述

作者:true100发表于2016 / 1 / 28 10:18:10原文链接
阅读:139评论:0查看评论
]]>
<![CDATA[[原]Android Design Support控件介绍之TabLayout]]> http://prog3.com/sbdm/blog/true100/article/details/50595277 http://prog3.com/sbdm/blog/true100/article/details/50595277 true100 2016 / 1 / 27 16:36:55 [设计接着上一篇Android支持库常用控件介绍(上)](HTTP:/ / prog3。COM /深圳/博客/ true100 /文章/细节/ 50593636)这篇来简单介绍下tablayout的使用。 Usually when we do with the title of the slide effect, are used to achieve TabPageIndicator+ViewPager. Today we use TabLayout+ViewPager to achieve the same effect, but also to achieve a much simpler way than before. Let's go straight into the code!

Main interface layout

   <? Version= XML "1" encoding= "UTF-8"?
<LinearLayout Xmlns:android="Http://schemas.android.com/apk/res/android"
    Xmlns:app="Http://schemas.android.com/apk/res-auto"
    Android:layout_width="Match_parent"
    Android:layout_height="Match_parent"
    Android:fitsSystemWindows="True"
    Android:orientation="Vertical">
    --tabTextColor set the text color -- > <!
    <! Text color when -- > --tabSelectedTextColor
    <! --tabIndicatorColor indicates the color of life
    < -- > --tabIndicatorHeight indicating the height!
    <Android.support.design.widget.TabLayout
        Android:id="@+id/tab_layout"
        Android:layout_width="Match_parent"
        Android:layout_height="Wrap_content"
        App:tabIndicatorColor="@android:color/holo_green_dark"
        App:tabIndicatorHeight="4dp"
        App:tabSelectedTextColor="@android:color/holo_red_dark"
        App:tabTextColor="@android:color/black">< /Android.support.design.widget.TabLayout>

    <Android.support.v4.view.ViewPager
        Android:id="@+id/viewpager"
        Android:layout_width="Match_parent"
        Android:layout_height="Match_parent">< /Android.support.v4.view.ViewPager>
< /LinearLayout> 

Use Fragment page simple layout

<? Version= XML "1" encoding= "UTF-8"?
<RelativeLayout Xmlns:android="Http://schemas.android.com/apk/res/android"
    Xmlns:app="Http://schemas.android.com/apk/res-auto"
    Android:layout_width="Match_parent"
    Android:layout_height="Match_parent"
    Android:padding="10dp">

    <TextView
        Android:id="@+id/content_tv"
        Android:layout_width="Wrap_content"
        Android:layout_height="Wrap_content"
        Android:text="World Hello!">
< /RelativeLayout>

Frament class

Public Class TestFragment Extends Fragment{
    PrivateContent String;
    PrivateContent_tv TextView;
    PrivateFragmentView View;

    @Override
    Public Void OnCreate(Bundle savedInstanceState @Nullable) {
        Super.onCreate (savedInstanceState);
Content= (String) getArguments ().Get () ()"Content");
}

    @Override
    PublicViewOnCreateView(inflater ViewGroup, container LayoutInflater, savedInstanceState Bundle) {
Inflater.inflate fragmentView= (R.layout.content_main,Null);
Content_tv= (TextView) fragmentView.findViewById (R.id.content_tv);
Content_tv.setText (content);
        ReturnFragmentView;
}
}

ViewPager adapter class

/ * *
* by: ${ldm} Created
* time: 15:34 2016/1/27
* /
Public Class TestAdapter Extends FragmentPagerAdapter{
    PrivateFragments List<Fragment>;
    PrivateList<String>titles;
    Public TestAdapter(FM List<String>titles, FragmentManager, fragments List<Fragment>) {
        Super(FM);
        This.fragments=fragments;
        This.titles=titles;
}

    / * *
* the Fragment associated with a specified Return position.
*
*@paramPosition
* /
    @Override
    PublicFragmentGetItem(IntPosition) {
        ReturnFragments.get (position);
}

    / * *
* the number of views available. Return
* /
    @Override
    Public Int GetCount(1)
        ReturnFragments.size ();
}

    @Override
    PublicCharSequenceGetPageTitle(IntPosition) {
        ReturnTitles.get (position);
}
}

Home page code class

Public Class MainActivity Extends FragmentActivity{
    Convenient to realize display label / /
    PrivateTab_layout TabLayout;
    PrivateViewpager ViewPager;
    PrivateMAdapter TestAdapter;
    PrivateFragments List<Fragment>;
    PrivateTitles List<String>;

    @Override
    Protected Void OnCreate(savedInstanceState Bundle) {
        Super.onCreate (savedInstanceState);
SetContentView (R.layout.activity_main);
InitViews ();
InitViewPages ();
}

    Private Void InitViewPages(1)
Fragments =NewArrayList<> ();
Titles =NewArrayList<> ();
        For(Int= IZeroI; "FourI++) {
Title= String"TAB"+ i;
Titles.add (Title);
Tab_layout.addTab (tab_layout.newTab ().SetText (title));/ / add Tab title
Fragment Fragment =NewTestFragment ();
Bundle Bundle =NewBundle ();
Bundle.putString ("Content","This is the first"I + +"A Fragment page");
Fragment.setArguments (bundle);
Fragments.add (fragment);
}

madapter =新的testadapter(getsupportfragmentmanager()、标题、片段);
setadapter ViewPager(madapter);
tab_layout setupwithviewpager(ViewPager);
tab_layout settabsfrompageradapter(madapter);
}

    私人 无效 initviews(){
tab_layout =(tablayout)findViewById(r.id.tab_layout);
ViewPager =(ViewPager)findViewById(r.id.viewpager);
}

}

效果如图:
这里写图片描述

作者:true100发表于2016 / 1 / 27 16:36:55原文链接
阅读:82评论:0查看评论
]]>
<![CDATA[[原]Android Design Support Library常用控件介绍(上)]]> http://prog3.com/sbdm/blog/true100/article/details/50593636 http://prog3.com/sbdm/blog/true100/article/details/50593636 true100 2016 / 1 / 27 14:29:57 Android的设计支持库给我们提供了一些既方便操作又非常实用还非常酷炫的控件。让我们来简单地体验下吧!先介绍下floatingactionbutton,及textinputlayout snackbar。

  1. 首先介绍下floatingactionbutton(浮动的圆形按钮)和snackbar(:可交互的提示框)。
<?xml version=“1”encoding=“utf-8”?>
<线性布局 xmlns:Android=“http://schemas.android.com/apk/res/android”
    xmlns:APP=“http://schemas.android.com/apk/res-auto”
    安卓:layout_width=“match_parent”
    安卓:layout_height=“match_parent”
    安卓:fitssystemwindows=“真”
>

    <android.support.design.widget.floatingactionbutton
        安卓:身份证=“@ +身份证/ float_btn”
        安卓:layout_width=“wrap_content”
        安卓:layout_height=“wrap_content”
        安卓:layout_gravity=“顶|左”
        安卓:layout_margin=“@维/ fab_margin”
        应用:fabsize=“正常”
        应用:海拔=“8dp”
        安卓:SRC=“@安卓:冲/ ic_dialog_email”/ >

< /线性布局>
公共  主要活动 延伸 活动{
    / / floatingactionbutton:浮动的圆形按钮
    私人floatingactionbutton float_btn;
    / / snackbar:可交互的提示框,功能相当于敬酒,但可以操作
    私人snackbar snackbar;

“重写”
    受保护的 无效onCreate(Bundle savedinstancestate){
        好极 了onCreate(savedinstancestate);
setContentView(r.layout。activity_main);

float_btn =(floatingactionbutton)findViewById(r.id.float_btn);
float_btn setonclicklistener(。新的onclicklistener() {视图。
“重写”
            公共 无效onClick(视图){
snackbar = snackbar。使(查看,“这是个可交互的提示框!”,length_long snackbar);
show() snackbar;
setaction(snackbar。“确定”新的onclicklistener() {视图。
“重写”
                    公共 无效onClick(视图){
dismiss() snackbar;
}
});
}
});
}

}
` ` `效果如图
![这里写图片描述](HTTP:/ / prog3。COM /深圳/ IMG的博客/ 20160127135455731)。
 2。接下来介绍下textinputlayout(体验效果更好的EditText)
布局文件




<DIV =”东南方预览部分分隔符“,”DIV>

公共  主要活动 延伸 活动{
    / /更加人性化的EditText
    私人textinputlayout text_input;
    私人编辑编辑;

    “重写”
    受保护的 无效 onCreate(束savedinstancestate){
        好极 了onCreate(savedinstancestate);
setContentView(r.layout。activity_main);
text_input =(textinputlayout)findViewById(r.id.text_input);
text_input sethint(。“请输入你的手机号码!”);/ /提示文字
text_input getedittext() EditText =;/ /获取到里面的EditText
addtextchangedlistener(EditText。新的textwatcher() {
            “重写”
            公共 无效 beforetextchanged(CharSequence的,int开始,int伯爵,int后){

}

            “重写”
            公共 无效 ontextchanged(CharSequence的,int开始,int以前,int伯爵){

}

            “重写”
            公共 无效 aftertextchanged(编辑的){
          如果(美国length()!=十一){
text_input seterror(。“您输入的手机号码不正确”);/ /错误提示
text_input seterrorenabled(。真正的);
}其他的{
text_input seterrorenabled(。);
}
}
});
}

}

显示的效果图:
这里写图片描述

作者:true100发表于2016 / 1 / 27 14:29:57原文链接
阅读:70评论:0查看评论
]]>
<![CDATA[[原]Android Design Support Library介绍之:环境搭建]]> Http://prog3.com/sbdm/blog/true100/article/details/50593302 Http://prog3.com/sbdm/blog/true100/article/details/50593302 True100 12:01:40 2016/1/27 At the 2015 GoogleIO conference, detailed Design Material design specifications released, the new Design Support Library Android

Lattice. More to make people happy is that these very cool style can be through the Design Support Library Android to the low version to API==8
2.2 version, which can not be said to be the gospel of our developers.
Several elements of the Design Material design style are:

  • Flat, simple wind
  • Animation has a good transition effect
  • Material spatial location of the intuitive changes, the three-dimensional effect is good.

    Its design principles can refer to:Http://www.leiphone.com/news/201406/nine-principle-material-design.html
    AndroidStudio in the configuration of Design Support Library Android:

  • The first step, check the SDK in the AndroidStudio in the corresponding Library is installed:
    这里写图片描述

  • To install the Library library here:
    这里写图片描述
    My local computer AndroidStudio is already installed.
  • The second step: the new Android project, the corresponding configuration, and now we have built the project SupportDemo, and then the following configuration, the first selected project, the right mouse button module settings这里写图片描述
  • Then module settings, such as the map:
    这里写图片描述

    This configuration is good, you can see the build.gradle file in the project as the following code (in fact, can also be written in this file directly on the code, and then Build can be):
    这里写图片描述
    With more than a few steps, we are configured in Android Design Support Library AndroidStudio.

Eclipse Android configuration design support library is relatively simple: find download Android design support library file directory, the design document as the project to import into eclipse, as a library project, after the establishment of the project, the library project and their Engineering Association on OK!

Author: true100 published in 12:01:40 2016/1/27Text link
Read: 144 comments: 0View comments
]]>
<![CDATA[[原]Android数据库ORM框架:GreenDao在AndroidStudio中使用]]> Http://prog3.com/sbdm/blog/true100/article/details/50578112 Http://prog3.com/sbdm/blog/true100/article/details/50578112 True100 10:56:08 2016/1/25 The first two projects are used in the GreenDao framework (open source address: [https://github.com/greenrobot/greenDAO] (https://github.com/greenrobot/greenDAO)) as a framework for the operation of our database, I think it is good to use. But has been using the Eclipse project, and now we have all used AndroidStudio development projects as a development tool, how to use the GreenDao framework in AndroidStudio it? See the number of on-line presentation, in accordance with the God of their advice, finally also completed the small target using GreenDao in AndroidStudio, or make a note, after the new project and then GreenDao can directly use the.
  1. Step 1: create a new project in AndroidStudio, my project is called greendao.
  2. Second step: in the project Gradle file configuration:
    Configuration code:
    Add in sourceSets: java.srcDirs = ['src/main/java', 'src/main/java-gen']
    Add in dependencies: de.greenrobot:greendao:1.3.7 'compile'
    Of course, your version may not be 1.3.7, but the configuration method is the same.
SourceSets{
{main
Java.srcDirs = ['src/main/java','src/main/java-gen']
}
}

Dependencies{
Compile'de.greenrobot:greendao:1.3.7'
}
  1. Third step: in the project SRC - >main folder under the new java-gen file:
    这里写图片描述

    Fourth 4 step: the new Java type module in the project, my module name is >New - >New - Module: daoexaple:File
    Fifth 5 step: in the new daoexaple to add the code used to build the database, tables, etc., the sample code is as follows, many of the GreenDao code is the same:

Public Class DaoGenenator{
    Public Static Void Main(args String[])ThrowsException {
        / / the two parameters were: packet path database version number and automatic code generation.
Schema Schema =NewSchema (One,"Com.ldm.greendao");
        / / schema also has two default flags were used to mark entity is an activie and whether to use keep sections.
        (/ / schema2.enableActiveEntitiesByDefault);
        (/ / schema2.enableKeepSectionsByDefault);
        "Once you have a Schema object, you can use it to add entities (Entities).
AddNote (schema);
        / / in the end, we will use DAOGenerator of generateAll () code is automatically generated. Here you need to change the output directory is created before java-gen) according to their own situation. The path of the output directory can also be set in the build.gradle
        NewDaoGenerator ().GenerateAll (schema),"F:/as20150625/greendao/app/src/main/java-gen");
}

    / * *
*@paramSchema
* /
    Private Static Void AddNote(schema Schema) {
        / / an entity (class) is associated to a table in the database, the table named "Note" (the class name)
Note Entity = schema.addEntity ("Note");
        You can also re / / to the table name
        / / note.setTableName ("NODE");

        / / greenDAO automatically according to the properties of entity class values to create table field, and gives the default value
        You can set the next / field in the table:
Note.addIdProperty ();
Note.addStringProperty ("Text"().NotNull ();
        / / and in Java using hump nomenclature is different, the default database name is use of capitals and underscores to separate words.
        A property / / For example, called "creationDate" will become a "database column CREATION_DATE".
Note.addStringProperty ("Comment");
Note.addDateProperty ("Date");
}
}

 SixSixth step: if there is no problem in the five steps above, then refresh the project, under the java-gen folder of your main project will be more than a few class files, this is the GreenDao tool to generate the file.
 SevenThe database operation can be carried out. We only create a new table above, corresponding to a physical class: Note, if you want to add a table or other changes, as long as the DaoGenenator in the class corresponding to the operation can be.
Below to paste my demo simple code:

Class MainActivity extends Activity implements View.OnClickListener {public
Button greendao_add private;
Button greendao_del private;
Button greendao_update private;
Button greendao_query private;
EditText input_edt private;
TextView show_result private;
SQLiteDatabase DB private;
DaoMaster daoMaster private;
DaoSession daoSession private;
Cursor cursor private;
NoteDao noteDao private;
ListnoteList private;

@Override
Void onCreate protected (savedInstanceState Bundle) {
Super.onCreate (savedInstanceState);
SetContentView (R.layout.activity_main);
InitGreenDao ();
InitViews ();
InitEvents ();
}

Void initGreenDao private () {

Helper DaoMaster.DevOpenHelper = DaoMaster.DevOpenHelper new (this, "notes-db", null);
DB = helper.getWritableDatabase ();
DaoMaster = DaoMaster new (DB);
DaoSession = daoMaster.newSession ();
NoteDao = daoSession.getNoteDao ();
Cursor = db.query (noteDao.getTablename) (), null (),, null, null, null, null, noteDao.getAllColumns;
}

Void initViews private () {
This.greendao_add = (Button) findViewById (R.id.greendao_add);
This.greendao_del = (Button) findViewById (R.id.greendao_del);
This.greendao_update = (Button) findViewById (R.id.greendao_update);
This.greendao_query = (Button) findViewById (R.id.greendao_query);
This.input_edt = (EditText) findViewById (R.id.input_edt);
This.show_result = (TextView) findViewById (R.id.show_result);
}

Void initEvents private () {
This.greendao_add.setOnClickListener (this);
This.greendao_del.setOnClickListener (this);
This.greendao_update.setOnClickListener (this);
This.greendao_query.setOnClickListener (this);
}

@Override
Void onClick public (V View) {
Switch (v.getId ()) {
R.id.greendao_add: case
AddNote ();
Break;
R.id.greendao_del: case
ID long = 10;
NoteDao.deleteByKey (ID); / / ID to delete, such as id=10
(//noteDao.deleteAll); / / delete all
NoteDao.delete (Note note); / / delete an object
There are several other different / / delete method, the corresponding parameters can be as long as the incoming data
Break;
R.id.greendao_update: case
Update ();
Break;
R.id.greendao_query: case
NoteList=search ();
/ / data processing
Break;
}

}

Void addNote private () {
NoteText String =.ToString () input_edt.getText ().Trim ();
输入_ edt.settext(“”);
最后dateformat DF = dateformat.getdatetimeinstance(dateformat.medium,dateformat.medium);
“我们如何添加字符串=”+ df.format(New日期());
/ /新建要插入的对象
注注注(null,notetext = new,如何,新的日期());
/ /数据插入
notedao.insert(注);
cursor.requery();
}

<注意>私人列表搜索(){
query query = notedao.querybuilder(的)
.where(notedao.properties.text.eq(ABC))
.orderasc(notedao.properties.date)
.build();
<注意> query.list成绩= list();
Return的成绩;
}
(){ private void更新/用的个人觉得比较简单的更新方式,直接更新对应的note对象
notelist = search();
如果(notelist.size)>(0)){
注注= notelist.get(0);
note.setcomment(“新comment”);
note.setdate(New日期());
note.settext(“text”);
notedao.update(注);
}
}

}
如有不妥,请大家多指教!

作者:true100发表于2016/1/10:56:08原文链接
阅读:121评论:0查看评论
]]>
<![CDATA[[原]JAVA设计模式:组合模式]]> http://prog3.com / sbdm /博客/ true100 /项目/资料/ 50561602 http://prog3.com / sbdm /博客/ true100 /项目/资料/ 50561602 true100 2016年1/22 14:05 52 组合(整体与部分关系):“模式将不同但是相关的对象组合成树形结构以实现部分-整体的层次结构,使得用户对单个对象和组合对象的使用具有一致性”。
*模式角色组成:
* 1.component对象:是组合中的对象接口,是所有类共有的接口.是用于统一定义整体中的部分。
2.leaf对象:整体中的部分,没有下一级。
3.composite对象:用来存储子部件,在component接口中实现与部分有关操作。
以公司构成为例,比如公司有总公司,总公司下有分公司,分公司下有办事处等.构成一个树形结构。

* / *
*抽象类:用来管理子类
*“规范:
*“日期2016年- 1 - 22下午1:16:25
* /
公共的 摘要  公司{
    私人的字符串firmname;/ /公司名称
    公共的 公司(String firmname){
        .firmname = firmname;
}

    公共的丁字裤getfirmname(){
        Returnfirmname;
}

    公共的 无效 setfirmname(String name){
        .firmname = name;
}

    保护区 摘要 无效 附加(公司公司);/ /添加公司如:新增分公司

    保护区 摘要 无效 romove(公司公司);/ /删除公司:如因故关闭分公司

    保护区 摘要 无效 int级);/ /显示公司所在的层级:总公司,分公司,办事处等
}
* / *
*分公司对象
*“规范:
*“日期2016年- 1 - 22下午1:25:43
* /
公共的  branchfirm 扩展 公司{
    私人的list <公司> Clist;

    公共的 branchfirm(String name){
        伟大的(name);
Clist =新的使用<公司>();
}

    “覆盖
    保护区 无效 附加(公司公司){
clist.add(公司);
}

    “覆盖
    保护区 无效 int深度){
StringBuilder某人新的(StringBuilder“”);
        forintI =0;我<深度;I + +){
sb.append(“*”);
}
System.out.println(新的(某人)+丁字裤.getfirmname());
        for(Firm C:Clist){
查看(深度+2);
}
}

    “覆盖
    保护区 无效 romove(公司公司){
        / /待办事项自生成方法存根
clist.remove(公司);
}
}
* / *
* leaf结点类:公司市场部
*“规范:
*“日期2016年- 1 - 22下午1:46:02
* /
公共的  marketdepartment 扩展 公司{
    公共的 marketdepartment(String name){
        伟大的(name);
}

    “覆盖
    保护区 无效 附加(公司公司){
}

    “覆盖
    保护区 无效 int深度){
        / /待办事项自生成方法存根
StringBuilder某人新的(StringBuilder“”);
        forintI =0;我<深度;I + +){
sb.append(“*”);
}
System.out.println(新的(某人)+丁字裤.getfirmname());
}

    “覆盖
    保护区 无效 romove(公司公司){
}
}
* / *
* leaf结点类:公司技术部
*“规范:
*“日期2016年- 1 - 22下午1:21:41
* /
公共的  mintechdepartment 扩展 公司{
    公共的 mintechdepartment(String name){
        伟大的(name);
}

    “覆盖
    保护区 无效 附加(公司公司){
}

    “覆盖
    保护区 无效 int深度){
StringBuilder某人新的(StringBuilder“”);
        forint我=;我<深度;我+ +){
附加(“*”);
}
系统,println(。新的字符串(某人)+getfirmname());
}

    “重写”
    受保护的 无效 (公司){
}
}
公共 试验{
    公共 静态 无效 主要(string [] args){
        / /待办事项自动生成方法存根
坚定的头脑新的branchfirm(“深圳XX集团有限公司”);/ /公司总部
附加(新的市场部(“深圳XX集团有限公司--市场部”);
附加(新的mintechdepartment(“深圳XX集团有限公司--技术部”);
公司jsfirm =新的branchfirm(“深圳XX集团有限公司-江苏分公司”);
jsfirm追加(。新的市场部(“深圳XX集团有限公司-江苏分公司市场部”);
jsfirm追加(。新的mintechdepartment(“深圳XX集团有限公司-江苏分公司技术部”);
公司szfirm =新的branchfirm(“深圳XX集团有限公司-江苏分公司-苏州办事处”);
szfirm追加(。新的mintechdepartment(“深圳XX集团有限公司-江苏分公司-苏州办事处技术部”);
szfirm追加(。新的市场部(“深圳XX集团有限公司-江苏分公司-苏州办事处市场部”);
jsfirm append(szfirm);
        / /如果还需要新增分公司或办事处等,就按照第19-25行操作
append(jsfirm)头;
显示();
}
}
通常:在需要表示对象的整体与部分层次结构或需要忽略组合的整体对象与部分对象的不同,统一地使用整体中的部门情况下来使用组合模式。
作者:true100发表于2016 / 1 / 22 14:05:52原文链接
阅读:207评论:0查看评论
]]>
<![CDATA[[原]JAVA设计模式之:备忘录模式]]> http://prog3.com/sbdm/blog/true100/article/details/50561081 http://prog3.com/sbdm/blog/true100/article/details/50561081 true100 2016 / 1 / 22 12:26:39
  • 备忘录模式:又叫做快照模式,指在不破坏封装性的前提下,获取到一个对象的内部状态,并在对象之外记录或保存这个状态。在有需要的时候可将该对象恢复到原先保存的状态我们相当于把对象原始状备份保留,所以叫备忘录模式。
    *模式角色对象组成:
    1。发起者对象:负责创建一个备忘录来记录当前对象的内部状态,并可使用备忘录恢复内部状态。
    2。备忘录对象:负责存储发起者对象的内部状态,并防止其他对象访问备忘录。
    3。管理者对象:负责备忘录权限管理,不能对备忘录对象的内容进行访问或者操作。
    • 优点:
      1、备忘录模式可以把发起人内部信息对象屏蔽起来,从而可以保持封装的边界。
      2、简化了发起人类。当发起人角色的状态改变的时候,有可能这个状态无效,这时候就可以使用暂时存储起来的备忘录将状态复原。
    • 缺点:
      1、如果状态需要完整地存储到备忘录对象中,那么在资源消耗上面备忘录对象比较昂贵。
      2、当发起者对象的状态改变的时候,有可能这个协议无效。如果状态改变的成功率达不到要求,可以考虑采取”假如”协议模式。
  • * * * *
    *备忘录对象类
    *“描述:
    *“日期2016-1-22上午11:15:59
    *
    公共  memobean{
        私人 int使用寿命;/ /使用时间
        私人字符串的名称;/ /设备名称
        私人 int国家级;/ /状态
        公共 int getusetime(){
            返回使用寿命;
    }
        公共 无效 setusetimeint使用寿命){
            使用寿命:使用寿命;
    }
        公共字符串getdevicename(){
            返回设备名称;
    }
        公共 无效 setdevicename(字符串的名称){
            设备名称=设备名称;
    }
        公共 int getstatelevel(){
            返回国家级;
    }
        公共 无效 setstatelevelint国家级){
            国家=国家;
    }
    
    }
    * * * *
    *备忘录管理对象
    *“描述:
    *“日期2016-1-22上午11:15:25
    *
    公共  memomanager{
    memobean纪念品;
    
        公共memobeangetmemento(){
            返回纪念品;
    }
    
        公共 无效 setmemento(memobean纪念品){
            纪念品纪念品=;
    }
    }
    * * * *
    *发起者对象
    *“描述:
    *“日期2016-1-22上午11:21:18
    *
    公共  memorole{
        私人 int使用寿命;/ /使用时间
        私人字符串的名称;/ /设备名称
        私人 int国家级;/ /状态
    
        公共 memorole(字符串的名称,int使用寿命,int国家级){
            好极 了();
            使用寿命:使用寿命;
            设备名称=设备名称;
            国家=国家;
    }
    
        公共 memorole(){
    }
    
        公共 int getusetime(){
            返回使用寿命;
    }
    
        公共 无效 setusetimeint使用寿命){
            使用寿命:使用寿命;
    }
    
        公共字符串getdevicename(){
            返回设备名称;
    }
    
        公共 无效 setdevicename(字符串的名称){
            设备名称=设备名称;
    }
    
        公共 int getstatelevel(){
            返回国家级;
    }
    
        公共 无效 setstatelevelint国家级){
            国家=国家;
    }
    
        公共memobeancreatememoobject(){
    memobean纪念品=新的memobean();
    纪念setdevicename(设备名称);
    纪念setstatelevel(国家级);
    setusetime(寿命)的纪念品;
            返回纪念品;
    }
    
        公共 无效 setmemento(memobean纪念品){
            getdevicename()。DeviceName =纪念品;
            getstatelevel()。国家=纪念品;
            getusetime()。寿命=纪念品;
    }
    
        * * * *
    *获取对象当前状态
    *“描述:
    *作者LDM
    *“日期2016-1-22下午12:15:09
    *
        公共 无效 getcurrentstate(){
    系统,println(。“当前设备名称:”+设备名称+。“当前使用时间:”+使用寿命+。“当前工作状态:”+国家级);
    }
    }

    测试类

    公共 试验{
    
        公共 静态 无效 主要(string [] args){
            / /新建备忘录发起者对象
    memorole作用=新的memorole(“发电机”);
            / /新建备忘录管理者
    memomanager经理=新的memomanager();
            / /角色初始状态
    系统。println(。“机器开始发电:”);
    getcurrentstate()作用;
            / /利用备忘录模式保存当前状态
    系统。println(。“---保存当前的机器状态---”);
    经理。setmemento(角色。creatememoobject());
    setdevicename(作用。“发电机”);
    setstatelevel(作用。);
    setusetime(作用。一千);
    系统。println(。“已经持续发电1000小时”);
    getcurrentstate()作用;
            / /恢复保存的角色状态
    的作用。setmemento(经理。getmemento());
    系统。println(。“恢复后发电机当前状态:”);
    getcurrentstate()作用;
    }
    
    }
    

    结果:
    机器开始发电:
    当前设备名称:发电机当前使用时间:0当前工作状态:1
    -保存当前的机器状态—
    已经持续发电N小时
    当前设备名称:发电机当前使用时间:1000当前工作状态:5
    恢复后发电机当前状态:
    当前设备名称:发电机当前使用时间:0当前工作状态1
    加粗文字:表示回到了初始状态,起到了备份作用。

    作者:true100发表于2016 / 1 / 22 12:26:39原文链接
    阅读:178评论:0查看评论
    ]]>
    <![CDATA[[原]JAVA设计模式之:建造者模式]]> http://prog3.com/sbdm/blog/true100/article/details/50554714 http://prog3.com/sbdm/blog/true100/article/details/50554714 true100 2016 / 1 / 21 13:45:54
  • 建造者模式:将复杂对象的构造与它的实现相分离,让相同的构建过程可以创建不同的对象。
  • 适用场合:
    复杂对象的算法应该独立于该对象的组成部分或当构造过程允许被构造不同的对象时。
  • 组成角色:
    1创建者(Builder)接口:为创建一个对象的对应部件所指定抽象接口。
    2具体创建者(具体建造者):实现Builder的接口以构造对象的各个部件。
    3具体创建者管理对象(导演):使用Builder接口的对象。
    4复杂产品对象(产品):被构造的复杂对象。
  • * * * *
    *生产汽车:创建者Builder接口
    *“描述:
    *“日期2016-1-21下午1:15:39
    *
    公共 接口 汽车制造厂{
        无效carroof();/ /生产车顶
        无效carbottom();/ /生产车底盘
        无效carwheel();/ /生产车轮
    汽车buildcar();
    }
    * * * *
    *具体创建对象具体建造者:白色汽车
    *“描述:
    *“日期2016-1-21下午1:16:22
    *
    公共  whitecar 实现了 汽车制造厂{
    汽车;
    
        公共 whitecar(){
    汽车=新的car();
    }
    
        “重写”
        公共 无效 carroof(){
    车。设顶板(“制造白色汽车---车顶”);
    }
    
        “重写”
        公共 无效 carbottom(){
    setbottom(汽车。“制造白色汽车---车底”);
    }
    
        “重写”
        公共 无效 carwheel(){
    setwheel(汽车。“制造白色汽车---车轮”);
    }
    
        “重写”
        公共小型车buildcar(){
            / /待办事项自动生成方法存根
            返回汽车;
    }
    }
    * * * *
    *具体创建者管理对象(导演),建造者
    *“描述:
    *作者LDM
    *“日期2016-1-21下午1:17:12
    *
    公共  cardirector{
        公共小型车constructperson(汽车制造厂汽车制造厂){
    汽车制造厂。carroof();
    汽车制造厂。carbottom();
    汽车制造厂。carwheel();
            返回汽车制造厂。buildcar();
    }
    }
    * * * *
    *最终生产的”复杂产品”对象
    *“描述:
    *“日期2016-1-21下午1:22:28
    *
    公共  小型车{
        私人弦顶;/ /车顶
        私人字符串底;/ /车底
        私人串轮;/ /车轮
    
        公共字符串getroof(){
            返回屋顶;
    }
        公共 无效 设顶板(弦屋顶){
            屋顶=屋顶;
    }
        公共字符串getbottom(){
            返回底部;
    }
        公共 无效 setbottom(字符串底部){
            底=底部;
    }
        公共字符串getwheel(){
            返回车轮;
    }
        公共 无效 setwheel(字符串轮){
            轮=车轮;
    }
    }
    

    测试代码:

    公共 试验{
    
        公共 静态 无效 主要(string [] args){
    cardirector cardirector =新的cardirector();
    汽车cardirector constructperson(=。新的whitecar());
    系统。。println(车。getroof());
    系统。。println(车。getbottom());
    系统。。println(车。getwheel());
    系统。println(。“----整个车子就完成了!”);
    }
    }

    打印结果:
    制造白色汽车-车顶
    制造白色汽车-车底
    制造白色汽车-车轮
    整个车子就完成了–--!

    作者:true100发表于2016 / 1 / 21 13:45:54原文链接
    阅读:323评论:0查看评论
    ]]>
    <![CDATA[[原]JAVA设计模式之:命令模式]]> http://prog3.com/sbdm/blog/true100/article/details/50541266 http://prog3.com/sbdm/blog/true100/article/details/50541266 true100 2016 / 1 / 19 11:18:29 *通常情况下:行为请求者与实现者通常呈现一种高度耦合状态有时要对行为进行变更处理处理,高度耦合方式就显得不合适。
    *将行为请求者与行为实现者解耦,将一组行为抽象为对象,实现二者之间的松耦合这就是命令模式(命令模式)。
    *命令模式通常由这几部分组成:命令接口,具体命令(实现命令接口),接受命令的对像,命令控制器等组成。
    *模式的优势:
    1。降低对象之间的耦合度。
    2。新的命令可以很容易地加入到系统中及设计一个组合命令。
    4。实现调用相同方法来实现不同的功能。
    模式的不足之处:
    每一个命令都要设计一个具体的类,命令较多的话,会导致类比较多,系统变得庞大,命令模式的使用效率可能降低。

    * * * *
    *执行命令的接口
    *“描述:
    *“日期2016-1-19上午10:26:04
    *
    公共 接口 orderimpl{
        无效execute();/ /执行方法
    }
    * * * *
    *具体的命令:开空调命令
    *“描述:
    *“日期2016-1-19上午10:28:18
    *
    公共  onorder 实现了 orderimpl{
        私人空调的空气;
        公共 onorder(空调光){
            空气=光;
    }
        “重写”
        公共 无效 执行(){
    open()空气;
    }
    }
    * * * *
    *具体的命令:关空调命令
    *“描述:
    *作者LDM
    *“日期2016-1-19上午10:28:51
    *
    公共  offorder 实现了 orderimpl{
        私人空调的光;
        公共 offorder(空调光){
            光=光;
    }
        “重写”
        公共 无效 执行(){
    光。();
    }
    }
    * * * *
    *具体命令:调节风速
    *“描述:
    *“日期2016-1-19上午11:04:50
    *
    公共  changespeedorder 实现了 orderimpl{
        私人该空调;
        私人 int渠道;
    
        公共 changespeedorder(空调电视,int通道){
    该=电视;
            渠道=渠道;
    }
    
        公共 无效 执行(){
    该updatewind(通道);
    }
    }
    * * * *
    *命令控制器,相当于是遥控器:控制空调的开关,调节风速等
    *“描述:
    *“日期2016-1-19上午10:57:43
    *
    公共  控制{
        私人orderimpl onorder;/ /开
        私人orderimpl offorder;/ /关
        私人orderimpl updatechannel;/ /调节风速
    
        公共 控制(orderimpl onorder,orderimpl offorder,orderimpl updatechannel){
            onorder = onorder;
            offorder = offorder;
            updatechannel = updatechannel;
    
    }
    
        公共 无效 开启(){
    onorder。execute();
    }
    
        公共 无效 岔道(){
    offorder。execute();
    }
    
        公共 无效 changechannel(){
    updatechannel。execute();
    }
    }
    * * * *
    *命令接收者:空调为例
    *“描述:
    *“日期2016-1-19上午10:52:38
    *
    公共  空调{
        公共 intcurrentchannel =/ /当前风速档
    
        公共 无效 打开(){
    系统,println(。“打开空调!”);
    }
    
        公共 无效 关闭(){
    系统,println(。“关闭空调!”);
    }
    
        公共 无效 updatewindint通道){
            currentchannel =通道;
    系统,println(。“更换空调风速档位:”+通道);
    }
    }
    公共 试验{
    
        公共 静态 无效 主要(string [] args){
            / /命令接收者(空调)
    空调民扬=新的aircondition();
            / /开空调命令
    onorder =新的onorder(民扬);
            / /关空调命令
    onorder关=新的onorder(民扬);
            / /换风速命令
    changespeedorder速度=新的changespeedorder(民扬,);
            / /命令控制对象
    控制控制=新的控制(开,关,速度);
            / /开机
    turnon()控制;
            / /切换频道
    changechannel()控制;
            / /关机
    turnoff()控制;
    }
    }

    测试结果:
    打开空调!
    更换空调风速档位:2
    打开空调!

    作者:true100发表于2016 / 1 / 19 11:18:29原文链接
    阅读:188评论:2查看评论
    ]]>
    <![CDATA[[原]JAVA设计模式之:访问者模式]]> http://prog3.com/sbdm/blog/true100/article/details/50524692 http://prog3.com/sbdm/blog/true100/article/details/50524692 true100 2016 / 1 / 15 16:49:19
  • 访问者模式:
    • 一个作用于某对象结构中各元素的操作,使你可以在不改变各元素类数据结构的前提下增加作用于这些元素的新操作。
    • 结构对象是访问者模式必备条件,且这个结构对象必须存在遍历自身各个对象的方法。
    • 适用于:数据结构相对稳定,把数据结构和作用与其上的其它操作解耦,使得操作相对自由。
    • 优点:
    • 1、符合单一职责原则
    • 2、扩展性良好:元素类可以通过接受不同的访问者来实现对不同操作的扩展。
    • 缺点:
    • 1、如果要增加新元素,则会让操作变得更复杂
    • 2、在一定程序上破坏了封装性原则
      *
      访问者械五大角色对象:
      1。游客抽象访问者角色
      2具体访问者角色。具体访问者。
      3元接受访问操作元素
      4.concreteelement具体元素
      5.objectstructure结构对象角色,这是使用访问者模式必备的角色。
  • * * * *
    *抽象访问者:为该对象结构中具体元素角色声明一个访问操作接口。
    *该操作接口的名字和参数标识了发送访问请求给具体访问者的具体元素角色,
    *这样访问者就可以通过该元素角色的特定接口直接访问它。
    *“描述:
    *“日期2016-1-15下午4:00:29
    *
    公共 接口 游客{
        无效访问(元素元素);
    }
    * * * *
    *具体访问者角色,实现游客声明的接口。
    *“描述:
    *“日期2016-1-15下午4:20:46
    *
    公共  具体访问者 实现了 游客{
    
        “重写”
        公共 无效 访问(元素元素){
    员工=(工作人员)元件;
            / /比如:加薪的计算方式:职位*加薪系数+工龄*对应系统之和除以10再乘以现在工资
    系统的getname() + println(E.“要加的薪水是:”+(E. getdegree() *零点八+大肠getworkages() *零点五)/getsalary())*;/ / / /
    }
    }
    * * * *
    *定义一个接受访问操作类,访问者(游客)操作函数的参数。
    *“描述:
    *“日期2016-1-15下午3:58:28
    *
    公共 摘要  {
        公共 摘要 无效 acceppt(访问者);
    }
    * * * *
    *具体元素,实现了抽象元素(元)所定义的接受操作接口。
    *“描述:
    *“日期2016-1-15下午4:04:24
    *
    公共  工作人员 延伸 {
        私人字符串名称;
        私人 工资;
        私人 intworkages;
        私人 int度;
    
        公共 工作人员(字符串名称,工资,intworkages,int度){
            好极了();
            名字=名字;
            ,工资=工资;
            workages = workages;
            度=度;
    }
    
        公共字符串getName(){
            返回姓名;
    }
    
        公共 无效 集名称(字符串名称){
            名字=名字;
    }
    
        公共  getsalary(){
            返回工资;
    }
    
        公共 无效 setsalary工资){
            ,工资=工资;
    }
    
        公共 int getworkages(){
            返回workages;
    }
    
        公共 无效 setworkagesintworkages){
            workages = workages;
    }
    
        公共 int getdegree(){
            返回度;
    }
    
        公共 无效 setdegreeint度){
            度=度;
    }
    
        “重写”
        公共 无效 acceppt(访问者){
    来访者();
    }
    
    }
    
    * * * *
    *结构对象:这是使用访问者模式必备的角色。
    *它具备以下特性:
    *能枚举它的元素;
    *可以提供一个高层接口以允许访问者访问它的元素;
    *如有需要,可以设计成一个复合对象或者一个聚集(如一个列表或无序集合)。
    *“描述:
    *“日期2016-1-15下午4:26:30
    *
    公共  staffobject{
        私人<字符串> HashMap,员工员工;
    
        公共 staffobject(){
    雇员=新的HashMap <字符串>(员工);
    }
    
        公共 无效 添加一个新员工(工作人员){
            如果(!员工。containsKey(E. getname())){
    员工。把(如getname(),E);
    }
    }
    
        公共 无效 removeemployee(工作人员){
            如果(员工。containsKey(E. getname())){
    雇员(电子);
    }
    }
    
        公共工作人员GetEmployee(字符串名称){
            返回雇员(名字);
    }
    
        公共 无效 接受(访客五){
            对于(员工:员工。values()){
    e.acceppt(V);
    }
    }
    }
    

    测试类

    公共 试验{
        公共 静态 无效 主要(string [] args){
    staffobject E =新的staffobject();
    e.addemployee(新的工作人员(“张三”三千女,);
    e.addemployee(新的工作人员(“李四”五千女,);
    e.addemployee(新的工作人员(“王五”八千女,);
    e.addemployee(新的工作人员(“沈七”一万女,);
    e.accept(新的concretevisitor());
    
    }
    
    }
    

    运行结果:
    李四要加的薪水是:1800
    张三要加的薪水是:540
    沈七要加的薪水是:7700
    王五要加的薪水是:4320

    作者:true100发表于2016 / 1 / 15 16:49:19原文链接
    阅读:195评论:0查看评论
    ]]>
    <![CDATA[[原]Android开发中三星手机拍照异常处理]]> http://prog3.com/sbdm/blog/true100/article/details/50519255 http://prog3.com/sbdm/blog/true100/article/details/50519255 true100 2016 / 1 / 14 17:37:51 今天在做开发的时候,遇到了一个比较严重的就是程序中上传图片功能在调用手机拍照时,其它手机都没问题bug。 唯独三星手机(N9008S)拍照时程序直接崩溃三星手机与其它手机拍照时唯一的区别是三星手机在拍照时,手机会切换横竖屏。

    想了想可能是手机横竖屏对活动的生命周期影响导致的,想到了Android:configchanges =“定位| keyboardhidden”这个属性配置。在拍照所在的活动的AndroidManifest. xml中配置了

    <活动
                安卓:名字=“COM。LDM。测试。takephotoactivity”
                安卓:configchanges=“定位| keyboardhidden”/ >

    然后,再拍照果然没问题。
    后来百度补充下知识下,果然是这样的原因。在对应的活动中配置了上面的一行关键代码,当横竖屏切换的时候会直接调用onCreate方法中的onconfigurationchanged方法,而不是重新执行onCreate方法,如果没有使用这个属性就会重新调用onCreate方法了。之前就是因数没有配置这个发生,所以对应的活动调用了onCreate方法,本来拍照返回有数据的,一经过oncreate()方法,肯定变成空啦。
    横竖屏对活动生命周期影响:
    1、未设置活动的Android:configchanges时,横竖屏切换会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次
    2、当设置活动的Android:configchanges =“定位”时,横竖屏切换会重新调用各个生命周期,切横、竖屏时只会执行一次
    3, when the set of activity android:configChanges= orientation|keyboardHidden, horizontal and vertical screen switch is not to call each life cycle, only will execute a method onConfigurationChanged

    Author: true100 published in 17:37:51 2016/1/14Text link
    Read: 31 comments: 0View comments
    ]]>
    <![CDATA[[原]Android网络加载框架:Picasso简介]]> Http://prog3.com/sbdm/blog/true100/article/details/50516846 Http://prog3.com/sbdm/blog/true100/article/details/50516846 True100 13:47:43 2016/1/14 Has not used the Picasso image to load the framework, today with the next, very easy to use, simple to write a note!
    * Android network loading framework: Picasso, open source address:Http://square.github.io/picasso/
    * the framework is developed by Square Android for the development of a set of graphics cache framework to achieve the picture download and cache function
    * merit:
    * can load local and network pictures
    * easy to achieve image transformation operations, such as the size of the change, rotation, etc.
    * when you use ListView in Adapter, you can cancel and recycle the current download operation in Adapter.

    Public Class MainActivity Extends Activity{
        //ImageView control
        PrivateLoader_iv ImageView;
        / / pictures address (a Baidu just to find)
        PrivateUrl= String"Http://www.3lian.com/gif/DetailView.htm? Detail=http://img4.3lian.com/img2005/08/32/200902271952518342.png";
        @Override
        Protected Void OnCreate(savedInstanceState Bundle) {
            Auto-generated method stub / / TODO
            Super.onCreate (savedInstanceState);
    SetContentView (R.layout.activity_main);
    Loader_iv= (ImageView) findViewById (R.id.loader_iv);
    LoadHttpImage ();
    OtherMethod ();
    }
        By using the framework of Picasso / / add network image to ImageView, generally only one line of code can be written
        Private Void LoadHttpImage(1)
    Picasso.with (This(.Load (URL).Into (loader_iv);/ / this put pictures on the URL to loader_iv ImageView on the loading
    }
        Several other commonly used methods of /
        Private Void OtherMethod(1)
            //1, image conversion, convert image size to reduce memory usage
    Picasso.with (This(.Load (URL).Resize () ()Sixty,Sixty(.CenterCrop ().Into () (loader_iv);The 60 is the size of the picture.
            //2, set the picture to load the error when the picture shows
    Picasso.with (This(.Load (URL).Error (R.drawable.ic_launcher).Into (loader_iv) ();
            //3, set the picture to load the kind of picture display
    Picasso.with (This(.Load (URL).Placeholder (R.drawable.ic_launcher).Into (loader_iv) ();
            //3, load the local file image, such as the asserts file under the picture
    Picasso.with (This.load () () ()"File:///android_asset/test.png"(.Into) (loader_iv);
    }
    
    }
    

    Remember to add Picasso related jar packages and network permissions before use.

    Author: true100 published in 13:47:43 2016/1/14Text link
    Read: 222 comments: 2View comments
    ]]>
    <![CDATA[[转]Android开发笔记图片缓存 手势及OOM分析]]> Http://prog3.com/sbdm/blog/true100/article/details/50511586 Http://prog3.com/sbdm/blog/true100/article/details/50511586 True100 16:27:14 2016/1/13 Turn from the original:Http://www.it165.net/pro/html/201601/59439.html#

    The image cache, gestures and OOM three themes put together, is because in theAndroidIn the application development process, these three questions are often linked together. First of all, the big picture needs to be supported by gestures scaling, rotation, translation and other operations; secondly, the picture in the local needs to be cached, to avoid frequent access to the network; finally, the picture (Bitmap) isAndroidLarge memory occupied by the large, involving the big picture and other processing, the memory is very large, a little cautious, the system will be reported OOM error.

    Fortunately, these three topics in the development of Android are more common problems, there are a lot of common open source solutions for this. Therefore, this paper mainly explains the author in the development process used in some third party open source library. The main contents are as follows:

    Image Loader Universal, Picasso, Glide and Fresco contrast and the use of PhotoView, GestureImageView principle and the use of leakcanry memory analysis tool

    A, Image Loader Universal, Picasso, Glide and Fresco of the contrast and use

    Universal image loader (UIL), Picasso, glide and fresco is to load the picture of common third-party libraries in Android, the main package cache memory, disk cache, network request caching, thread pool, abstract image loading process, greatly to avoid memory leaks caused by loading the image, improve the efficiency of image loading. The following is the author of the recent GitHub pages from each library query to the information:

    图片1

    Need to be explained:

    Imageloader is the first open source image cache database. At present, the author has stopped maintenance (11.27); the actual author of Picasso is Jake Wharton square, the field of Android absolute Daniel glide is by Google employees open source, in the Google I / O 2014 official application recommended; fresco image loading not to use the Java heap memory, but anonymous shared memory (Ashmem).

    Attach the GitHub address of each library:

    Image Loader Universal:Https://github.com/nostra13/Android-Universal-Image-Loader.git

    Picasso:Https://github.com/square/picasso.git

    Glide:Https://github.com/bumptech/glide.git

    Fresco:Https://github.com/facebook/fresco.git

    The basic use of the four image cache (HelloWorld) can be achieved through a code, respectively, as follows:

    UIL:

    OneImageLoader.getInstance ().DisplayImage (URL), ImageView);

    Picasso:

    OnePicasso.with (context).Load (URL).Into (imageView) ();

    Glide:

    OneGlide.with (context).Load (URL).Into (imageView) ();

    Fresco:

    OneSimpleDraweeView.setImageURI (URI);

    Careful friends can be seen, Glide and API is very similar to the Picasso. In fact, these four libraries are more similar in the implementation of the core ideas, can be abstracted as the following five modules:

    RequestManager, mainly responsible for the request generation and management module; engine, is mainly responsible for creating the task and the implementation of the scheduling; GetDataInterface, data acquisition interface, mainly used for acquiring image data from the memory cache, disk caching and network; Displayer, mainly used to display pictures, may is ImageView package or other virtual Displayer; Processor, is mainly responsible for the processing of pictures, such as image rotation, compression, and the interception of such operations.

    Say a digression, master all kinds of open-source libraries of the core idea of realizing, you will find a common point of software engineering, is through process formalization and abstraction, and thus improve the efficiency. Whether it is the efficiency of the business, or the efficiency of development, this may also be the core of the software as a science.

         Design and advantages of ImageLoader

    ImageLoader loading process is as follows. (need to declare: the following three flow chart from Trinea, respect the original author copyright)

    图像

    ImageLoader receive the task of loading and displaying pictures, ImageLoaderEngine distribution task, get the picture data, BitmapDisplayer in the ImageAware display.

    ImageLoader a little bit:

    Support download progress monitor can be suspended in the View rolling image loading, through the PauseOnScrollListener interface can be suspended in the View scroll image loading. Default implementation algorithm of multiple memory cache, the image cache can configure caching algorithm, but ImageLoader default implementation of more cache algorithm, such as max size to delete, using at least first delete, least recently used, advanced first removed, the longest to delete. Support local cache file name rule definition

    Design and advantages of Picasso

    Picasso loading process is as follows:

    图像

    Picasso receive the load and display the picture of the task, Dispatcher is responsible for the distribution and processing, through the Handler and MemoryCache to get pictures, through the PicassoDrawable display to the Target.

    Advantages of Picasso:

    Comes with the statistical monitoring function, to support the use of image cache monitoring, including cache hit rate, the use of memory size, the flow of savings, etc.. Support priority processing, each task before scheduling will choose a high priority tasks, such as Banner page in the priority is higher than the Icon when it is applied to the App. Support delay to image size calculation of the completion of loading, the flight mode support, the number of concurrent threads according to the type of network and change, the phone is switched to flight mode, or network types transform will automatically adjust the thread pool maximum number of concurrent, such as WiFi maximum concurrent 4, 3 4G, 3G is 2. Picasso is based on the network type to determine the maximum number of concurrent, rather than the number of CPU cores. "No" local cache, not to say that there is no local cache, but Picasso himself was not achieved, handed over to the square of another network library okhttp to achieve, such benefits is expired time by requesting response header in the cache control and Expired control picture.

        Design and advantages of Glide

    Glide loading process is as follows:

    图像

    Glide receive the task of loading and displaying resources, Engine processing request, through the Fetcher to obtain data, after Transformation processing to Target display.

    Advantages of Glide:

    (1) - > media image cache cache
    Glide is not only a picture cache, it supports Gif, WebP, thumbnail. Even Video, so it should be used as a media cache.

    (2) support priority processing

    (3) consistent with the Activity/Fragment life cycle, support trimMemory
    Glide for each context to maintain a RequestManager, through the FragmentTransaction to maintain a consistent with the Activity/Fragment life cycle, and there is a corresponding trimMemory interface to achieve the call.

    (4) support for okhttp, Volley
    Glide by UrlConnection default access to data, can be used with the okhttp or Volley. Actual Picasso, ImageLoader also supports okhttp, Volley.

    (5) memory friendly
    Glide's memory cache has a active design
    Take the data from the memory cache, unlike the general achieve get, but use remove, then the cached data into a value for a soft reference activeResources map, and counting reference number, in after the completion of the loading picture to judge, if the reference count is empty, the recovery of lost.

    Memory buffer.
    URL with Glide, viewwidth, viewheight, the resolution of the screen as a joint key, the image cache memory in the memory cache, instead of the original image to save size

    Consistent with the Activity/Fragment life cycle, support trimMemory

    The default images using the default RGB565 instead of ARGB888
    Although the definition is poor, but the picture is smaller, but also can be configured to ARGB_888.

    Other: Glide can be passed signature or do not use the local cache support URL expired

    About Fresco

    Fresco library open source late, there is no official version 1. But its function is stronger than the first three libraries, for example:

    Image storage system anonymous shared memory Ashmem (anonymous shared memory) and does not allocate Java heap memory, so to load the picture will not caused by heap memory jitter; JPEG image flow loading (to display the image contour, then slowly clear loading images); more perfect image processing and display; JPEG image local (native) transform size to avoid oom;...

    About the system of anonymous sharing of memory Ashmem, will be in a follow-up article on the use of memory in Android detailed, here only for a brief introduction:

    In the Android system, Ashmem this area of memory does not belong to the Heap Java, it does not belong to Heap Native. When the Ashmem in a memory space like to be released, will be called by the system to inform the unpin. But in fact, the data in this memory space has not been erased. If the Android system memory found tight, will use up to unpin of memory space required to store the data. The memory space is unpin, can be re pin, if the memory space has not been used by other people, it will save the process of re writing data to Ashmem. So, Ashmem this working principle is a kind of delayed release.

    In addition, learning Ashmem can refer toLuo ShengyangMaster blog:

    Android系统匿名共享内存ashmem(匿名共享内存)简要介绍和学习计划Android系统匿名共享内存ashmem(匿名共享内存)驱动程序源代码分析Android系统匿名共享内存ashmem(匿名共享内存)在进程间共享的原理分析

    二、PhotoView、gestureimageview的原理及使用

    需要使用上述第三方开源库进图片加载的一个典型场景是点击查看大图。大图支持手势缩放、旋转、平移等操作,ImageView的手势缩放,有很多种方法,绝大多数开源自定义缩放都是修改了OnDraw函数来实现的。但是ImageView本身有秤类型属性,通过设置Android:秤类型=“矩阵”可以轻松实现缩放功能。缩放的优点是实现起来简单,同时因为没有反复调用OnDraw函数,缩放过程中不会有闪烁现象。另外,需要注意的是,秤类型控制图片的缩放方式,该图片指的是资源而不是背景,换句话说,Android:src=“@冲/ ic_launcher”,而非Android:背景=“@冲/ ic_launcher”。

    在GitHub上可以找到很多开源的实现,这里主要举两个例子进行简单说明。

    地址:https://github.com/bm-x/photoview.git PhotoView

    gestureimageview地址:https://github.com/jasonpolites/gesture-imageview.git

    的介绍PhotoView:

    1。Gradle添加依赖(推荐)

    1。依赖 {
    2。编译的COM。BM PhotoView:图书馆:1.3.6”。
    3。}

    (或者也可以将项目下载下来,将信息。Java和PhotoView。Java两个文件拷贝到你的项目中,不推荐)--这种方式适用于日食。

    2。XML添加

    1。< com.bm.library.photoview
    2。安卓:身份证=“@ +身份证/ IMG”
    3。安卓:layout_width =“match_parent”
    4。安卓:layout_height =“match_parent”
    5。安卓:秤类型=“centerinside”
    6。安卓:SRC =“@冲/ bitmap1” / >

    3。Java代码

    01。PhotoView PhotoView =(PhotoView)findViewById(r.id.img);
    02。/ / / / 启用图片缩放功能
    03。enable() PhotoView;
    04。/ / / / 禁用图片缩放功能(默认为禁用,会跟普通的ImageView一样,缩放功能需手动调用enable()启用)
    05。disenable() PhotoView;
    06。/ / / / 获取图片信息
    07。信息 信息= getinfo() PhotoView;
    08。/ / / / 从一张图片信息变化到现在的图片,用于图片点击后放大浏览,具体使用可以参照演示的使用
    09。PhotoView animafrom(信息);
    10。/ / / / 从现在的图片变化到所给定的图片信息,用于图片放大后点击缩小到原来的位置,具体使用可以参照演示的使用
    11。PhotoView活跃(信息,新的 runnable() {
    12。“重写”
    13。公共 无效 run() {
    14。/ /动画完成监听
    15。}
    16。});
    17。/ / / / 获取动画持续时间
    18。int D = getdefaultanimaduring() PhotoView;

    PhotoView实现的基本原理是在继承于ImageView的PhotoView中采用了缩放矩阵及手势监听。

    01。公共  PhotoView延伸 ImageView {
    02。 
    03。......
    04。 
    05。私人 矩阵 mbasematrix =新的 matrix();
    06。私人 矩阵 manimamatrix =新的 matrix();
    07。私人 矩阵 msynthesismatrix =新的 matrix();
    08。私人 矩阵 mtmpmatrix =新的 matrix();
    09。 
    10。私人 rotategesturedetector mrotatedetector;
    11。私人 gesturedetector mdetector;
    12。私人 scalegesturedetector mscaledetector;
    13。私人 onclicklistener mclicklistener;
    14。 
    15。私人 秤类型 mscaletype;
    16。 
    17。......
    18。}

    PhotoView的实现与上述原理基本一致,这里不再赘述对于自定义控件的实现,后续文章会进行详细的分析。

    gestureimageview的简介如下:

    1。配置为视角layout.xml

    代码:

    01。<元素
    02。xmlns:Android =http://schemas.android.com/apk/res/android
    03。xmlns:手势图像=http://schemas.polites.com/android
    04。安卓:layout_width =“fill_parent”
    05。安卓:layout_height =“fill_parent”>
    06。 
    07。< com.polites.android.gestureimageview
    08。安卓:身份证=“@ +身份证/形象”
    09。安卓:layout_width =“fill_parent”
    10。安卓:layout_height =“wrap_content”
    11。安卓:SRC =“@冲/图像”
    12。手势图像:最小比例=“0.1”
    13。手势图像:最大规模=“10”
    14。手势图像:严格=“假”/ >
    15。 
    16。< /元素>

    2配置程序。

    代码:

    01。进口 com.polites.android.gestureimageview;
    02。 
    03。进口 android.app.activity;
    04。进口 android.os.bundle;
    05。进口 android.view.viewgroup;
    06。进口 android.widget.linearlayout.layoutparams;
    07。 
    08。公共  sampleactivity延伸 活动 {
    09。“重写”
    10。公共 无效 onCreate(Bundle savedinstancestate){
    11。好极 了onCreate(savedinstancestate);
    12。setContentView(r.layout。主);
    13。 
    14。LayoutParams 参数=新的 (layoutparams.wrap_content LayoutParams, LayoutParams wrap_content);
    15。 
    16。gestureimageview 查看=新的 gestureimageview();
    17。的观点。setimageresource(r.drawable。图像);
    18。setlayoutparams(参数)的观点;
    19。 
    20。ViewGroup 布局=(ViewGroup)findViewById(r.id.layout);
    21。 
    22。布局addView(View);
    23。}
    24。}

    原理基本同PhotoView一致,不再赘述。

    三、OOM分析工具-- leakcanary

    leakcanary的介绍:

    安卓和爪哇的内存泄漏检测库。

    可见,leakcanary主要用于检测各种内存不能被GC,从而导致泄露的情况。

    leakcanary的地址https://github.com/square/leakcanary.git

    演示地址:

    http:/ / GitHub。COM / liaohuqiu / leakcanary演示Git(AS)。

    http:/ / GitHub。COM / teffy / leakcanarysample月食。Git(Eclipse)

    下面是演示中testactivity中的TextView被静态变量引用导致无法回收引起的内存泄露的截图。

    device-2016-01-07-162003

    leakcanary的使用较为简单,首先添加依赖工程:

    1。依赖 {
    2。debugcompile的COM。squareup。leakcanary:leakcanary Android 1.3
    3。releasecompile的COM。squareup。leakcanary:leakcanary Android无操作:1.3
    4。}

    其次,在应用的oncreate()方法中进行初始化。

    1。公共  延伸 应用 {
    2。 
    3。“重写” 公共 无效 oncreate() {
    4。好极 了oncreate();
    5。leakcanary。安装();
    6。}
    7。}

    经过这两步之后就可以使用了。leakcanary。安装(这)会返回一个预定义的refwatcher,同时也会启用一个activityrefwatcher,用于自动监控调用活动。ondestroy()之后泄露的活动。如果需要监听片段,则在片段的ondestroy()方法进行注册:

    1。公共 摘要  basefragment延伸 片段 {
    2。 
    3。“重写” 公共 无效 ondestroy() {
    4。好极 了ondestroy();
    5。refwatcher refwatcher =出getrefwatcher(getactivity());
    6。refwatcher看(。);
    7。}
    8。}

    当然,需要对某个变量进行监听,直接对其进行看即可。

    1。refwatcher refwatcher = {…};
    2。 
    3。/ / / / 我们预计schrodingercat就会消失(或没有),让我们看它。
    4。refwatcher手表(schrodingercat);

    需要注意的是,在Eclipse中使用leakcanary需要在AndroidManifest.xml文件中对堆占用分析以及展示的服务进行申明:

    01。<服务
    02。安卓:名字=“COM。squareup。leakcanary。内部。heapanalyzerservice”
    03。安卓:启用=“假”
    04。安卓:进程=“:leakcanary” / >
    05。<服务
    06。安卓:名字=“COM。squareup。leakcanary。displayleakservice”
    07。安卓:启用=“假” / >
    08。 
    09。<活动
    10。安卓:名字=“COM。squareup。leakcanary。内部。displayleakactivity”
    11。安卓:启用=“假”
    12。安卓:图标=“@冲/ leak_canary_icon”
    13。安卓:标签=“@字符串/ leak_canary_display_activity_label”
    14。安卓:taskAffinity =“COM。squareup。leakcanary”
    15。安卓:主题=“@风格/ leak_canary_leakcanary。基地” >
    16。<意图筛选器>
    17。<行动 安卓:名字=“安卓,意图,行动” / >
    18。 
    19。<类别 安卓:名字=“安卓,意图,分类” / >
    20。< /意图筛选器>
    21。<活动>

    注意:heapanalyzerservice采用了多进程Android的过程=“:leakcanary”。

    上述开源工具的使用都较为简单,关于详细使用,请参考其GitHub地址。

    四、一些杂乱的总结

          内存泄露的常见原因:

    静态对象:监听器,广播,WebView;这0美元:线程,定时器,处理程序;系统:文本行,输入法,音频

          兜底回收内存:

    Activity leaks will lead to reference the activity Bitmap/DrawingCache cannot release and recovery of all the details is refers to the activity has leaked to the resources held by the recovery. Starting from the rootview in ondestroy. Recursive release relates to all sub VIew pictures, background, DrawingCache, and the listener resources.

          Method for reducing Runtime memory:

    Reduce the memory occupied by bitmap: 1) to prevent the bitmap occupied resources are too large, 2.x system to open the inNativeAlloc BitmapFactory.Options; 4.x system using fresco Facebook library, the image of the native in the. 2) picture to load, the size of the picture should not exceed the size of view. 3) bitmap loader unified: Picasso/Fresco. 4) image pixel waste. Own memory occupancy monitoring: 1) to achieve the principle: Runtime access to maxMemory, and totalMemory-freeMemory that is currently the real use of Dalvik memory. 2) mode of operation: regularly check this value, reaching 80% on the release of a variety of cache resources (CACHE bitmap) using the multi process. For WebView, gallery, etc., due to the presence of memory system leaks, you can use a separate process.
    Author: true100 published in 16:27:14 2016/1/13Text link
    Read: 36 comments: 0View comments
    ]]>
    <![CDATA[[原]Android网络图片加载框架:Universal-ImageLoader简介]]> Http://prog3.com/sbdm/blog/true100/article/details/50505440 Http://prog3.com/sbdm/blog/true100/article/details/50505440 True100 17:05:03 2016/1/12
  • Network image loading framework: Universal-ImageLoader
    • GitHub open source address:Https://github.com/nostra13/Android-Universal-Image-Loader
    • characteristic
    • Support local images, web images, multi thread asynchronous loading and caching
    • Load images according to their own project personalized configuration ImageLoader
    • Image loading process listening, you can pause the picture to load, reload, etc.
    • Automatic processing of pictures according to the current memory situation, to prevent the OOM
    • Imperfections: there is no correlation method for local file compression processing, the default is the Src model to set the picture, there is no picture of the Background property open API
      use
  • / * *
    When using the universal-imageloader framework, the Application is initialized and configured.
    *@description:
    *@date2016-1-12 PM 4:18:34
    * /
    Public Class MyApplication Extends Application{
        @Override
        Public Void OnCreate(1)
    InitConfiguration ();
    }
    
        / * *
    * initialization of ImageLoaderConfiguration, usually do not need to set so many properties
    *@description:
    *@authorLDM
    *@date2016-1-12 PM 4:42:31
    * /
        Private Void InitConfiguration(1)
    Config ImageLoaderConfiguration =NewImageLoaderConfiguration.Builder (This.memoryCacheExtraOptions () () ()Four hundred and eighty,Eight hundred)Set the memory cache file / / maximum length and width
    .diskCacheExtraOptions (Four hundred and eighty,Eight hundred,Null)The detailed information provided / / local cache (cache the maximum length and width), it is best not to set this
    .threadPoolSize (Three)/ / set number loaded in the thread pool
    .threadPriority (Thread.NORM_PRIORITY -Two)/ / set the current thread priority
    .tasksProcessingOrder (QueueProcessingType.FIFO)/ / set cache strategy
    .denyCacheImageMultipleSizesInMemory ()/ / set buffer display with a picture of different size
    .memoryCache (NewLruMemoryCache (Two*One thousand and twenty-four*One thousand and twenty-four))/ / set to achieve their through memory cache
    .memoryCacheSize (Two*One thousand and twenty-four*One thousand and twenty-four)/ / set the maximum memory cache
    .memoryCacheSizePercentage (Thirteen)Set the maximum size of the memory cache / percentage of the current application of available memory, the default is the current application of available memory 1/8
    .discCache (NewUnlimitedDiskCache (NewFile (Environment.getExternalStorageDirectory) +"Mydata/imagecaches")))/ / set the cache file directory
    .diskCacheSize (Fifty*One thousand and twenty-four*One thousand and twenty-four)Set / / SD card (local) maximum 50M cache
    .diskCacheFileCount (One hundred)The number of cache files can set / /
                    / /.DiskCacheFileNameGenerator (New Md5FileNameGenerator) (URL) with MD5 encryption settings
    .imageDownloader (NewBaseImageDownloader (This))/ / set the default maximum connection time
    .imageDecoder (NewBaseImageDecoder (False))/ / default
    .defaultDisplayImageOptions (getDisplayOptions ())/ / set custom DisplayImageOptions
    writedebuglogs()。/ /设置打印日志
    build();/ /开始构建
    imageloader。getinstance() init(config);
    }
    
        * * * *
    *自定义displayimageoptions
    *“描述:
    *“日期2016-1-12下午4:46:47
    *
        私人displayimageoptionsgetdisplayoptions(){
    displayimageoptions选项=新的displayimageoptions。builder()。showimageonloading(r.drawable。ic_launcher)/ /设置图片在下载中显示的图片
    。showimageforemptyuri(r.drawable。ic_launcher)/ /设置图片URI为空或错误时显示的图片
    。showimageonfail(r.drawable。ic_launcher)/ /设置图片加载失败时候显示的图片
    cacheinmemory(。真正的/ /设置下载的图片是否缓存在内存中
    cacheondisk(。真正的/ /设置下载的图片是否缓存在SD卡中
    considerexifparams(。真正的/ /是否考虑EXIF JPEG图像参数(旋转,翻转)
    。imagescaletype(imagescaletype。in_sample_int)/ /设置图片以如何的编码方式显示
    。bitmapconfig(位图。配置。rgb_565)/ /设置图片的解码类型
    delaybeforeloading(。/ /设置的下载前的延迟时间
    resetviewbeforeloading(。真正的/ /设置图片在下载前是否重置,复位
    显示器(。新的roundedbitmapdisplayer(二十/ /设置为圆角,弧度为多少,不推荐用!
    显示器(。新的fadeinbitmapdisplayer(一百/ /设置加载好后渐入的动画时间,可能会出现闪动
    build();/ /构建完成
            返回选项;
    }
    }
    在活动中使用:

    这里写代码片

    公共  主要活动 延伸 活动{
        私人loader_iv ImageView;
        私人imageloader装载机;
        私人字符串网址=“”“重写”
        受保护的 无效 onCreate(束savedinstancestate){
            / /待办事项自动生成方法存根
            好极了onCreate(savedinstancestate);
    setContentView(r.layout。activity_main);
    loader_iv =(ImageView)findViewById(r.id.loader_iv);
    装载机。DisplayImage(URL,loader_iv);/ /装载机。DisplayImage有很多参数不同的方法,方便我们针对不同情况使用
            / /如果显示本地图片
    网址=“文件:/ /”+“文件路径”;
    装载机。DisplayImage(URL,loader_iv);
    }
    }

    最后不要忘记在AndroidManifest. xml中配置MyApplication及网络请求权限更多方法正在学习中意图。

    作者:true100发表于2016 / 1 / 12 17:05:03原文链接
    阅读:31评论:0查看评论
    ]]>
    <![CDATA[[原]Android网络请求框架:Android-async-http简单使用]]> http://prog3.com/sbdm/blog/true100/article/details/50498513 http://prog3.com/sbdm/blog/true100/article/details/50498513 true100 2016 / 1 / 11 17:26:20 Android异步HTTP网络框架:https://github.com/loopj/android-async-http
    *是一款高效的数据请求,文件上传下载网络请求开源框架。
    *优点:
    *网络请求回调清晰,易操作
    *请求使用线程池treadpool,限制并发请求资源使用
    *,后等常用请求基于参数构建使用,传递参数方便
    *多文件上传下载等。
    使用比较简单,但其功能非常强大,还需要在使用中不断挖掘,简单使用举例:

    公共  主要活动 延伸 活动{
    
        “重写”
        受保护的 无效 onCreate(束savedinstancestate){
            好极了onCreate(savedinstancestate);
    setContentView(r.layout。activity_main);
            / /使用得到请求
    http_get();
            / /使用后请求
    http_post();
    }
    
        私人 无效 http_get(){
            / /网络请求的连接地址,xxxxxxxx指你在聚合API中申请的关键值
    字符串网址=“http://apis.juhe.cn/mobile/get?电话= 13429667914 = xxxxxxxx”关键;
    asynchttpclient客户端=新的asynchttpclient();
    客户(网址,新的asynchttpresponsehandler() {
                “重写”
                公共 无效 会在int状态码,头[ ]头,
                        字节结果){/ /网络请求成功处理
    登录。“激光”新的字符串(结果));
    }
    });
    
    }
    
        私人 无效 http_post(){
            / /用后要把得到请求后面的字段用参数的方式过去
    字符串网址=“HTTP:/ / API。沮。CN /移动/得到?”;
    Client AsyncHttpClient =NewAsyncHttpClient ();/ / create asynchronous request client object
    URL String ="Http://172.16.237.200:8080/video/login.do";The definition of the address / / request
            / / object creation request parameters package
    Params RequestParams =NewRequestParams ();
    Param.put ("Phone","13429667914");/ / phone parameters
    Param.put ("Key","Xxxxxxxx");Key: / / parameters in the polymerization of API website for key
            / / post method
    Client.post (URL, params,NewAsyncHttpResponseHandler () {
                @Override  
                Public Void OnSuccess(IntHeader[], headers statusCode,
                        Byte{result [])
                    If(statusCode = =Two hundred{)/ / request successful treatment
    (Log.e"Ldm",NewString (result);
    }
    }
    
                @Override  
                Public Void OnFailure(IntHeader[], headers statusCode,
                        Byte[] responseBody, Throwable error) {/ / request failure handling
    (Log.e"Ldm"Error.printStackTrace ().ToString () () ();The error message is printed / track
    }
    });
    }
    }
    
    We can make a simple package for AsyncHttpResponseHandler, of course, we can according to their own needs of the project package, to facilitate the development of the project.
    Public Abstract Class NetHttpHandler Extends AsyncHttpResponseHandler{
        @Override
        Public Void OnStart(1)
    (Log.e"Ldm","The network request starts, we can use the load box prompt");
            Super.onStart ();
    }
        @Override
        Public Void OnFailure(IntHeader[], arg1 arg0,Byte[] arg2, Throwable ARG3) {
    (Log.e"Ldm","The request failed and the failure process was performed");
    RequestFail (AGR3);
            Super.onFailure (arg0, arg1, arg2, ARG3);
    }
        @Override
        Public Void OnSuccess(IntHeader[], arg1 arg0,Byte{arg2 [])
    (Log.e"Ldm","Request success and data processing after success");
    RequestSuccess (NewString (arg2);
            Super.onSuccess (arg0, arg1, arg2);
    }
        Public Abstract Void RequestSuccess(result String);/ / success callback request
        Public Abstract Void RequestFail(error Throwable);/ / callback request failed
    
    }

    We change the above AsyncHttpResponseHandler into our NetHttpHandler, in the requestSuccess () and requestFail () method to carry on the logic processing to be able to.

    Author: true100 published in 17:26:20 2016/1/11Text link
    Read: 127 comments: 0View comments
    ]]>
    <![CDATA[[原]Android网络请求框架:Volley简单使用]]> Http://prog3.com/sbdm/blog/true100/article/details/50495567 Http://prog3.com/sbdm/blog/true100/article/details/50495567 True100 10:51:16 2016/1/11 Volley framework: the 2013 I/O Google conference, Volley released. Volley is the official Google cloth for Android Platform of network communication, the purpose is to make the network communication faster, simpler and more robust. Gitthub open source address: https://github.com/stormzhang/AndroidVolley

    * features:
    * Internet communication is faster, simpler and more robust.
    * Get, POST and other commonly used network requests and image efficient asynchronous processing
    * multiple network requests can be prioritized, and multiple level cancel request operations can be performed.
    * network request cache
    * you can interact with the Activity life cycle
    * disadvantages: not suitable for large data and streaming media data transmission network requests, such as video download, download files, etc..
    * use step:
    * 1, create a request queue
    * 2, add the request to the queue
    * 3, send a request with GET or POST (passing parameter)
    * 4, corresponding logical processing in the callback of the result of the request
    * -- -- -- -- -- -- --
    * Volley request provides three types of requests:
    * StringRequest returns the data type: String, this article's example is taking this as an example
    * JsonObjectRequest returns the data type: JsonObject
    * JsonArrayRequest returns the data type: JsonArray

    / * *
    * define global Application, configure the Volley and android-async-http framework here
    *@description:
    *@date2016-1-11 am 9:59:17
    * /
    Public Class GlobalApplication Extends Application{
        /*Volley network **/ request queue
        Public StaticMQueue RequestQueue;
        @Override
        Public Void OnCreate(1)
            Auto-generated method stub / / TODO
            Super.onCreate ();
    MQueue=Volley.newRequestQueue (This);/ / initialize request queue
    }
        **/ / foreign get queue object method
        Public StaticRequestQueueGetVolleyQueue(1)
            ReturnMQueue;
    }
    }

    Activity in the use of get post and Volley network request:

    公共  主要活动 延伸 活动{
    
        “重写”
        受保护的 无效 onCreate(束savedinstancestate){
            好极 了onCreate(savedinstancestate);
    setContentView(r.layout。activity_main);
            / /使用凌空的得到请求
    getbyvolley();
            / /使用凌空的后请求
    postbyvolley();
    }
    
        私人 无效 postbyvolley(){
    字符串网址=“HTTP:/ / API。沮。CN /移动/得到?”/ /用后要把得到请求后面的字段用参数的方式过去
    stringrequest请求=新的stringrequest(方法后,URL,新的听众<字符串>(){
    
                “重写”
                公共 无效 响应(字符串响应){/ /请求成功返回的数据
    日志。“激光”,反应);
    }
    },新的errorlistener() {响应。
    
                “重写”
                公共 无效 onerrorresponse(volleyerror误差){/ /请求失败的处理
    maketext(MainActivity干杯。“请求失败”,烤面包。length_short show());
    }
    
    }){
                “suppresswarnings“未经检查”“重写”
                受保护的图<字符串,字符串>getparams()抛出authfailureerror {/ /传递参数的方法
    图<字符串,字符串>参数=新的HashMap <>();
    把(参数。“电话”“13429667914”);
    把(参数。“钥匙”“xxxxxxxx”);
                    返回参数;
    }
    };
    settag(请求。“后”);
    globalapplication。getvolleyqueue()添加(请求);/ /把请求添加到队列中
    }
    
        私人 无效 getbyvolley(){
           / /网络请求的连接地址,xxxxxxxx指你在聚合API网站申请的对应的关键值
    字符串网址=“http://apis.juhe.cn/mobile/get?电话= 13429667914 = xxxxxxxx”关键;
    stringrequest请求=新的stringrequest(方法,URL,新的听众<字符串>(){
    
                “重写”
                公共 无效 响应(字符串响应){/ /请求成功返回的数据
    日志。“激光”,反应);
    }
    },新的errorlistener() {响应。
    
                “重写”
                公共 无效 onerrorresponse(volleyerror误差){/ /请求失败的处理
    maketext(MainActivity干杯。“请求失败”,烤面包。length_short show());
    }
    });
    settag(请求。“得到”);
    globalapplication。getvolleyqueue()添加(请求);/ /把请求添加到队列中
    }
        / /在活动的生命周期onStop中取消标签为”获得“对应请求
        “重写”
        受保护的 无效 onStop(){
            / /待办事项自动生成方法存根
            好极 了onstop();
    globalapplication。getvolleyqueue() cancelall(。“得到”);
    }
    }

    最后不要忘记在AndroidManifest. xml中配置网络权限:

    作者:true100发表于2016 / 1 / 11 10:51:16原文链接
    阅读:33评论:0查看评论
    ]]>