精华内容
下载资源
问答
  • iOS 开发中的总结,小技巧,小思路拓展,如有不当之处欢迎指正

    声明:本文以下内容均摘自笔者从初学阶段至今的日常笔记,仅供学习交流参考,难免有些理解偏差,欢迎指出

    1.badgeVaule气泡提示,self.navigationController.tabBarItem.badgeValue

    2.git终端命令方法> pwd查看全部 >cd>ls >之后桌面找到文件夹内容,以cd xxxx ,ls格式>git status查看>git pull origin master从网上储存库中下下来。 返回上一级地址命令cd ..

    3.全球最大开源代码托管平台——SourceForge

    4.sections更改数量可使tableview分量

    5.static cells静态tableview

    6.nothing to commit, working directory clean 表示上传Git成功

    7.git提交步骤

    • git add . //此处add后加空格.

    • git commit -m "xxx"

    • git pull origin master //更新代码

    • git push origin master //提交

    8.Identifier是写在navigation上边的

    9.AF的方法中全部属于异步下载。

    10.无论使用collectionView还是tableView的自定义cell,都需要先在viewDidLoad中注册cell

    11.可以使用mac自带的数码测色计来获取颜色的RGB值

    12.例子:
    indexPath.row==0 && indexPath.section==1
    不同的section中的indexpath的row是会归0重置的,从0开始重头计

    13.代理协议写在m文件即可,不用过多的暴露在头文件中

    14.radioButton的图片更改方法,不用代码实现,在button的State 。cc。oo。nn。ff。ll。gg。中选择Default为未点击时状态,可赋予图片,选择selected为选中时状态,可赋予图片,直接使用imageView的方法是不专业的

    15.在button的中选择Default为未点击时状态,,直接使用imageView的方法是不专业的。

    16.textView加边框

    #import <QuartzCore/QuartzCore.h>    
    textview对象.layer.borderColor = UIColor.grayColor.CGColor;
    textview对象.layer.borderWidth = 5;
    self.textView.layer.masksToBounds = YES;
    self.textView.layer.cornerRadius = 5;
    

    17.ruby -e "$(curl -fsSL https://raw.githubusercontent...)" //下载安装git插件

    18.scrollView可以专门用来自动处理键盘布局,但需要嵌入代码

    19.有造好的轮子就要用,不要傻乎乎的想要自己去造,理解就可以了,闲暇时间自己研究,工作当中效率进度第一

    20.alloc之后几乎全是init方法

    21. if(indexPath.row==2 && indexPath.section==0){//row表示在一个section下顺序第几个,section表示第几个section

    22.区别:

    -(void)viewDidLoad//加载后调用
    -(id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil//进入后就调用
    

    23.git比svn要强大

    24.@property (assign,nonatomic) BOOL hONG; //bool型只能用于状态判断,只有yes和no,非黑即白 assign表示弱类型的赋值 nonatomic会有先后顺序 简单变量是assign,指针变量是strong
    //@property的意思是属性,类似于c++的一个成员变量,在oc中成为一个类的属性
    @implementation具体方法的实现

    25.来记个方法,这是针对不同类型的初始化方法

    //push界面之前的初始化方法,该方法是在push  xib类型界面之前进行初始化的方法
    LSIntegralShopViewController * integrelShopViewController =[[LSIntegralShopViewController alloc]initWithNibName:@"LSIntegralShopViewController" bundle:nil];  //这里那个nibName是写的那个controller的对应的那个类
    
    //针对toryboard的初始化方法
    [WPUtil getViewControllerWithIdentifier: storyboardName:]  //此处Identifier是storyboard上的Identifier ID,而UINavigationController * homeNavigationController = [WPUtil getViewControllerWithIdentifier:@"homeNavigation" storyboardName:@"Home"];这里的Identifier则是Navigation上的ID,注意区分
    

    26.上下bar的地方切图使用时,后缀加上@2x,注意是在.png前使用,同时图盘拖到2x那格中

    27.2x图片清晰度更高

    28.已经在界面上都配置好了,代码里面就不需要这些设置了
    只需处理点击事件,比如选中第一个,第一个button.selected = YES,其他两个button.selected = NO

    29.UIButton的edge可以调整image和title

    30.[self.view endEditing:YES]; //直接撤销键盘的方法

    31.manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"text/html", nil];//默认为json格式,若为json可省略这行代码

    32.+方法写在头文件中,谁都可以调用,只要引用其头文件名称,如viewController是可以在任何地方初始化任意次的

    33.使用最底部或最上部的UIButton或某个控件来支撑住scrollview,来让scrollview知晓其最大距离

    34.NSUInteger表示无符号整型,即非负数

    35.严格按照流程来,先在外边,比如说美工发给你的图片,把名字改好,xxx@2x.png,然后再拖进去,还有,文件名不要出现空格,这些有空格的通通改掉,把有问题的全部删了,重新加

    36.至于重写set和get方法,简要说明一下,当我们使用@property这用法之后,系统便会自动给我们定义的变量以一个默认的set和get方法。插一句,_any和self.any的区别,_any就是只指_any本身,是系统会生成的,而如果我们重写了any的set方法后,self.any会调用我们重写的set方法中的内容,而_any不是,比如这句

    -(void)setCount:(NSUInteger)count
    {
        _count = count;
    }
    

    这里表示的是将系统默认给我们生成的count变成我们自定义的count,达到我们想要的目的。_any就是单单指当我们使用@property后系统给我自动生成的一个any,而self.any不同,它会自动调用(set和get方法本身就包含在其中,也可以理解为就是它自身的一个属性一部分)我们重写后的set方法,当我们self.any的时候,其中重写的set方法中的任何内容都会被我们使用,所以即使我们只self.any,也可实现许多只要set方法中写出的效果,大致是这个意思

    37.推荐使用代理传值,通知的观察者模式效率低下

    38.cell控制视图显示,controller负责网络解析

    39.取数据的时候,要看返回的数据是什么样子的,需要两个就两个,需要一个就一个

    data =     {
        CurrentPageIndex = 1;
        PageSize = 10;
        TotalItemCount = 1;
        TotalPageCount = 1;
        data =         (
                        {
                ClickNumber = 0;
                ID = 1796;
                Norm = "\U6876";
                Picture = "/upload/goods/default.jpg";
                SellerRetailPrice = 10;
                TheSorting = 12500000;
                TypeID = 22;
                goodsName = "\U51b0\U51b0\U4e50";
                goodsTypeName = "\U7eaf\U51c0\U6c34";
                sellerId = 125;
                sellerName = "\U51e4\U51f0\U57ce\U6c34\U5e97";
                sellerState = 1;
            }
        );
    };
        msg = "<null>";
        result = ok;
    }
    

    第一个data取的是里面的一大堆即一个字典,第二个data才是个数组,@"data"这个大体是指前一个data是拿到一个字典的数据,第二个data是那里面的数组咯

    40.不要直接用button或控件push到下一个界面,尤其是在tableView的cell上

    41.shopTVC.delegate = self;//上一个界面的代理设为这个界面自身,在上一个见面中调用代理的时候,因为上一个界面的代理已经被设置为这个界面,所以在上一个见面中调用其自身代理时,实际上是这个界面在执行

    42.没有了summary,但是原来的summary的功能可以在targets的general里面找到

    43.关于尝试新方法,比如:将字典中的值赋值给一个float,有时候.不行可以换( ) 或 ]试试看有没有其方法

    float left= [aaa[@"abc"] floatValue];
    

    44.else if (self.btnOfAddress.selected){ //点了之后立马又弹回去了,当执行的时候按钮状态已经弹回去了,如果需要一直是点击状态那么你需要设置selected=YES,这是状态是需要设置的,不然就不会有效果,需要是选中状态,那么你就要在合适的位置设置起,btn.selected = YES

    45.总之,要看他数据需要什么,保存的是哪里

    46.本着,谁分配谁管理的原则

    47.thread:breakpoint 1.2,在该行最左侧的蓝色矩形区域右键,选择delete breakpoint即可。

    48.逻辑步骤关系,所有异步都要先完成数据的请求,成功后,返回数据信息后才开始跳转界面,换句话说,需要将需要提交的数据全部获取到之后,再做统一提交处理

    49.所有网络请求都用异步,上传提交也叫下载,只不过下载的内容可能就是个提示性的东西,提示你提交成功没有

    50.字符串比较用isEqualToString,不用等号, ]是调方法 ( )是优先级

    51.提交输入框信息,需要在解析数据时获取,而不能在初始化时就去获取

    52.断点不是只能在运行前设置,在运行当中也可以设置

    53.一切都以数据为中心,先拿到数据,再显示页面。比如tableView是先得到返回行数,再执行的cell显示,白话讲就是,点击了左边的cell选中后,开始解析,由于在解析时保存了数据,这样返回行就有了数据,这时就会返回显示返回行数目的数据,这样一来便可以在cell中显示

    54.异步下载中间的代码是异步的,要执行,但是不是马上执行,网络有数据返回的时候

    55.然而机智如我,合理运用函数参数名赋予的作用

    -(void)setSelected:(BOOL)selected animated:(BOOL)animated {
        [super setSelected:selected animated:animated];//这个函数是当cell被点击的时候调用的方法,最好不要用作初始化的地方
        if(selected == YES){
            self.buttonOfDetailed.hidden=NO;
        }else{
            self.buttonOfDetailed.hidden=YES;
        }
    
        // Configure the view for the selected state
    }
    
    

    56.tableView的cell重复相应点击的问题可能是在Table View这一栏选项中关于Selection的选择问题,一般单次响应点击会选择Single Selection这一选项

    57.这个方法只有在手指点击cell,然后离开后才调用,而不是点击的时候就调用

    -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath;
    

    58.tableView果然是用到最多最多的,无处不在,以各种各样你想象不到的方式出现,给你一种似乎任何效果都可以用它来实现出来的内心的震撼

    59.command+3(2,1)调节模拟器放大尺寸

    60.swift注意:如果你的代码中有不需要改变的值,请使用let关键字将它声明为常量。只将需要改变的值声明为变量。

    61.swift中,常量的值一旦设定就不能改变,而变量的值可以随意更改。常量和变量必须在使用前声明,用let来声明常量,用var来声明变量。
    常量和变量必须在使用前声明,用let来声明常量,用var来声明变量。下面的例子展示了如何用常量和变量来记录用户尝试登录的次数:

    let maximumNumberOfLoginAttempts = 10
    var currentLoginAttempt = 0
    

    这两行代码可以被理解为:

    “声明一个名字是maximumNumberOfLoginAttempts的新常量,并给它一个值10。然后,声明一个名字是currentLoginAttempt的变量并将它的值初始化为0.”

    在这个例子中,允许的最大尝试登录次数被声明为一个常量,因为这个值不会改变。当前尝试登录次数被声明为一个变量,因为每次尝试登录失败的时候都需要增加这个值。

    你可以在一行中声明多个常量或者多个变量,用逗号隔开:

    var x = 0.0, y = 0.0, z = 0.0
    

    62.initWithNibName是加载View视图事件

    63.关于界面适配的问题,一个是对于底部tabbar所留下的空白的处理方法:

    //隐藏底部tabbar留下的空白
    self.hidesBottomBarWhenPushed = YES;
    

    这里http://www.cocoachina.com/bbs... 有一个思路的参照
    但是具体实现需要具体分析一下,总的来说是把该方法加到即将要进入(即存在多余tabbar空白的界面)的前一个界面的-(void)viewWillAppear:(BOOL)animated中来实现,也就是在页面跳转前

    64.思路思路思路啊

    #pragma mark - 发表帖子
    -(void)publishAction
    {
        //判断是否已经登陆
        BOOL isLogin = [Utility getBoolForKey:GYH_PATIENT_IS_LOGIN];
        if (isLogin) {
            //进入发帖界面
            UIViewController *vc = viewControllerInStoryBoard(@"GHYNewPostController", @"1_home_7_quan");
            [self.navigationController pushViewController:vc animated:YES];
        }else{
            //调出登陆界面,登陆界面的返回是直接返回上一级界面,并不是主页
            [Utility jumpToLoginWithViewController:self];
        }
    
    }
    

    65.确实是深深感到对代码的层次深度的理解到了瓶颈期的时候。

    66.本着别人坑我,我不坑人的态度,变量的命名和注释都是极尽规范和详细的,也算对的起一个处女座的人设了。

    67.for in实际上是快速枚举,跟for循环意义上还是有区别的。目前可以理解为for...in 语句用于对数组或者对象的属性进行循环操作

    68.NSArray的枚举操作中有一条需要注意:对于可变数组进行枚举操作时,你不能通过添加或删除对象这类操作来改变数组容器。如果你这么做了,枚举器会很困惑,而你将得到未定义的结果。

    69.git经过一次更改就要提交一次是为了给自己一个后悔的机会,如果做了20次更改的时候一起提交,那么想要重新返回之前的某一项功能就会十分的费时费力,得不偿失

    70.UITableViewCell的属性selectionStyle设置为UITableViewCellSelectionStyleNone 如果是在storyboard里面,就设置为none类型 //关于cell的点击响应不显示颜色,即达到点击无效果

    71.当手指离开某行时,就让某行的选中状态消失

    -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
        //当手指离开某行时,就让某行的选中状态消失
        [tableView deselectRowAtIndexPath:indexPath animated:YES];
        self.tableView.backgroundColor = [UIColor clearColor];
    
        if(indexPath.section == 0 && indexPath.row == 2){
        
        }
    }
    
    

    72.图片圆形

    _btnHead.layer.masksToBounds = YES; _btnHead.layer.cornerRadius = 按钮宽的一半;  //图片圆形
    

    73.记一笔,关于tableView的section的header,是一个之前注意到的地方,今天突然重新意识到的问题,这个header如果什么都不填写会显示为no header,就是取消header的显示状态,那么,我们可以用一个空格代替的方式来达到既不想有文字展示但是又有header显示的效果。

    74.思路要清晰,要灵活,困的时候不要写代码,越写越乱,困了直接去睡觉

    75.要隐藏section下的cell的话,在返回section个数的地方进行相应判断即可

    76.如何改变section的headr的颜色

    -(UIView *) tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section 
    {  
        UIView *headerView = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, tableView.bounds.size.width, 30)] autorelease];  
        if (section == integerRepresentingYourSectionOfInterest){                                  
            [headerView setBackgroundColor:[UIColor redColor]];  
        }else {    
            [headerView setBackgroundColor:[UIColor clearColor]];  
        }
        return headerView;
    }
    

    77.如果在视图上固定了cell的行高,就不需要在代码中重复设定

    78.如果实在找不到或不确定在哪里使用过某个值,去放大镜哪里搜索看看吧。

    79.虽然感觉遇到的都是小的功能问题,但都是重要的逻辑性问题。

    80.在做网络请求提交的时候,如果涉及到用户个人的信息,一定要有能够识别是哪一个用户的信息在里面,否则会出现问题,找不到具体是哪个用户的信息

    81.alertView的内容最好分开写,放在一起写可能会出现调用延迟的情况

    82.UIAlertView的响应方法要想被执行,那么UIAlertView的delegate必须是设为self。

    83.不是万不得已,不要写死数据和模块

    84.字符串NSString中去掉空格

    NSString * string =[str3 stringByReplacingOccurrencesOfString:@";" withString:@" "];//OS字符串NSString中去掉空格(或替换为某个字符串)
    

    85.设置异步解析断点时,要在方法内设置断点,因为代码执行不是同步进行的,不会一步一步按照顺序执行下去,所以如果不是在方法内部设置断点,可能会出现直接跳过这段方法而查看不到的断点行为。

    86.字典NSDictionary一般的遍历方法都是:

    NSArray* arr = [yourdictonary allKeys];for(NSString* str in arr){
        NSLog("%@", [yourdictonary objectForKey:str]);
    }
    

    但是如果就这样遍历的话,所打印出来的结果是不按照你添加的顺序打印出来的。很简单,只要先将arr进行排序,再将字典遍历打印出来:

    NSArray* arr = [yourdictonary allKeys];arr = [arr sortedArrayUsingComparator:^NSComparisonResult(idobj1, id obj2)
    {
        NSComparisonResult result = [obj1 compare:obj2];
        return result==NSOrderedDescending;
    }];
    

    就这样,将字典的key进行一个排序后,就能根据自己的需求将字典遍历打印出来。

    87.在mac上浏览图片不需要双击,选中后直接按空格就可以了

    88.改变字符串中个别字符的颜色:
    NSString * onlineString = @"";

    if (isOnline == 1) {
        onlineString = @"[在线]";
    }else{
        onlineString = @"[离线]";
    }
    NSString * name = [NSString stringWithFormat:@"%@%@",onlineString, cell.nameLabel.text];
    NSMutableAttributedString * attString = [[NSMutableAttributedString alloc] initWithString:name];
    [attString addAttributes:@{NSForegroundColorAttributeName:[UIColor lightGrayColor], NSFontAttributeName:MyFont(13)} range:[name rangeOfString:onlineString]];
    cell.nameLabel.attributedText = attString;

    //设置text字的属性,比如说同一个label中的不同字符串可以拥有不同的属性,首先初始化,NSForegroundColorAttributeName,设置字体颜色,NSFontAttributeName,字体大小,range,范围,name rangeOfString:onlineString]],name中的onlineString。最后显示的时候就不用text属性,而用attributedText属性

    89.关于IOS系统升级后的屏幕适配的一个原因:
    这个原因确实是LaunchImage没配。不过这么说确实容易觉得奇怪,这又不是启动界面,直觉这俩好像没什么关系。所以我来讲个故事……

    很久以前,iPhone就是这么矮矮的。

    后来有一天,出来了iPhone5,宽度不变,高度长了一截。记得大家当时都在吐槽……

    无论如何,当时 AppStore 已经有很多的app了;屏幕变了以后,原来的那些app该怎么显示呢?肯定不能直接拉长,把方块拉成长方形;也不能直接按拉长的屏幕尺寸渲染,虽然理论上不应该有问题,但当时有app的代码是写死坐标+计算相结合的,直接改变肯定会造成显示错乱。

    所以苹果想的办法就是,给原来的app一点准备的时间,要求尽快适配新屏幕;在适配好之前,显示的高度不变,像你看到的那样居中显示,上下各一道黑边;适配好之后,再按拉长的屏幕显示。

    那么app怎么告诉苹果系统,对于这划时代的新屏幕它是准备好了还是没准备好呢?答案就是:LaunchImage。

    系统会先看一个app有没有4寸的LaunchImage。只要给了,那就假定已经适配好了,会按4寸显示;反之,只要没给,就会按3.5寸显示,也就是你看到的黑边。

    从那以后,再推出iPhone6、6Plus的时候,也是按同样的方法区分的。没给3x LaunchImage的会直接拉伸显示,给了的才会按大屏渲染,帮助已有的app度过那青黄不接的年代。

    90.界面延迟跳转

    [self performSelector:@selector(jumpToModifyInfo) withObject:nil afterDelay:2.0];  //界面延迟跳转
    

    91.

    -(void)generateSelectedIndexPath
    {
    
        if (![MyUtil isNilOrEmpty:self.attentionTopic]) {
            NSArray * array = [self.attentionTopic componentsSeparatedByString:@";"];
            for (NSInteger i = 0; i < array.count; i++) {
                NSString * oneTopic = array;
                for (NSInteger j = 0; j < self.categories.count; j++) {
                    NSString * typeName = self.categories[j][@"mentalType"][@"type_name"];
                    if ([oneTopic isEqualToString:typeName]) {
                        [self.categoryChooseStates replaceObjectAtIndex:j withObject:@(YES)];
                    }
                }
            }
        }
    }
    

    //这个方法是个实际遇到的问题,首先讲获取到的字符串利用字符串的分割而转换为数组,这样做的一个目的是可以去到这个数组的count,之后进行一次小于数组长度的循环,NSString oneTopic = array;是指每循环一次都将数组内的第i个字符串赋给oneTopic,然后在进行一次针对self.categories的循环,self.categories中保存着全部的“感情话题”的数据,是一个字典,这个循环的目的就是用数组中的oneTopic去字典self.categories中遍历寻找相同的字符串,NSString typeName = self.categoriesj[@"type_name"];这句话也是将字典self.categories中@"mentalType"的内容保存在这个字符串里,并在这里if ([oneTopic isEqualToString:typeName])进行对照和判断。如果在字典中找到相同的字符串,那么[self.categoryChooseStates replaceObjectAtIndex:j withObject:@(YES)]; 这句话就是说,根据字符串相同时所对应的index也就是这个j的值(j也可以理解为是第几个字符串),来改变bool的状态(默认为No),当Bool为yes是,会再其他方法中改变cell的显示状态

    92.

    STopicViewController * vc = [[UIStoryboard storyboardWithName:@"SSTopicCollectionVC" bundle:nil] instantiateViewControllerWithIdentifier:@"sss"];
    //把当前界面的self.attentionTopic的值,直接传给下一个界面的attentionTopic
    vc.attentionTopic = self.attentionTopic;
    [self.navigationController pushViewController:vc animated:NO];
    

    //关于界面传值这个东西,也不是说逻辑上的理解,总之就是头脑要清醒,要想清楚是怎么传,怎么得到。上面这个方法就是A类中的全局变量self.attentionTopic的值传给B类中的全局变量attentionTopic来使用,利用

    STopicViewController * vc = [[UIStoryboard storyboardWithName:@"SSTopicCollectionVC" bundle:nil] instantiateViewControllerWithIdentifier:@"sss"];
    

    这个方法来拿到B类的实例,也就是获取到B类,这样就可以获取到B类中h文件中声明的变量,利用A类的变量来直接赋值给B类的变量,直接改变在B类中attentionTopic的值,以此来达到见面之间传值的目的。ps:A类视图跳转到B类视图

    93.
    //保存选中时的数据

    -(NSString *)getMentalType
    {
        NSMutableArray * tmpArray = [@[] mutableCopy];
        for (NSInteger i = 0; i < self.categoryChooseStates.count; i++) {
            BOOL isChoose = [self.categoryChooseStates boolValue];
            if (isChoose) {
                [tmpArray addObject:self.categories[@"mentalType"][@"type_name"]];
            }
        }
        if (tmpArray.count == 0) {
            return @"";
        }
        NSString * string = [tmpArray componentsJoinedByString:@";"];
        return string;
    }
    

    //相当于整个方法就是调用最后这个返回的string 

    94.网络解析更换借口地址后,参数记得同时调整

    95.传值要在界面跳转之前完成,先有数据,后有显示

    96.取到cell的index

    -(void)tapComplaintBtn:(SSmyReferCell *)cell
    {
        NSIndexPath * indexPath = [self.tableView indexPathForCell:cell];
        SSComplainViewController * vc = [[UIStoryboard storyboardWithName:@"MyCenter" bundle:nil]instantiateViewControllerWithIdentifier:@"complain"];
        vc.bIdStr = self.myQuestionList[indexPath.section][@"question"][@"id"];
        [self.navigationController pushViewController:vc animated:YES];
    
    }
    

    //取到cell的index

    97.label设置边框

    //label设置边框
    
    CALayer * layer = [self.classLabel layer];
    [layer setCornerRadius:10];
    [layer setMasksToBounds:YES];
    layer.borderColor = [[UIColor lightGrayColor] CGColor];
    [layer setBorderWidth:1];
    [self.view addSubview:self.classLabel];
    

    98.调用方法时,要遵循代理协议
    textView.delegate = self;设置好委托。就能响应
    -(void)textViewDidBeginEditing:(UITextView *)textView方法
    -(void)textViewDidEndEditing:(UITextView *)textView方法了 

    99.text居中显示

    cell textLabel textAlignment = UITextAlignmentCenter  //cell.label的text居中显示
    

    100.关于Label显示不完过长字符串的问题,在视图右边调整行数,以及右上的宽度,outLaout不要约束宽度

    101.在强调一遍,界面传值时,A传值给B,现在B界面的头文件中声明好用来保存的参数,然后,在A界面实例化B的类名,然后objectB.用于保存的参数=A的self.传值的参数

    102.调用A类方法时,注意在B类头文件中声明想要引用的对应的方法名

    103.想要拿到具体数据时,接口解析后返回的参数要看清楚字段的数量和名称
    如:

    (lldb) po responseObject[@"data"]
    {
        code = 0;
        complaint =     {
            "b_id" = 889;
            "b_type" = 1;
            content = Tyyygggghhjgffddcvvbb;
            "create_time" = "2015-10-19 00:39:16";
            id = 19;
            "reason_id" = 2;
            state = 0;
        };
        msg = "\U64cd\U4f5c\U6210\U529f";
    }
    

    就应该以responseObject@"data"[@"state"]的形式来调用

    104.解析到参数内容是整数的,需要进行比较时,如下处理:

    NSInteger state = [responseObject[@"data"][@"complaint"][@"state"] integerValue];
    if(state == 1){
        self.handleState.text = @"客服已处理";
    }else{
        self.handleState.text = @"处理中";
    }
    

    105.swift用let来声明常量,用var来声明变量。常量与变量名不能包含数学符号,箭头,保留的(或者非法的)Unicode 码位,连线与制表符。也不能以数字开头,但是可以在常量与变量名的其他地方包含数字。

    106.swift你可以更改现有的变量值为其他同类型的值,如:friendlyWelcome的值从"Hello!"改为了"Bonjour!"。与变量不同,常量的值一旦被确定就不能更改了。尝试这样做会导致编译时报错.

    107.swift你可以用println函数来输出当前常量或变量的值,println是一个用来输出的全局函数,输出的内容会在最后换行。如果你用 Xcode,println将会输出内容到“console”面板上。(另一种函数叫print,唯一区别是在输出内容最后不会换行。)

    108.swift与 Cocoa 里的NSLog函数类似的是,println函数可以输出更复杂的信息。这些信息可以包含当前常量和变量的值。

    Swift 用字符串插值(string interpolation)的方式把常量名或者变量名当做占位符加入到长字符串中,Swift 会用当前常量或变量的值替换这些占位符。将常量或变量名放入圆括号中,并在开括号前使用反斜杠将其转义:

    println("The current value of friendlyWelcome is (friendlyWelcome)")
    // 输出 "The current value of friendlyWelcome is Bonjour!
    //意思就是输出printIn内参数的值或内容
    object-c中的写法就是 Dlog(@"The current value of friendlyWelcome is %@",friendlyWelcome);
    就是这点区别

    109.如果在上一个if中进行了bool型判断,那么为了避免列表上下滑拉刷新时所造成的显示混乱,那么就要在下面的else中写入相反的bool量,即代码的重用问题

    110.与其他大部分编程语言不同,Swift 并不强制要求你在每条语句的结尾处使用分号(;),当然,你也可以按照你自己的习惯添加分号。有一种情况下必须要用分号,即你打算在同一行内写多条独立的语句:

    let cat = "?"; println(cat)
    // 输出 "?"
    

    110.swift你可以访问不同整数类型的min和max属性来获取对应类型的最大值和最小值:

    let minValue = UInt8.min  // minValue 为 0,是 UInt8 类型的最小值
    let maxValue = UInt8.max  // maxValue 为 255,是 UInt8 类型的最大值
    

    111.Double表示64位浮点数。当你需要存储很大或者很高精度的浮点数时请使用此类型。

    Float表示32位浮点数。精度要求不高的话可以使用此类型。
    注意:
    Double精确度很高,至少有15位数字,而Float最少只有6位数字。选择哪个类型取决于你的代码需要处理的值的范围。

    112.Swift 是一个类型安全(type safe)的语言。类型安全的语言可以让你清楚地知道代码要处理的值的类型。如果你的代码需要一个String,你绝对不可能不小心传进去一个Int。

    113.当推断浮点数的类型时,Swift 总是会选择Double而不是Float。
    如果表达式中同时出现了整数和浮点数,会被推断为Double类型

    114.不同整数类型的变量和常量可以存储不同范围的数字。Int8类型的常量或者变量可以存储的数字范围是-128~127,而UInt8类型的常量或者变量能存储的数字范围是0~255。如果数字超出了常量或者变量可存储的范围,编译的时候会报错:

    let cannotBeNegative: UInt8 = -1
    // UInt8 类型不能存储负数,所以会报错
    let tooBig: Int8 = Int8.max + 1
    // Int8 类型不能存储超过最大值的数,所以会报错
    

    115.Swift 有两个布尔常量,true和false:

    let orangesAreOrange = true
    let turnipsAreDelicious = false
    

    116.如果你在需要使用Bool类型的地方使用了非布尔值,Swift 的类型安全机制会报错。下面的例子会报告一个编译时错误:

    let i = 1
    if i {
        // 这个例子不会通过编译,会报错
    }
    
    然而,下面的例子是合法的:
    
    let i = 1
    if i == 1 {
        // 这个例子会编译成功
    }
    

    i == 1的比较结果是Bool类型,所以第二个例子可以通过类型检查。类似i == 1这样的比较,请参考基本操作符。

    和 Swift 中的其他类型安全的例子一样,这个方法可以避免错误并保证这块代码的意图总是清晰的。

    117.shift+command+k 开关模拟器键盘

    118.关于判断tableView上拉下滑移动的一个思路:

    -(void)scrollViewDidScroll:(UIScrollView *)scrollView{
    
        if (scrollView.contentOffset.y > _oldOffset) {//如果当前位移大于缓存位移,说明scrollView向上滑动
    
        }
    
        _oldOffset = scrollView.contentOffset.y;//将当前位移变成缓存位移
    }
    
    //就是声明一个变量_oldOffset,初始化为0,因为创建tableView时偏移量为0。然后把每次偏移后的值赋值给_oldOffset,下一次的时候跟上一次比较就能判断是上移还是下移了
    
    -(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {
        oldY = scrollView.contentOffset.y;
    }
    
    -(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {
       if( scrollView.contentOffset.y > oldY) {
          //向下
        }else//向上
        }
    
    }
    
    //这样也可以
    

    119.可以在storyBoard的右边Class Prefix处设立类的前缀,统一类名格式

    120.如何去除tableView顶端的空白
    在包含这个tableview的controll里面添加:

    self.automaticallyAdjustsScrollViewInsets = NO;
    

    解决。

    121.想要透明的话就直接设置navigationbar透明,而不是颜色透明,在navigationbar上面再加个view,就可以对view的颜色设置clearcolor,这是个取巧的方法,挺不错的。

    如果navigationbar出现黑色是因为一开始我的这个controllerVIew在navigationbar那个位置上没有东西,也就是覆盖到navigationbar上面的view颜色是空,而window的颜色也是空的,所以造成了出现黑色的情况 ,解决方法:把tableView拖拽至顶部,让navigationbar的底下有内容即可。

    就是和他们说的不能把window的backgroundColor设为透明色一样,因为window是最底层了,再透明就没东西了。

    window的backgroundColor可以设为透明色,但是结果就是黑色。

    122.去掉navigationbar下面的黑色边线

    //去掉navigationbar下面的黑色边线
    [[UINavigationBar appearance] setBackgroundImage:[[UIImage alloc] init] forBarPosition:UIBarPositionAny barMetrics:UIBarMetricsDefault];
    [[UINavigationBar appearance] setShadowImage:[[UIImage alloc] init]];
    
    

    123.不能把jpg格式的图片,直接改成png,这样模拟机上能看见,真机上看不见

    124.设置底部tabBar,只需要在AppDelegate.m中引入写好的tabBarController的h文件,并

    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    KeanTabBarViewController * tabBarController = [[KeanTabBarViewController alloc]init];
    self.window.rootViewController = tabBarController;
    [self.window makeKeyAndVisible];
    
    

    125.Thread 1: signal SIGABRT类型的错误,实际上都是具体的某种内部的错误,然后最终传递到上层的thread的,而报此错误的。
    而解决了内部的具体的错误,此种thread的signal SIGABR,也就算是解决了。
    其实thread 1 breakpoint 1.1不是你的程序出错,而是你人为(应该是不小心设置了)的为某一行程序添加了breakpoint,所以xcode就在那儿停了。

    126.如果断点指向内存,那么就是初始化时分配内存时出了问题

    127.真机调试:设置 -> 通用 -> 描述文件 -> "你的AppleID" 选择信任

    128.launchImage有时候会出现第一次运行显示不正常的情况,一般把App删除重新run一遍就好了。

    129.延迟进程

    //延迟线程进程3秒(目的为了延长LaunchImage的显示时间)
    [NSThread sleepForTimeInterval:3.0];
    
    

    130.ios 支持多个层次的多线程 编程,层次越高的抽象程度越高,使用起来也越方便,也是苹果最推荐使用的方法。

    131.苹果不允许修改launchImage的显示时长,所以要想延长启动页的显示时间,就需要对线程的进程进行适当的阻塞,来达到延长启动页的停留时间,也就是延迟线程进程

    132.com.公司名.项目名

    133.撤销键盘
    //点击return撤销键盘

    -(BOOL)textFieldShouldReturn:(UITextField *)textField{
        [self.account resignFirstResponder];
        [self.password resignFirstResponder];
        return YES;
    }
    

    //撤销键盘

    -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
        [self.account resignFirstResponder];
        [self.password resignFirstResponder];
    }
    

    //其实最简单的还是

    [self.view endEdit:YES];
    

    134.同一个controller切换界面时一定要刷新一遍

    135.隐藏首页NavigationBar
    //隐藏首页NavigationBar
    这个问题曾经也困扰过我。现在我给出正解。

    -(void)viewWillAppear:(BOOL)animated {
        [super viewWillAppear:animated];
     
        [self.navigationController setNavigationBarHidden:YES animated:animated];
    }
     
    -(void)viewWillDisappear:(BOOL)animated {
        [super viewWillDisappear:animated];
     
        [self.navigationController setNavigationBarHidden:NO animated:animated];
    }
    

    注意,animated设为YES,仍是会有一个瞬间的过渡效果。只有设置为animated才能真正实现。

    136.如果任意行数,则设置label.numberOfLines=0;

    137.设置根据字符串大小自适应的label,在设置outLayout的时候选择Relation的Greater Than or Equal是大于等于该值的效果

    138.

    [quizCell.photoButton addTarget:self action:@selector(selectImage) forControlEvents:UIControlEventTouchUpInside];
    //在controller类中实现cell中控件功能的方法 ,即在controller中找到cell中Button的tag值,然后单击cell中Button时调用controller中的方法
    
    

    139.view的自适应和label一样要勾选扩展高度

    140.在使用自定义view代理执行控制类中的方法时,在调用view视图显示时,无需初始化生成一个UIVIew,直接头文件引用view的类即可

    141.

    [segment titleForSegementAtIndex:___];
    //获取segment文字内容的方法
    
    

    142.解决xocde7以后出现的使用scollVIew进行约束时自动下移60个位量的问题:使用storyBord进行约束,右下角右数第二个图标,先删除scrollVIew所有约束后,去掉勾选的constrain to magins,进行四周约束,并且更新约束即可

    143.reloadInputViews 这个方法重新载入输入视图,一般就是刷新键盘,定义键盘的时候 用这个方法,可惜的是,view无法像tableView那样reloadData更新视图数据,只有手动更新或手绘了

    144.其实吧 程序员需要有自己独立的思考,不该当成任务完成一样对照效果图

    145.

    imageView.userInteractionEnabled = YES;//可以进行对imageView进行手势响应,是手势响应前的必备的一步
    

    146.view视图或cell视图加载缓慢,需要在viewDidload中先将视图加载出来,而不是点击segment后才进行加载

    147.自定义搜索:
    一个UIView 上面放uitextfield+uiimageview==自定义search

    148.先百度、谷歌、找博客,找cocoachina,找github,stackoverflow,再没有,就去研究苹果的官方文档 第三方的官方文档

    149.如果想要将上述数据类型的数据永久保存到NSUserDefaults中去,只需要简单的操作(一个Value 一个Key ),例如,想要保存一个NSString的对象,代码实现为

    
    //将NSString 对象存储到 NSUserDefaults 中
    NSString *passWord = @"1234567";
    NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
    [user setObject:passWord forKey:@"userPassWord"];
    
    将数据取出也很简单,只需要取出key 对应的值就好了,代码如下:
    NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
    NSString *passWord =   user objectForKey:@"userPassWord"];
    
    

    150.

    control reaches end of non-void function  
    //缺少返回值
    return self
    
    

    151.

    id birthday = [MyUtil getNoneNillObject:responseObject[@"childBirthDay"]];//过滤一遍,防止对象中出现空值导致崩溃,一个防崩处理,遇到空值返回一个空的字符串@"",而不是让其遭遇null或nil无法执行
    [MyUtil saveObject:birthday forKey:@"childBirthDay"];//保存要根据要求,而不是说把整个字典保存起来
    
    

    152.setTintColor是控制的navigationController上所有按钮控件的颜色

    153.代理遇到“existing instance variable '1' for property '2' whith assign attribute must be _unsafe_unretained”问题时
    例:id <MDSpreadViewDataSource> _dataSource改为id <MDSpreadViewDataSource>__unsafe_unretained _dataSource; 

    154.arc自动内存管理,关掉你需要手动释放

    155.

    [self.dailyAndDietView.upType setTitle:@"疾病种类" forState:UIControlStateNormal];
    //设置点击和非点击button的title时 
    
    

    156.[self.view endEditing:YES]; 键盘立马关闭

    157.datePicker设置格式

    datePickerView.datePicker.datePickerMode = UIDatePickerModeDate;//显示类型(只显示年月日)
    datePickerView.datePicker.minuteInterval = 30;//分钟间隔
    datePickerView.datePicker.minimumDate = [NSDate date];//最小日期
    
    

    158.
    不要这样写:

    UIDatePicker *datePicker = [[UIDatePicker alloc] initWithFrame:CGRectMake(0, 0, 300, 200)];
    

    这样写分开写就可以改变大小了:

    UIDatePicker *datePicker = [[UIDatePicker alloc] init];
    datePicker.frame = CGRectMake(0, 0, 300, 200); 
    
    
    

    159.时间范围,从当前时间——后面3天

       //时间范围,从当前时间——后面3天
    //    NSData * dateMin = [NSDate date];
    self.datePicker.minimumDate = [NSDate date];
    NSDate * dateMax = [NSDate dateWithTimeIntervalSinceNow:3*24*60*60];
    self.datePicker.maximumDate = dateMax;
    //自动滚回当前日期
    
    
    

    160.KVO模式
    KVO,即:Key-Value Observing,它提供一种机制,当指定的对象的属性被修改后,则对象就会接受到通知。简单的说就是每次指定的被观察的对象的属性被修改后,KVO就会自动通知相应的观察者了。

    161.dateFormatter显示格式

    [dateFormatter setDateFormat:@"yyyy年MM月dd日 EEEE"];EEEE为星期几,EEE为周几
    [dateFormatter setDateFormat:@"yyyy-MM-ddHH:mm:ss"];
    [dateFormatter setDateFormat:@"yyyy年MMMMd日"];//MMMM 为xx月,一个d可以省去01日前的0
    
    
    
    

    162.注:Objective-C不支持long double类型。@encode(long double)返回d,与double是一样的。

    163.objc_property_t
    objc_property_t是表示Objective-C声明的属性的类型,其实际是指向objc_property结构体的指针,其定义如下:
    typedef struct objc_property *objc_property_t;

    164.使用objc_property_t时报错

    #import <objc/message.h>
    objective_c动行时库已经有这样的功能。使用这些方法需要加头文件
    objc_property_t
    
    

    165.先保留一个方法
    //修改datePicker的系统控件

    unsigned int outCount;
    int i;
    objc_property_t *pProperty = class_copyPropertyList([UIDatePicker class], &outCount);
    for (i = outCount -1; i >= 0; i--)
    {
        // 循环获取属性的名字   property_getName函数返回一个属性的名称
        NSString *getPropertyName = [NSString stringWithCString:property_getName(pProperty) encoding:NSUTF8StringEncoding];
        NSString *getPropertyNameString = [NSString stringWithCString:property_getAttributes(pProperty) encoding:NSUTF8StringEncoding];
        
        //关闭当日高亮属性
        SEL selector = NSSelectorFromString(@"setHighlightsToday:");
        NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[UIDatePicker instanceMethodSignatureForSelector:selector]];
        BOOL no = NO;
        [invocation setSelector:selector];
        [invocation setArgument:&no atIndex:2];
        [invocation invokeWithTarget:self.datePicker];
        
        
        if([getPropertyName isEqualToString:@"textColor"])
        {
            [self.datePicker setValue:kColorPink forKey:@"textColor"];
        }
        NSArray * array = [[NSArray alloc] initWithObjects:getPropertyName, nil];
        NSLog(@"%@",array);
        NSLog(@"%@====%@",getPropertyNameString,getPropertyName);
    }
    
    
    

    166.text对齐格式

    [nowPickerShowTimeLabel setTextAlignment:NSTextAlignmentLeft];//左边对齐
    //text对齐格式
    
    

    167.记一个关于datePicker选择日期随滚轮实时变动的方法:

     self.datePicker.datePickerMode = UIDatePickerModeDate;//格式 
    //默认显示
    NSDateFormatter * dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"yyyy-MM-dd EEEE"];
    NSString * dateString = [dateFormatter stringFromDate:[NSDate date]];
    self.dateLabel.text = dateString;
    
    [self.datePicker addTarget:self action:@selector(dateChanged:) forControlEvents:UIControlEventValueChanged];//委托
    
    -(void)dateChanged:(id)sender{//动作类
        UIDatePicker * control = (UIDatePicker *)sender;
        NSDate * _date = control.date;
    
        NSDateFormatter * dateFormatter = [[NSDateFormatter alloc] init];
       [dateFormatter setDateFormat:@"yyyy-MM-dd EEEE"];
        NSString * dateString = [dateFormatter stringFromDate:_date];
        self.dateLabel.text = dateString;
    }
    
    

    168.通过日期求星期

    //通过日期求星期
    -(NSString*)fromDateToWeek:(NSString*)selectDate
    {
        NSInteger yearInt = [selectDate substringWithRange:NSMakeRange(0, 4)].integerValue;//取第0~4位
        NSInteger monthInt = [selectDate substringWithRange:NSMakeRange(4, 2)].integerValue;//取第4位的后两位
        NSInteger dayInt = [selectDate substringWithRange:NSMakeRange(6, 2)].integerValue;//取第6位的后两位
        int c = 20;//世纪
        long int y = yearInt -1;//年
        long int d = dayInt;
        long int m = monthInt;
        int w =(y+(y/4)+(c/4)-2*c+(26*(m+1)/10)+d-1)%7;
        NSString *weekDay = @"";
        switch (w) {
            case 0:
                weekDay = @"星期日";
                break;
            case 1:
                weekDay = @"星期一";
                break;
            case 2:
                weekDay = @"星期二";
                break;
            case 3:
                weekDay = @"星期三";
                break;
            case 4:
                weekDay = @"星期四";
                break;
            case 5:
                weekDay = @"星期五";
                break;
            case 6:
                weekDay = @"星期六";
                break;
            default:
                break;
        }
        return weekDay;
    }
    
    
    

    169.获取当前年月日,星期

    //获取当前年月日,星期
    -(int)getCurrentTimeWith:(State)state
    {
        NSDate* date = [NSDate date];
        NSCalendar* calendar = [NSCalendar currentCalendar];
        NSDateComponents* comps = [calendar components:(NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit|NSWeekdayCalendarUnit) fromDate:date];
        switch (state) {
            case year:{
                return [comps year];
            }
                break;
            case month:{
                return [comps month];
                break;
            }
            case day:{
                return [comps day];
                break;
            }
            case week:{
                return [comps weekday]-1>0?[comps weekday]-1:7;
                break;
            }
            default:
                break;
        }
    }
    
    h.
    #import <UIKit/UIKit.h>
    #import "InfoView.h"
    typedef enum{
        year=0,
        month,
        day,
        week
    }State;
    
    //似乎是个可以获得日历属性的方法
    NSCalendar日历
    
    
    

    170.关掉webview的垂直滑动性,把.bounce关掉,可以试试
    还有重写了-(void)scrollViewDidScroll:(UIScrollView *)scrollView方法在webview的scrollView的scrollView.contentOffset.y发生改变时,再设回0 就不滑了

    171.写的是tableViewCell里面嵌套webview的,先在自定义单元格类的_webview的懒加载里(我用懒加载添加webview的)设置一下tag值,_webView.scrollView.tag = 11;
    在-(UITableViewCell )tableView:(UITableView )tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    设置cell.webView.scrollView.delegate = self;
    重写

    -(void)scrollViewDidScroll:(UIScrollView *)scrollView
    {
        if (scrollView.tag == 11)
        {
            if (_tableView.contentOffset.y < 634.5)
            {
                    
                _tableView.contentOffset = CGPointMake(_tableView.contentOffset.x, _tableView.contentOffset.y + scrollView.contentOffset.y);
                scrollView.contentOffset = CGPointMake(scrollView.contentOffset.x, 0);
            }
            else if (scrollView.contentOffset.y < 0)
            {
                _tableView.contentOffset = CGPointMake(_tableView.contentOffset.x, _tableView.contentOffset.y + scrollView.contentOffset.y);
                scrollView.contentOffset = CGPointMake(scrollView.contentOffset.x, 0);
            }
        }
        
    }
    

    就实现了Cell里面嵌套webview,同步滑动基本上除了加载慢一点之外,看不出来最后一行Cell用的是网页

    有个问题,当页面全部都是webview,也就是我用来展示webview的自定义Cell占满整个屏幕时,pop回上个界面会崩溃,把pop动画关了就好了,因为时间需要响应

    172.画线是一定要在drawRect里面的
    在view上划一条直线,用到CGContextSetRGBStrokeColor

    CGContextSetRGBStrokeColor(context, 1.0, 1.0, 1.0, 1.0);//画笔颜色设置
    
    

    173.以后遇到编译的Bug就选择xcode的product的cleran,选择一次之后按住option键,再选择cleran build,基本就可以了

    174.记一个机智的方法,可以再安装包的resources里找到软件的所偶icns图标

    175.改变字体第几个的方法

    //应该是改变字体第几个的方法
    
    NSMutableAttributedString *str = [[NSMutableAttributedString alloc] initWithString:@"点击注册代表您已经同意我们的《用户协议》"];
        NSRange strRange = {14,6};
        [str addAttribute:NSForegroundColorAttributeName value:[UIColor colorInSkinWithKey:@"useColor1"] range:strRange];  //设置颜色
        [str addAttribute:NSUnderlineStyleAttributeName value:[NSNumber numberWithInteger:NSUnderlineStyleSingle] range:strRange];
    
    
     [_radioButton setAttributedTitle:str forState:UIControlStateNormal];
    

    176.一进入界面的时候会调用tableview的datasource方法,你看是不是数据还没请求到你就使用这个值了

    177.一个低级失误

    "list" :   {
            "id" : "11c334bc-0c9e-4c20-9b2e-af5e434d4ca7",
            "childId" : "0535001201500246",
            "childName" : "姜依霖",
            "hospitalId" : "0535001",
            "hospitalName" : "招远市人民医院",
            "questionTitle" : "大便频繁,不拉肚子",
            "questionContent" : "宝宝50天,这两天隔两小时就大便,一次就一小坨,肚子不疼,睡觉放屁就拉。醒着也频繁拉。母乳喂养,大便金黄色,宝宝吃睡都正常。以前是一天一次大便,一次拉很多。",
            "questionType" : "医(疾病防治)",
            "submitDate" : 1438764312000,
            "activeFlag" : false,
            "childAge" : 1,
            "childAgeName" : "1个月",
            "readFlag" : false,
            "sex" : "女",
            "hasPic" : false
          }
    
    //这个list是个数组,数组里面是字典,因为有key啊,有key就是字典,取这里面值的时候直接根据字典的key取值就可以了
    
    

    178.限制textFeild输入内容

    //限制textFeild输入内容
    -//创建
    1.
    phonetext = [[UITextField alloc] initWithFrame:CGRectMake(0, 0, self.bounds.size.width-width, 25)];
    ...... //设置相关属性
    
    2.关联上selector. 注意: 事件要forControlEvents:UIControlEventEditingChanged
    [phonetext addTarget:self action:@selector(changePhoneNumValue) forControlEvents:UIControlEventEditingChanged];//手机号码
    
    3.实现selector
    -(void)changePhoneNumValue
    {
        int MaxLen = 15;
        NSString* szText = [phonetext text];//把输入的字符给szText
        if ([phonetext length]> MaxLen)//如果超过规定长度
        {
            phonetext.text = [szText substringToIndex:MaxLen];//将规定长度的字符保留,并重新赋给
    szText
         }
    }
    
    
    

    179.如果有个cell把delega指向了self,销毁时,assign的时候 必须=nil,weak的时候不必。
    weak的时候自动销毁 但是设置delegate的时候是assign 在销毁的时候 一定要delegate=nil
    那就是在self的dealloc 再找回这个cell 再delegate=nil
    当这个cell不用的时候 =nil 出现的时候 =self 这样做 没意义 而且所有的delegate若是assign的话 在控制器销毁的时候 都应该=nil 不然的话,可能在某一个时间点。当这个控制器销毁的时候,app会蹦掉,那时候你找都找不到在那蹦的,蹦的原因是什么所以,一定要在控制器消失的时候,把assign的delegate全部都=ni

    180.

    -(void)dealloc{
        self.delegate = nil;
        [super dealloc];
    }
    
    

    181.比如说在界面间传值的时候,对类的初始化,是在用的时候初始化,在全局用变量初始化时实际上最后的结果和使用时的类不是同一个东西,所以,在用的时候再初始化

    182.一般传值过去为空,都是初始化的原因

    183.long型转化为日期,long型就是1970年到要转换的日期的秒数

            double theDate = [self.theQuestion[@"submitDate"] doubleValue]/1000;
            NSDate * date = [NSDate dateWithTimeIntervalSince1970:theDate];
            NSDateFormatter * dateFormatter = [[NSDateFormatter alloc] init];
            [dateFormatter setDateFormat:@"yyyy年MM月dd日"];
            NSString * dateString = [dateFormatter stringFromDate:date];
            myQuizCell.dateStirng = dateString;
            
            
            

    184.那既然仅仅是“更新展示”出已有的数据源,那么为何经常出现这么一个情况,当进行网络请求时,比如将返回数据存放在数组中,在请求内部这个数组是确保拿到了返回的值,确保是有值的,然后在其他地方调用数组时,如果在请求中没有[self.tableView reloadData] ,那么就会造成数组的值为nil,这个是因为异步的原因还是这句话的原因?
    可以确定是异步造成的原因,没有加载到数据就开始进行引用,所以需要在引用前就及时的“刷新”数据源,以免造成下面出现空值

    185.网络请求成功和失败的返回形式

    NSDictionary * parameters = @{@"from":@"ios", @"secretKey":secretKey, @"username":name, @"childId":childId, @"inputDate":date, @"height":height, @"weight":weight};
    [AFNetManager postWithUrl:URL_ADDGROWTHMONITOR parameters:parameters success:^(NSURLSessionDataTask *task, id responseObject) 
    {
       DLog(@"R: %@",responseObject);//这里只是指参数和地址请求成功,并不代表执行成功
    } failure:^(NSURLSessionDataTask *task, NSError *error) 
    {
       DLog(@"E: %@",error);//这里表示url地址请求失败
    }];
    
    

    **186.举个例子,实际上加载的collectionView背景色变成黑色,tableView同理self.view.backgroundColor 和 self.collectionView.backgroundColor 是不一样的。**

    187.view的一些方法使用情况

    • viewDidLoad-加载视图

    • viewWillAppear-UIViewController对象的视图即将加入窗口时调用;

    • viewDidApper-UIViewController对象的视图已经加入到窗口时调用;

    • viewWillDisappear-UIViewController对象的视图即将消失、被覆盖或是隐藏时调用;

    • viewDidDisappear-UIViewController对象的视图已经消失、被覆盖或是隐藏时调用;

    • viewVillUnload-当内存过低时,需要释放一些不需要使用的视图时,即将释放时调用;

    • viewDidUnload-当内存过低,释放一些不需要的视图时调用

    188.设置自定义视图的位置,不要把位置写死

    189.//scrlloView使用outLayout约束布局的方法后,设置view的Frame,要使用这个- (void)viewDidLayoutSubviews方法

    -(void)viewDidLayoutSubviews
    {
        [super viewDidLayoutSubviews];
        [self questionView];//视图加载要在这里,而不是viewDidLoad
    }
    
    -(void)questionView{//我要提问
        if (self.customView) {//如果有了 就只执行一次
            return ;
        }
        NSArray * nib = [[NSBundle mainBundle]loadNibNamed:@"QuizView" owner:self options:nil];
        self.customView = [nib objectAtIndex:0];
        
        //获得屏幕的Frame
        //        CGRect tmpFrame = [[UIScreen mainScreen] bounds];
        
        //设置自定义视图的位置,不要把位置写死
        self.customView.frame = CGRectMake(0, self.tableView.frame.origin.y, 320, self.tableView.frame.size.height);//这里不能写死高度,否则scrollview无法滑动
        
        [self.customView.photoButton addTarget:self action:@selector(selectImage) forControlEvents:UIControlEventTouchUpInside];
    }
    
    

    190.ayoutSubviews是UIView中的属性方法,即只要继承于UIView,就可以使用这个方法,这个方法也很强大,以下是他的触发时机:

    1、init初始化不会触发layoutSubviews
    2、addSubview会触发layoutSubviews
    3、设置view的Frame会触发layoutSubviews,当然前提是frame的值设置前后发生了变化
    4、滚动一个UIScrollView会触发layoutSubviews
    5、旋转Screen会触发父UIView上的layoutSubviews事件
    6、改变一个UIView大小的时候也会触发父UIView上的layoutSubviews事件

    在这些触发情况下,我们就可以妙用他,比如说改变数据等等,这是个很不错的方法,而且我们也可以手动调用,即

    [self setNeedsLayout];

    注意:调用layoutSubviews,也需要调用它的父类方法,即 

    [super layoutSubviews]

    传说如果不调用的话会出现奇怪的问题。

    191.当scrollView下滑时,底边控件显示不完时,去设置一下constraints的bottom的constans的约束距离就可以了

    192.controller的类在传值的时候是不可以直接Init初始化的,而是要用标识符找到。初始化就会造成你找不到它里面本来声明的参数

    193.//这句也可以实现去除tableView顶部空白,即放弃自动调整布局(tableView的scrollView属性的自动布局)

    self.automaticallyAdjustsScrollViewInsets = NO;//去除tableView顶部空白
    
    
    

    194.如果遇到判断字符串不执行便跳过等一系列问题,那么很可能是在转换和执行条件不符上面出了问题

    195.在有navigation的界面中,约束出现问题就最好Push一个有navigation的界面,scrollView底部没有撑满时不会滑动,viewController切换界面的时候要找准方法调用的地方

    196.在有scrollView的情况下,加在视图的调用还是应该写在viewDidLayoutSubviews里面

    197.git在pull出现非冲突性错误而无法正常继续时,:wq

    198.用手势比用单一按钮好,方法要科学

    199.对于像textField这种不同于Button本身具有点击事件的控件来说,拖一个关联响应事件相当于调用一个其中的代理方法,只有像button那种touch down才是点击,by the way,textFiled的editing did end就是结束编辑时调用的方法,button取消计时器闪烁的效果,把button定义为自定义类型而不是系统类型即可

    200.不要去试图判断颜色相等,这是不可靠的

    201.传值理解的不够透彻,会很恼火

    202.小结一下:
    1.关于光标自动跳转到下一行这种事,直接呼出下一行的键盘就可以实现了
    2.如果说在调用的方法中有调回主界面之类的方法后,那么就不要再在下面先执行跳转回根视图之类的操作,尤其是异步的时候
    3.保存在字典里的KEY的名字和参数的KEY要分清楚

    203.可以暂时理解为,刷新view

    [self setNeedsDisplay];
    

    204.以下是用来btn逐渐显示出来用的

    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:0.01];
    [UIView setAnimationDelegate:self];
    [UIView setAnimationDidStopSelector:@selector(endAnimation)];
    //在这里设置透明度为0,就会慢慢变成0
    [UIView commitAnimations];
    
    

    205.如果需要推送消息,则要到苹果官网上制作证书,再到环信后台制作推送证书.

    206.传值拿到nil几乎都是初始化的问题,内存地址未保存

    207.当xib找不到Identifier的时候,极有可能是因为你的xib里面包含了cell外面的其他控件

    208.在autLayout设置的时候,当第一个设置好约束后,其余的以其为标准进行设置

    209.在UILable中lineBreakMode中有以下几个功能

    1.NSLineBreakByWordWrapping = 0 //以空格为边界,保留单词,根据计算结果重新设置UILabel的尺寸 。
    
    2.NSLineBreakByCharWrapping //保留整个字符3.NSLineBreakByClipping //简单剪裁,到边界为止
    4.NSLineBreakByTruncatingHead //前面部分文字以……方式省略,显示尾部文字内容
    
    5.NSLineBreakByTruncatingTail //结尾部分的内容以……方式省略,显示头的文字内容。
    
    6.NSLineBreakByTruncatingMiddle //中间的内容以……方式省略,显示头尾的文字内容。
    
    

    210.在tableView的cell当中,取决于section决定的数组,用indexPath.section决定,取决于row的数组,用indexPath.row决定

    211.git冲突时,需要删除的是同时修改的部分,而同时添加的不需要删除

    212.你要使用第三方,就要为这个第三方工具的bug负责,不要说到时候我改不了这个bug,是第三方的原因云云

    213.关闭cell的点击

    -(nullable NSIndexPath *)tableView:(UiTableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath
    开关开 return indexpath开关关 return nil
    
    

    214.上拉刷新时需要的逻辑

    if([@"success" isEqualToString:value]){            
               [LCProgressHUD hide];            
               [self.tableView.pullToRefreshView stopAnimating];            
               [self.tableView.infiniteScrollingView stopAnimating];            
              if (self.page == 1) {               
                      self.questionInfo = responseObject[@"rtn"][@"body"][@"list"];                            
         }else{                
                      NSArray * array = responseObject[@"rtn"][@"body"][@"list"];                
                      NSMutableArray * tmpArray = [self.questionInfo mutableCopy];//把之前的保存在可变数组中,可变数组就是长度可以变化就是死的可以添加和删除的               
                      [tmpArray addObjectsFromArray:array];//加载到之前数据的身后                
                      self.questionInfo = [tmpArray copy];//再返回给保存的数组,使tableView的number返回行数发生相应改变            
          }           
                      [self.tableView reloadData];        
    }
    
    

    215.BOOL型变量如果不做特别处理,那么其值为no

    216.有些开发者,在判断数组是否为空时,会写成
    if (array != nil)
    或是: if (array.count != 0)
    其实严格来说,这两种写法,都是考虑不足并且不稳定的,并且忽略了一种更常见的情况。
    首先来说一下,二者之间的区别。
    array == nil
    这种情况指的是这个array对象是一个nil对象,而不是一个NSArray类型对象。nil对象是一个可以接收任何消息的对象,它可以赋值给任何一个对象,你对它发消息也没什么问题,尽管你得不到你想要的结果。
    array.count == 0
    这种情况跟上一种不同的在于,此时的array是一个NSArray类型对象,只不过这个array里面没有元素。但它本身是可以作为NSArray对象来使用的。
    而事实上,如果你是处理网络请求的数据,取出的array是nil对象是几乎不可能的(至少我没遇到过),多数情况下会出现的是另一种情况:
    取到的array是一个NSNull对象。
    NSNull是一个特殊的类,它和nil一样,也代表空值,但二者有区别,NSNull不接收NSArray的那些方法,它只有一个类方法:
    +(NSNull *)null;
    因此发送NSArray特有的方法或属性访问都会导致程序crash。
    我们做空值判断的很大一部分原因就是为了在后台接口数据返回一些异常数据的时候,程序能保证稳定性。
    举个例子:某些情况下,后台可能由于各种原因,对某个字段返回了null值,这时我们取到的就是[NSNull null]这样一个对象,再比如说,后台可能对某一个数据取值,但取到了0个,这时返回的是一个空组,我们取到的就是@[],空组。
    因此判断数组是否为空,需要对各种情况都进行判断。写法有很多种,比如你可以写成:
    if (array != nil && ![array isKindOfClass:[NSNull class]] && array.count != 0)

    217.iOS从URL加载图片

    +(UIImage *) imageFromURLString: (NSString *) urlstring  {      
    // This call is synchronous and blocking      
          return [UIImage imageWithData:[NSData  dataWithContentsOfURL:[NSURL URLWithString:urlstring]]];  
    }
    
    

    218.上传image图片时要转换成nsdata格式,转换成jpeg内存小,而且最好压缩成0.几的

    219.设置datePickerView的最小日期就可以限制上滚功能

    220.真的没有技术解决不了的问题,只是自己觉得麻烦懒得去弄罢了

    221.在给一个之前在循环中赋值的控件重新赋值时,要在循环当中实时保存这个控件(或者说实时取到这个控件),然后再取出这个控件进行重新赋值

    222.在使用git的时候,要看分支名称是否是master,不是就用其他的

    223.app默认横屏
    在 info.plist 里增加一个属性 Initial interface orientation  
    值有四个选项分别对应四个方向,选 Landscape 开头的就是横着的

    224.clang: error: linker command failed with exit code 1 (use -v to see invocation)

    ios开发这个错误一定少不了,现总结如下,一般这三方面的问题,如果不是哪你真可麻烦了
    1.引用出错,把*.h弄成了.m,检查一下你的所有引用;
    2.再就是你引用第三方的库,你添加文件是系统没有所第三方库的.m文件参入的编译中去,你向项目添加文件得注意了;
    3.就是不小心添加的重复的类,向Entity之类,具体你可以看这里http://stackoverflow.com/ques...
    顺便说一下http://stackoverflow.com/这个网站是iso开发不可少的一个网站;
    4.有些frameworks没有添加进来也会出现上面的问题;

    225.关于代缩进
    你先按command + [把代码往左缩进到最前面再按command + /注释代码最后按command + ]把代码往右缩进
    改为 Tab 缩进(非四个空格),再注释,你们就会发现神奇的对齐了。

    226.不要懒不要犹豫不要花时间去做无谓的思考,想到就去做就去写,无论是什么试一试总会知道的,敏捷的思维比什么都重要,比浑浑噩噩的细思缜密要清晰的多。

    227.如果是有tableView的界面访问接口,需要储存数据,如NSArray, NSDictionary等,千万不要忘记最重要一步,在接口数据获取成功后加上[self.tableView reloadData];这句话,刷新tableView的数据,否则会造成NSArray或NSDictionary为nil,无法获得返回数据

    228.运行之后显示崩溃信息:
    Terminating app due to uncaught exception 'NSRangeException', reason: '* -[NSMutableArray objectAtIndex:]: index 2147483647 beyond bounds [0 .. 12]'
    数组越界,好好检查代码 

    229.关于dateFormatter
    1)当你的format格式是
    NSDateFormatter* dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
    [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; // 这里是用大写的 H
    NSString* dateStr = [dateFormatter stringFromDate:date];
    你获得就是24小时制的。
    2)当你的format格式用的是
    [dateFormatter setDateFormat:@"yyyy-MM-dd hh:mm:ss"]; // 这里是用小写的 h
    你获得的就是12小事制的。

    230.大多时候outLayout约束label的时候不需要约束宽度,改变fram就可以了

    231.git插件插件没有显示x的时候可以直接pull和push

    232.切图是可以切割使其不变形的

    233.windows的字体在xcode里字体除以1.8

    234.只要cell里的label重写了,是可以直接在controller里给它赋值的

    235.记着,改变lable里个别字符的颜色,最重要的一步是

    cell.gold.attributedText = attString;
    

    这是在改变label的text,不是直接作用于string

    236.数组的count是数组内元素是从1开始的的总体数量,不是数组从0开始的的下标

    237.用%@输出,NSInterger转换成整形变量就可以了

    cell.day.text = [NSString stringWithFormat:@"%@",@(self.day+1)];
    

    238.如果cell中有特殊类型cell,要优先做判断,否则可能由于条件判断原因(入indexPath.row数量为有限,判断比较值过大时)显示不出来,因为无法执行到该特殊类型的判断所以被略过

    239.大多数意外断点停在[indexPath.row]处时,几乎都是由数组越界造成的,因为数组会将indePath.row的所有满足条件执行一遍,会出现indexPath.row大于数组元素数量的情况,即返回行数大于数组数,多余的cell返回行没有数据可执行,而造成崩溃。例:indexPath.row为12,array的元素为10,此时array[indexPath.row]就会造成崩溃。因为一切要以数据为基准

    240.要解决cell的复用问题,说白了,就是把判断了的地方再反判断一次,更改了的地方再反更改一次就可以了,上面更改了,下面就也要对这个更改负责

    241.想要切割图片,点击右下角的show slicing

    242.在-(void)drawRect:(CGRect)rect方法里赋值的时候,基本上相当于写死了,之后再在其他方法里赋值也不会改变,这相当于一开始就给view绘出了的,所以不会改变,这点需要谨慎注意

    243.判断星星数量的方法

    NSInteger score = [self.array[indexPath.row][@"SCORE"] integerValue];
     //            CGFloat xoffset = 0.0f;            
    for (int i = 0; i < 5; i++) {                
        UIImageView *imgview = (UIImageView *)[cell.contentView viewWithTag:i + 11];                
    if (i<score ) {                    
        imgview.hidden = NO;                
    } else {                    
        imgview.hidden = YES;                
    }//                
        imgview.hidden = NO;            
    }
    
    

    244.果然二级运算和一级运算之间还是要加括号的

    245.

    NSString * theFirst = [answer_phone substringToIndex:3];//截取下标3之前的字符,从0开始
    
    

    246.Object或Key只能是对象(id或继承自id的),所以字典是不能直接添加整数的

    247.

    int i = 1;
    [dic addObject:[NSNumber numberWithInt:i] forKey:@"somekey"];//或者[dic addObject:@1 forKey:@"somekey"];//取出时
    i = [[dic objectForKey:@"somekey"] intValue];
    //可以不转换成字符串 
    
    

    248.直接输出整数

    cell.gold.text = [NSString stringWithFormat:@"%@枚金币", @(goldsNumber)];
    
    

    249.Decimal Pad实数键盘,包括小数点和数字

    250.判断字符串中是否含有某一字符

    if([roadTitleLab.text rangeOfString:@"qingjoin"].location !=NSNotFound)
    //_roaldSearchText            
    {                       
        NSLog(@"yes");
    } else { 
        NSLog(@"no");
    }
    

    251.如果存在如:不同的segment展现同一种内容,但其显示数据方式存在差异,且这种差异可以判断时,通常在网络请求返回的参数中可以有鉴别这种判断的key值,这时最好在获取网络请求参数的类中以key值做出判断。

    例:

    else if (self.segmented.selectedSegmentIndex == 0){        
        DetailedOfInteractionViewController * detailed = [MyUtil getViewControllerWithIdentifier:@"detailed" storyboardName:@"Interaction"];        
        detailed.theQuestion = self.questionInfo[indexPath.row];
    //        detailed.isMyQuestions = NO;                
    //判断childId和账号登录时的childId是否相同,如果相同就表示是自己回答的问题,不相同就不是        
    NSString * childId = self.questionInfo[indexPath.row][@"childId"];       
    NSString * myChildId = [MyUtil getObjectForKey:DATA_LOGIN_CHILDID];        
    if ([childId isEqualToString:myChildId]) {            
        detailed.isMyQuestions = YES;        
    }else{            
        detailed.isMyQuestions = NO;        
    }
    

    252.reuseIdentifier,实际上可以理解为,只是作为tableView的一个重用标识,作记号用,并不是说一定要找到某一处标识过相同字符的控件来调用不可,只是同类的标识而已

    253.重用机制调用的就是dequeueReusableCellWithIdentifier这个方法

    254.Talk is cheap. Show me the code.

    255.“在多写代码的同时,我们也要注意不要”重复造轮子”,尽量保证每次写的代码都能具有复用性。在代码结构因为业务需求需要变更时,及时重构,在不要留下技术债的同时,我们也要多思考如何设计应用架构,能够保证满足灵活多变的产品需求。
    在多次重构和思考的过程中,我们就会慢慢积累出一类问题的“最佳实践”方式,成为自己宝贵的经验。”

    256.修改textField的placeholder字体的颜色和大小

    textField.placeholder = @"username is in here!";  [textField setValue:[UIColor redColor] forKeyPath:@"_placeholderLabel.textColor"];  
    [textField setValue:[UIFont boldSystemFontOfSize:16] forKeyPath:@"_placeholderLabel.font"];
    
    

    257.用来隐藏navigationBar
    self.navigationController.navigationBarHidden = YES;

    258.单一的点击操作其实设不设置delegate为self都是一样的

    259.tableView的cell里隐藏图片直接设置hidden的bool值就可以了,不用在cell类里重新写方法

    260.设置button的selected之后,要把button类型改为custom自定义的

    261.质量与速度不可得兼吗,我觉得并不是,冲要条件是时间。事前做好准备,便可兼顾。

    262.在有scrollView的前提下,设置屏幕居中,要以scrollView为参照物,而不是view

    263.git冲突的时候=====下面是别人的,head到=====这里面是自己的

    264.关于静态tableView,所谓的静态就是指不通过代码的方式来创建,主要是通过storyboard可视化配置。

    265.在init里初始化,比didLoad里靠谱点

    266.去除NavigationBar下面的线

    self.navigationController.navigationBar.barStyle = UIBaselineAdjustmentNone;
    
    
    

    267.代码规范:else前后都有空格

    268.count是数量,自然是从1开始,而row之类的是下标,自然是从0开始的,不要加错了。比如:array.count +2,array里面有3个元素,那么,3+2就是5, 而array.count+2 == indexPath.row的时候,左边表示5,而右边表示5的时候其下标恰恰是4(因为从0开始计算),所以就会造成一个计算上的误差,这点需要注意

    269.如果在进行网络请求时tableView界面突然崩掉并且意外断点没有指向任何错误处,很可能是在cell中取值赋值时出了问题,比如讲一个字典直接当成数组的值赋值给某个字符串

    270.计算label自适应cell高度的时候,网络请求所得到的值记得要通过数组传递过去计算字符串的高度,不要传成字典,这样计算的是字典的高度

    271.tableView的cell的单选效果,几句代码就ok,网上的方法都太垃圾了

    -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
         GDFollowUpTableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:@"FollowUp"];                
         cell.selectionStyle = UITableViewCellSelectionStyleNone;//点击时无色        
         cell.message = self.array[indexPath.row][@"CONTENT"];                    
         if (self.chooseFlag == indexPath.row){//判断是否被选中            
             cell.okButton.hidden = NO;        
         } else {            
             cell.okButton.hidden = YES;        
         } 
     }
     -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{    
         self.chooseFlag = indexPath.row;        
         [self.tableView reloadData];
     } 
     
     
     

    272.任何的状态判断都可以用全局状态保存来判断

    273.如果网络请求持续出错,而参数和地址又没有问题,可以检查参数名称是否全部为大写,后台参数名全部为大写,大小写未区分会报错

    274.有个发现的小技巧,点击outLayout的updataFram可以让imageView自适应图片大小,就不用再调整图片清晰度了

    275.

    self.tableView.tableFooterView = [[UIView alloc] init];//初始化tableFooterView,达到去掉没有数据的cell的目的
    

    276.Swift 语言带来了众多函数式编程的特性

    277.状态是函数的魔鬼,无状态使得函数能更好地测试

    278.“有一些人总是追赶着技术,有什么新技术不管三七二十一立马就用,结果被各种坑。又有一些人,总是担心新技术带来的技术风险,不愿意学习。结果现在还有人在用 MRC 手动管理引用计数。而我想说,我们需要保持的是一个拥抱变化的心,以及理性分析的态度。在新技术的面前,不盲从,也不守旧,一切的决策都应该建立在认真分析的基础上,这样才能应对技术的变化。”

    279.简单工厂模式深入分析: 
    简单工厂模式解决的问题是如何去实例化一个合适的对象。  
    简单工厂模式的核心思想就是:有一个专门的类来负责创建实例的过程。  
    具体来说,把产品看着是一系列的类的集合,这些类是由某个抽象类或者接口派生出来的一个对象树。而工厂类用来产生一个合适的对象来满足客户的要求。  
    如果简单工厂模式所涉及到的具体产品之间没有共同的逻辑,那么我们就可以使用接口来扮演抽象产品的角色;如果具体产品之间有功能的逻辑或,我们就必须把这些共同的东西提取出来,放在一个抽象类中,然后让具体产品继承抽象类。为实现更好复用的目的,共同的东西总是应该抽象出来的

    280.简单工厂模式(Simple Factory Pattern)属于类的创新型模式,又叫静态工厂方法模式(Static FactoryMethod Pattern),是通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。

    281.回调是执行后回调“我”来完成,通知是通知后“我”主动去完成

    282.在tableView的didSelecte里传值的时候,不能在cellForRowAtIndexPath里赋值了再拿来用,因为cellForRowAtIndexPath会给每一个都赋值,而didSelecte只是当前选中的cell,会造成内存问题报错

    283.如果xcode archive 一直是灰色的,当配置是模拟器的时候, archive就是灰色的。当把配置选择为device才能选 archive。

    284.object-c中绝对值是labs()形式的,c中是abs()

    285.这个方法可以随着输入实时改变

    -(void)textViewDidChange:(UITextView *)textView
    
    

    286.目前应用开发的核心就是数据处理和展示

    287.当重写控件时,控件类型声明的参数名,如:(textField *)textFiled,所打印出的数据为整个控件的全部属性的数据,如fram,内部属性等

    288.善用回调

    289.其实很多东西并没有别人说的那样复杂,方法多种多样,如果觉得功能简单,那么实现出来的方法就绝对不会难,其实每次自己去想一想功能的执行逻辑和顺序,很多东西就都迎刃而解了

    290.在全局当中声明一个cell时,在viewDidLoad里将其属性设置好,不要忘记将自定义的cell注册,然后使用其标识符,在cellForRowAtIndexPath方法中如果只有一行cell,那么直接return这个cell就可以了,不需要再进行任何设置了

    291.业务逻辑要熟悉清楚

    292."刚刚说到,在类中完全使用 _property 的方式来访问私有成员变量,是不会有内存管理上的问题的。但是使用 self.property 的方式来访问私有变量是不是也是一样不会有内存管理上的问题呢?确实也是,但是有一点需要注意:我们最好不要在 init 和 dealloc 中使用 self.property 的方式来访问成员变量,这一点是写在苹果的官方文档里的,我在以前的文章里也介绍过。(见:《不要在init和dealloc函数中使用accessor》)
    所以,如果你用 self.property 来访问私有成员变量。那么你需要注意,在 init 和 dealloc 中不使用这种方式。这其实对程序员来说是一个负担,你需要不停提醒自己有没有犯错。如果你使用完全的 _property 的方式来访问私有成员变量,就不用想这一类问题了。"

    293."我之前 Review 过一个同事的 iOS 端代码,那个同事喜欢把 table view 的数据另外封装成一个类,而我觉得这些数据其实就是一个数组,没必要进行这一层封装,最终我们争论了比较久。我的观点是,一切隐藏都是对代码复杂性的增加,除非它带来了好处,例如达到了代码复用,提高了代码的可维护性等,否则,没有好处的封装只会给代码阅读理解带来成本。就我现在的经历中,大部分的 table view 的数据都可以放在一个数组中,没必要把这个数组封装起来,另外提供一套操作这个数组数据的方法。"

    294."我之前从来没想到过这两者之间的速度和应用体积会有很大差别。不过一个同行(来自国外著名的社交网络公司)告诉我,他们公司发现二者还是有不小的差距,如果你们的应用需要做一些深度优化,可以考虑一下把 self.property 换成 _property。但我觉得,大部分应用都应该是不需要做这种深度优化的。"

    295."是的,如果用 _property 这种写法,就不能使用 KVO 和 KVC 了。但是我得反问一下,在一个类的内部,KVO 自己的私有成员变量算是一个好设计吗?我们讲类要”高内聚,低耦合”,KVO 是为了实现观察者模式,让对象之间相互解耦的。如果把 KVO 用在类的内部,KVO 自己的私有成员,我认为其实这不是一个很好的设计。"

    296."在 Swift 中,引入了 Computed Properties 的概念,其实这在 Objective-C 中也有,只是没有专门给它名字。如果一个 property 我们提供了对应的 setter 和 getter,并且没有直接使用其对应的 _property 变量,那么这个 property 就是所谓的 Computed Properties。
    是的,在类的内部如果直接使用 _property 形式,也无法使用 Computed Properties 了,但我认为这影响不大。其实 Computed Properties 也就是一层对数据存取的封装,我们另外实现两个函数,分别对应数据的 setter 和 getter 功能,就可以达到同样的效果。"

    297."直接用私有变量有个需要特别注意的地方,在 block 里直接写 _property 相当于 self->_property,虽然没写 self,但是暗含了对 self 的retain,容易造成循环引用。要记得用 weakSelf/strongSelf 大法。这一点确实是被很多人忽视的"

    298."上面提到的这些问题都是小问题,影响不大。但是代码风格的统一却是大问题。所以不管你们项目中使用的是 self.property 风格还是 _property 风格,问题都不大,但是如果你们同时使用这两种风格,那么就非常不好了。"

    299.在tabelViewController中的顶部加一个view

    UIView * sengmentView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.tableView.frame.size.width, 68)];
    self.tableView.tableHeaderView = sengmentView;//将tableView的headerView替换成我们要添加的view
    
    
    

    300.改变滑动删除的文字内容

    -(nullable NSString *)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath
     {    
        NSString * string = @"设置";    
        return string;
     }
     
     
     

    301.在tableView的不同section之间加上header

    -(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{ 
       if (section == 0) 
    {        
        return @"";   
     } else {        
        return @" ";    
    }
    

    302.collectionView cell上下左右边距

    return UIEdgeInsetsMake(1, 13, 1, 1);
    

    303.在 Swift 的世界里,一切皆对象

    304.编程和科研是很相近的两个职业

    305.在重新开发版本时,如果不使用cocospod,那么,在引用之前使用过的第三方类时,只需要将类复制到新的项目的文件夹内即可,不要复制整个文件夹,会造成不必要的麻烦

    306.复制和拷贝在mac环境下的效果是不一样的

    307.在设置tabBar之后,要在appDelegate里给其制定一个rootViewController

    308.//获取当前版本号

    //获取当前版本号
        NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary];
        NSString *app_Version = [infoDictionary objectForKey:@"CFBundleShortVersionString"];
        
        
    

    309.当tableView底部出现大量空白又不想要时,可以把tableView的view的背景色设为clean,然后将controllerView的背景色设置一下就可以了

    310.关闭tableView滚动,实际上tableView是一个scrollView

    self.tableView.scrollEnabled = NO; 
    

    311.顺便说一句,当隐藏tabBar的时候,如果controllerView上有tableView,那么此时你需要用下面这段代码来让tableView顶部不留下空白部分,适配时,scrollView顶部有空缺,也可使用此方法解决,意思是关闭scrollView的自动适配:

    self.automaticallyAdjustsScrollViewInsets = NO;
    
    

    312.关于collectionView使用时需要注意的地方

    • 注意,每一个item之间是存在间距的,所以要预留出间距,否则会超出预设宽度

    • 还有一点,collectionView的默认颜色就说黑色,出现黑色不是黑屏,只要调整一下背景颜色即可

    313.如果要使用接口数据赋值,那么直接在网络请求里赋值即可,在外面赋值由于是异步情况会导致无法及时获得

    314. 网络解析获取后台的图片

    NSString * picture = [NSString stringWithFormat:@"%@%@%@", SERVER_IP,self.array[indexPath.row][@"Picture"],API_KEY];
    cell.goodsImage.image = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:picture]]];
    
    

    315.判断switch是否处于开闭状态

    cell.switch.on = YES;
    cell.switch.on = NO;
    
    
    

    316.跳转返回时有tableView的界面出现下移

    //处理方法
    -(void)viewWillAppear:(BOOL)animated
    {
        self.automaticallyAdjustsScrollViewInsets = NO;
    }
    
    

    317.向后台上传图片转格式

    NSData * imageData = UIImageJPEGRepresentation(self.goodsImage.image, 0.3);
    //如果是需要转换为base64的格式,还需要加一句
    goodsImage = [imageData base64EncodedStringWithOptions:0];
    
    
    

    318.一般情况下,用做网络请求的paramaters字典中只存储字符串形式的参数

    319.判断字典中元素为空

    NSDictionary * dic;
    
    if([dic count] == 0)
    
    {
    
        //....
    
    }
    
    

    320.如何查看后台返回的数据储存类型
    直接打印出 responseObject的属性查看
    例如出现:<__NSCFArray 0x7fcedb4571a0> 说明返回类型为数组
    不过一般情况下来说,后台返回的基本都是以数组的形式居多,但也有例外,所以具体情况具体分析,一切以数据为中心
    如果只返回了诸如:

    Printing description of self->_dic:
    {
        BankCardNumber = 6214651002673886;
        BankName = "\U91cd\U5e86\U519c\U6751\U5546\U4e1a\U94f6\U884c.\U6c5f\U6e1dIC\U501f\U8bb0\U5361";
        CreateTime = "/Date(1458116833893)/";
        ID = 14;
        Phone = 13527310193;
        TypeId = 1;
        UserId = 171;
        UserName = "\U54e5\U54e5";
    }
    

    这种情况,如果是用字典储存,那么只要去取数组的第0个就可以了,用数组储存就不需要特殊处理

    321.判断后台返回的对象是否为空的判断方法

    if (responseObject isEqual:[NSNull null])
    
    

    322.iOS开发gcd问题
    并发队列可以保证按照加入队列的顺序取出任务,但是能不能保证这些任务就是按照顺序执行的。比如说任务1先加入队列,任务2后加入队列,有没有可能这两个任务被取出之后任务2先执行呢?
    答案是:任务1一定先开始执行 (不一定先结束).

    323.进入界面就要调用接口的方法最好写在这里面

    -(void)viewWillAppear:(BOOL)animated
    
    

    324.意外断点打在哪里,几乎就可以断定问题就出现在哪里,只要注意查看断点停留出的地方处理方式,就可以解决问题

    325.评分

    NSInteger score = [self.replyArray[indexPath.section][@"Value"] integerValue];
        //            CGFloat xoffset = 0.0f;
        for (int i = 0; i < 5; i++) {
            UIImageView *imgview = (UIImageView *)[cell.contentView viewWithTag:i + 11];
            if (i < score ) {
                imgview.image = [UIImage imageNamed:@"xing_okimg"];
            } else {
                imgview.image = [UIImage imageNamed:@"xing_noimg"];
            }//                
    //            imgview.image = [UIImage imageNamed:@"xing_okimg"];
    
    

    326.关于cell自适应label高度出现布局错乱问题
    1.检查outLayout是否约束正确,如果该行cell高度不见,请检查底部约束
    2.声明一个全局的cell

    @interface SSShopEvaluationViewController ()<UITableViewDataSource, UITableViewDelegate, notReplyDelegate>
    {
        SSEvaluationTableViewCell * myCell;
        SSAlreadyReplyTableViewCell * alreadyCell;
    }
     

    记得在viewDidLoad里注册

    myCell = [self.tableView dequeueReusableCellWithIdentifier:@"Evaluation"];
    
    
    

    327.视图效果应该在视图里写,控制器就让它负责数据

    328.同种类型的处理方法写的太多会导致机械化的习惯,思维会变得僵化,整个思路模式容易固化,不要被日常工作的繁琐拖垮了思考的灵性

    329.永远不要试图在cell的-(void)drawRect:(CGRect)rect方法中进行状态保存,一旦写入这个方法中就算写死了,再也改变不了。
    就比如一个用户交互的开关状态,不要写在这里面,去在controller的cell方法中去判别

    330.在做cell自适应label高度时候,一定要固定label的宽度,不需要担心宽度固定小机型会超出等问题,因为在cell中是不会超出的,且左右做了约束已经

    331.swift被赋值的对象如果不发生改变或不被修改,那么就将其声明为let常量

    332.NSString stringWithFormat 不足多少位时自动补齐0

    self.mCurrentTimeLabel.text = [NSString stringWithFormat:@"d:d",minute,seconde];
    不足两位时用0补齐
     
     
    float f = 12.34;
    string = [NSString stringWithFormat:@".2f",f];
    NSLog(@"%@", string);
    _____12.34
    _代表空格   这样只有使用字符串替换的方法用0替代空格
    
    
    

    333.swift点击按钮界面跳转

    @IBAction func goListButton(sender: UIButton) {
            let myStroyBoard = self.storyboard
            let listView:UIViewController = (myStroyBoard?.instantiateViewControllerWithIdentifier("list"))!
    //        self.presentViewController(listView, animated: true, completion: nil)
                    //上面这句表示,从下向上跳出一个controller
            self.navigationController?.pushViewController(listView, animated: true)
        }
        
        
        

    334.swift UILabel居中

    label1.textAlignment=NSTextAlignment.Left  
    label2.textAlignment=NSTextAlignment.Center  
    label3.textAlignment=NSTextAlignment.Right 
    
    
    

    335.swift中tableView的cell点击无色

    cell.selectionStyle = UITableViewCellSelectionStyle.None
    
    
    

    336.关于swift中let 和 var的用法简单距离

    //读取数组中的颜色
    var colorArray:[UIColor] = [UIColor .greenColor(), UIColor .blackColor(), UIColor.orangeColor(), UIColor.grayColor(), UIColor.yellowColor(), UIColor.blueColor(), UIColor.brownColor(), UIColor.blackColor(), UIColor.purpleColor(), UIColor.redColor()]
     
    let value = Int(arc4random() % 10)
    let color = self.colorArray[value]
    button.setTitle(self.array[value], forState: UIControlState.Normal)
    button.setTitleColor(color, forState: UIControlState.Normal)
    

    337.tableView跟随cell数量展开

    self.tableViewHeightConstraint.constant = cellNumber * cellHeight;
    即tableView的高度约束等于cell的数量*cell的高度
    

    338.后台图片读取到url但是显示不出来时,就是同步和异步的问题,因为存在网络延迟导致图片无法同步读取,所以要使用异步方法来处理

    339.当url地址有问题为nil时的解决方案

    解决 代码如下:
     NSString * url = [NSString stringWithFormat:@"网址"]; 
     NSString * newUrl = [url stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    

    340.关闭tableView滑动

    self.tableView.scrollEnabled = NO; 
    
    

    341.obeject-c继承

    #import <Foundation/Foundation.h>
    #import "Shape.h"
    @interface Rectangle : Shape{
        int size;
    }
    
    

    342.label自动换行

    //老方法已经过时,被替换成如下方法(行数记得设为0)
    [self.applyInfoLabel setLineBreakMode:NSLineBreakByWordWrapping];
     
    基本上老的UI方法都会被替换成NS方法,当方法被替换找不到头绪时不妨试试
    
    

    343.在存在scrollview的情况下,想要实现控件始终跟随屏幕底部的效果,只需要将该控件和scrollview始终处于同级状态下设置约束即可

    344.今天在实现判断星星数量的时候遇到一个问题,从而引出接触到一个新的概念,我姑且称之为控件数组。就是在某些时候存在大量同类型控件关联大量输出口需要使用类似collection但又不能使用的时候的一种替换方案。
    使用方法:

    1.关联一个输出口,在Outlet处选择Outlet Collection,然后填写名称,即声明成功一个该控件类型的数组
    2.之后把大量相同的类型控件都关联到该输出口合并,从而组成数组中的元素,使用时按照普通数组的使用方法即可
    代码demo:
    @property (strong, nonatomic) IBOutletCollection(UIImageView) NSArray *xing;
     
    NSInteger score = [self.detailePlan[@"DIFFICULTY"] integerValue];
        for (int i = 0; i < 5; i++) {
            UIImageView * imageView = (UIImageView *)self.xing[i];
            if (i < score) {
                imageView.hidden = NO;
            } else {
                imageView.hidden = YES;
            }
    //        imageView.hidden = NO;
        }
        
        

    345.通常我们使用viewWithTag如下情形:

    如果我们用了一个父View,上面放了多个子view, 每个子view都通过从0开始的Tag值来进行标志,以便于后期在像View上直接使用viewWithTag:tag值来取各个子View

    而在用[父view viewWithTag:0]取到的view, 发现不是子view, 而是这个父view, 后来才想起苹果文档上提到过一次,tag值较小的,如0-100为苹果保留使用, 而0就是保留着给自己这个view使用的。

    对于其它的view, 如scrollview, 则更上面的0, 1,2 都可能会是保留值。 

    346.关于平行对齐时的约束
    不需要说要垂直v的约束,只要约束参照物相同的top即可

    347.cell的优化写法

    可以声明一个数组,直接从controller的接口中保存返回的数据
    @property (nonatomic, strong) NSDictionary * plan;
     
    然后在cell中集中处理显示(并不是处理数据,只是负责数据显示)
    -(void)setPlan:(NSDictionary *)plan
    {
        _plan = plan;
        NSInteger type = [plan[@"TYPE"] integerValue];
        NSString * bgImageName = [NSString stringWithFormat:@"health_plan_0%@", @(type)];
        self.bgImageView.image = MyImage(bgImageName);
        self.titleLabel.text = getNoneNilString(plan[@"TITLE"]);
        self.subtitleLabel.text = getNoneNilString(plan[@"SUBTITLE"]);
        self.joinedLabel.text = [NSString stringWithFormat:@"%@人已加入", plan[@"TOTAL"]];
        id status = plan[@"STATUS"];
        if (status && !isEmpty(status) && [status integerValue] == 0) {
            self.statusImageView.hidden = NO;
        }else{
            self.statusImageView.hidden = YES;
        }
    }
    
    

    348.字体加粗
    选择font右边的"T"图标,选择加粗bold

    349.多个Button适配不同机型间距约束
    主要是控制左右的间距问题,为了解决不同机型不同宽度对控件造成的影响

    350.如何跳转到一个tabBar上

    TabBarViewController * tabBar = [[TabBarViewController alloc] init];
            [self presentViewController:tabBar animated:YES completion:^{
                
            }];
            
            
            

    351.tableView的cell为nil时如何处理
    多半是之前关联在cell上的空间被删除之后没有删除其对应的关联,去把关联一并删除即可

    352.当某个cell在该tableView中只存在一个的时候,不需要使用复用

    353.如果出现cell滚动很卡的情况
    是因为在加载网络图片或其他东西的时候使用了同步方法,更换为异步

    354.Initwithnibname执行顺序先于viewdidload

    355.再次重申:NSString是只读的,不可修改。
    想修改请用可变字符串NSMutableString

    356.清空数组的方法 技巧 
    Xcode中,会有两种Array, NSArray以及NSMutableArray

    在清空的过程中,千万不要使用 Array == nil; 这样不仅清空了数组,同时也把memory释放了,这个object就不存在了

    正确的做法是
    利用
    removeAllObjects; 这样就可以得到想要的效果了

    使用nil将会删除整个数组:

    [NSArray removeAllObjects];

    ---- 最近一直忙于项目,总结就顺手记载了笔记里,

    展开全文
  • android开发过程中遇到的问题

    万次阅读 2017-07-31 10:22:24
    记录android开发过程中遇到的问题。 1.一个xml中能否使用同一个include多次 http://www.apkbus.com/android-104152-1-1.html android中include标签的使用 ... android bu

    记录android开发过程中遇到的问题。

    1.在一个xml中能否使用同一个include多次

    http://www.apkbus.com/android-104152-1-1.html

    android中include标签的使用

    http://blog.csdn.net/wangljgood/article/details/6556175

    2. android button在 linerlayout中底部居中
    把button外的权重设为1.0
    
    3.button shape
    http://www.cnblogs.com/gzggyy/archive/2013/05/17/3083218.html
    
    4. animation
    http://www.eoeandroid.com/forum.php?mod=viewthread&tid=564
    http://blog.csdn.net/feng88724/article/details/6318430
    http://www.360doc.com/content/13/0102/22/6541311_257754535.shtml
    http://blog.csdn.net/aminfo/article/details/7847761
    http://blog.csdn.net/xsl1990/article/details/19125193
    http://www.cnblogs.com/bavariama/archive/2013/01/29/2881225.html
    http://www.oschina.net/question/97118_34523
    http://www.eoeandroid.com/thread-67329-1-1.html
    
    6.imageview 按比例缩放
    android:scaleType是控制图片如何resized/moved来匹对ImageView的size。
    
    ImageView.ScaleType / android:scaleType值的意义区别:
    
    CENTER /center  按图片的原来size居中显示,当图片长/宽超过View的长/宽,则截取图片的居中部分显示
    
    CENTER_CROP / centerCrop  按比例扩大图片的size居中显示,使得图片长(宽)等于或大于View的长(宽)
    
    CENTER_INSIDE / centerInside  将图片的内容完整居中显示,通过按比例缩小或原来的size使得图片长/宽等于或小于View的长/宽
    
    FIT_CENTER / fitCenter  把图片按比例扩大/缩小到View的宽度,居中显示
    
    FIT_END / fitEnd   把图片按比例扩大/缩小到View的宽度,显示在View的下部分位置
    
    FIT_START / fitStart  把图片按比例扩大/缩小到View的宽度,显示在View的上部分位置
    
    FIT_XY / fitXY  把图片不按比例扩大/缩小到View的大小显示
    
    MATRIX / matrix 用矩阵来绘制,动态缩小放大图片来显示。
    

    android如何获取时间差?

    7.ImageLoader must be init with configuration before using 错误解决方法

    imageLoader.init(ImageLoaderConfiguration.createDefault(MainActivity.this));

    8.java.lang.StackOverflowError

    StackOverflow 这个问题一般是你的程序里头可能是有死循环或递归调用所产生的;

    9.java.lang.ClassCastException: android.app.Application cannot be cast to MyApplication问题

    出这个异常的原因是在项目中添加了新application类(public class Application extends android.app.Application)之后,没有在manifest.xml中添加该类的声明,所以编译器抛出异常: java.lang.ClassCastException: android.app.Application cannot be cast to android_serialport_api.sample.Application

    解决方法,在manifest.xml中添加: [html] view plaincopy

    <application  
     android:name="xxx.MyApplication">  
    
    10. event.getAction();
    11. Found both android-support-v4 and android-support-v13 in the dependency list.
    12. 怎么关联android-support-v4源码
    问题:使用viewpager或者fragmentActivity等一些v4包下的类,当我们按F3时无法查看到源码,这个时候就需要我们关联该源码,该源码的关联与android源码的关联不一样。
    
    解决办法:
    
    1、首先在工程的libs目录下创建一个配置文件:android-support-v4.jar.properties(建议这样)
    
    2、查找自己安装的SDK的目录下的android-support-v4的src源码地址
    
    本人的为:D:\eclipse\android-sdk\extras\android\compatibility\v4\src
    
    3、编辑android-support-v4.jar.properties文件为:(注意是双斜杠)
    
    src = D:\\eclipse\\android-sdk\\extras\\android\\compatibility\\v4\\src
    
    4、关闭自己的工程后再打开,此时进去选择ViewPager后F3就能看到源码了。
    
    5、恭喜:android-support-v4 源码已经成功的关联上。
    

    还有种方式,http://blog.csdn.net/leon90dm/article/details/8521939,没试。

    上面是eclipse中的做法,在androidstudio中的使用更简单。

    13.eclipse 修改设置Ctrl+Shift+F长度
    在window的Preferences中的Java->Code Style->Formatter
    
    到了这一步就是找到Ctrl+Shift+F的格式化模板了,这里不能直接修改。因为是eclipse默认的模板,是只读的。
    
    我们可以new 一个Formatter,然后点击edit就可以修改模板。
    
    我修改模板主要就是修改那个Ctrl+Shift+F后,把我的代码换多行了。
    
    修改选项卡中的Line Wrapping选项卡, 有一个Maximum line with: 80(默认);
    
    这里默认是80我们可以把它修改成120的,那样不超过120个字符就不会被换行了!
    
    其他自己需要的格式都可以在这里面修改。当然你还可以导出你自定义的格式,导出的是xml格式的。以后在其他地方
    
    还可以导入。这样就不用再自定义了。
    
    14. android-develop 镜像路径[重点推荐]
    http://androiddoc.qiniudn.com/
    

    google,被和谐后,通过vpn或者访问上述镜像路径。

    15.fragment Andriod开发技巧——Fragment的懒加载

    一个Activity里面可能会以viewpager(或其他容器)与多个Fragment来组合使用,而如果每个fragment都需要去加载数据,或从本地加载,或从网络加载,那么在这个activity刚创建的时候就变成需要初始化大量资源。这样的结果,我们当然不会满意。那么,能不能做到当切换到这个fragment的时候,它才去初始化呢?

    答案就在Fragment里的setUserVisibleHint这个方法里 http://blog.csdn.net/maosidiaoxian/article/details/38300627

    结合fragment的hide和show使用。

    16.让多个Fragment 切换时不重新实例化

    http://www.yrom.net/blog/2013/03/10/fragment-switch-not-restart/

    17. 关于Android的GridView添加headerView

    grid-with-header-list-adapter StickyGridHeaders/ http://www.eoeandroid.com/blog-696650-48907.html

    18.Eclipse设置不格式化注释
    Eclipse设置不格式化注释
    

      注释中写点带格式的文字,format后全乱了,解决办法如下:   Windows -> Preferces -> java -> Code Style -> Formatter -> Edit -> Comments   取消勾选“Enable Javadoc comment formatting”.

    19.android-Ultra-Pull-To-Refresh
    20.Linux动态gif图的录制
    byzanz  
    byzanz的安装与使用
    
    Ubuntu下安装
    
      sudo add-apt-repository ppa:fossfreedom/byzanz
    sudo apt-get update sudo apt-get install byzanz
    
    你可以通过如下命令来完成录制过程:
    byzanz-record -d 40 -x 0 -y 0 -w 400 -h 320 byzanz-demo.gif
    
    其中:
    
        -d 40 为录制的时长为 40 秒
        -x 0 录制区域的横坐标
        -y 0 录制区域的纵坐标,记住:屏幕右上角为原点(0,0)
        -w 400 录制区域的宽度
        -h 320 录制区域的高度
    
    byzanz-demo.gif 保存的文件名
    
    详细参数可通过byzanz-record --help查看。
    http://www.tuicool.com/articles/YFJrem
    
    另外:windows下 GIF屏幕录像机 V2.0
    
    22. viewpage 无线循环

    http://www.cnblogs.com/xinye/archive/2013/06/09/3129140.html

    23.public void onPageScrollStateChanged(int arg0)
    此方法是在状态改变的时候调用,其中arg0这个参数有三种状态(0,1,2)。arg0 ==1的时辰默示正在滑动,arg0==2的时辰默示滑动完毕了,arg0==0的时辰默示什么都没做。
    
    当页面开始滑动的时候,三种状态的变化顺序为(1,2,0)
    
    24.

    在eclipse.ini文件中加入 -Dorg.eclipse.swt.browser.DefaultType=mozilla 然后clean一下就OK了 执行clean命令

    26.viewpager实现画廊(一屏多个Fragment)效果
    27.svn命令

    通过指令添加文件,每次都到对应文件夹 svn add。这样如果需要add的文件不在一个文件夹时会很麻烦,通过下面的 --force 可以方便的添加。 $ svn add * --force http://developer.51cto.com/art/201005/201633.htm

    当然现在studio集成乐svn git等代码管理工具,很方便,可以直接使用。

    28.Array constants can only be used in initializers
    int CC [] ={1,2,3};   数组定义并附初始值的时候,数组的长度就定了,长度是3
     而且数组重新赋值不能再像定义的时候那样
    而要一个一个地更改
    CC[0]=1;
    CC[1]=2;
    CC[2]=3;
    Array constants can only be used in initializers  好像是说数组不能用于初始化
    
    29.android 插件化
    30.scrollview在内容较少时也可以滚动
    在XML为ScrollView添加属性android:overScrollMode="always"即可
    
    31.gridview/listview 点击时 android默认背景是黄色的,如何去掉选中时的黄色背景
    方法一,在控件被初始化的时候设置
    
    gridView.setSelector(new ColorDrawable(Color.TRANSPARENT));
    listView.setSelector(new ColorDrawable(Color.TRANSPARENT));
    
    方法二,在布局文件中设置listSelector属性
    
     
    
    <GridView
    	android:listSelector="@android:color/transparent"
    	android:numColumns="auto_fit"
    	android:columnWidth="50dp"
    	android:stretchMode="spacingWidth"
    	android:layout_weight="1.0"
    	android:layout_height="0dip"
    	android:layout_width="match_parent"/>
    
    <ListView
    	android:listSelector="@android:color/transparent"
    	android:layout_height="match_parent"
    	android:layout_width="match_parent"/>
    
    当然也可以定制化自己想要的效果。
    
    推荐使用方法二,解耦逻辑代码与布局文件。 
    

    另外listview还有两个基础问题 问题1:

    	       listview在拖动的时候背景图片消失变成黑色背景。等到拖动完毕我们自己的背景图片才显示出来。
    
    	解决办法:
    
    	      xml中: android:scrollingCache="false"  或者 android:cacheColorHint="#00000000"
    
    	     代码中: setScrollingCacheEnabled(false)  或者 setCacheColorHint(0)  或者setCacheColorHint(Color.TRANSPARENT);
    
    	问题2:
    
    	    listview的上边和下边有黑色的阴影。
    
    	解决办法:
    
    	   xml中: android:fadingEdge="none"
    
    	  代码中:setFadingEdgeLength(0);
    
    32.ScrollView仅支持一个子项,报错ScrollView can host only one direct child
    解决办法:
    
    在ScrollView 中设LinearLayout为子项 ,将其它View放入LinearLayout。
    
    33.viewpager 设置间距和缓存

    viewPager.setOffscreenPageLimit(TOTAL_COUNT); viewPager.setPageMargin(getResources().getDimensionPixelSize(R.dimen.page_margin));

    34.一级缓存和二级缓存是什么意思??

    静态ram缓存叫一级缓存,而把后来增加的动态RAM叫二级缓存。 RAM分两种, 一种是静态RAM,SRAM;一种是动态RAM,DRAM。前者的存储速度要比后者快得多,我们现在使用的内存一般都是动态RAM。

    有的菜鸟就说了,为了增加系统的速度,把缓存扩大不就行了吗,扩大的越大,缓存的数据越多,系统不就越快了吗

    缓存通常都是静态RAM,速度是非常的快,

    但是静态RAM集成度低(存储相同的数据,静态RAM的体积是动态RAM的6倍),

    价格高(同容量的静态RAM是动态RAM的四倍),

    由此可见,扩大静态RAM作为缓存是一个非常愚蠢的行为,

    但是为了提高系统的性能和速度,我们必须要扩大缓存,

    这样就有了一个折中的方法,不扩大原来的静态RAM缓存,而是增加一些高速动态RAM做为缓存,

    这些高速动态RAM速度要比常规动态RAM快,但比原来的静态RAM缓存慢,

    我们把原来的静态ram缓存叫一级缓存,而把后来增加的动态RAM叫二级缓存。

    一级缓存和二级缓存中的内容都是内存中访问频率高的数据的复制品(映射),它们的存在都是为了减少高速CPU对慢速内存的访问。 通常CPU找数据或指令的顺序是:先到一级缓存中找,找不到再到二级缓存中找,如果还找不到就只有到内存中找了

    35.性能优化:使用SparseArray代替HashMap<Integer,Object>

    http://blog.csdn.net/haukey/article/details/8200404

    36.代码规范

    http://liuzhichao.com/p/1781.html#more-1781

    37. // Disallow Parent Intercept, just in case
                        ViewParent parent = getParent();
                        if (parent != null) {
                            parent.requestDisallowInterceptTouchEvent(true);
                        }
    
    38.linerlayout布局,如何把一个view指定父view的底部
    在纯属布局中,将除最底部以外的的view都设置weight为1就可以了。
    
    39.editview 左侧加drawable

    如果只是在左边或者右边加图片 可以用EditeView 的一个属性; android:drawableLeft在text的左边输出一个drawable 如果在中间或者随意加图片的话,需要你重写EditView来实现图文混排!

    40.加密算法

    41.01-07 15:34:23.160: E/AndroidRuntime(1932): Caused by: java.lang.UnsatisfiedLinkError: Couldn't load AES: findLibrary returned null

    01-07 15:37:43.240: E/AndroidRuntime(2537): java.lang.UnsatisfiedLinkError: Native method not found: com.jetsun.hbfc.core.AESCoder.decryptCNew:()Ljava/lang /String;

    01-07 15:37:43.230: D/dalvikvm(2537): No JNI_OnLoad found in /data/data/com.jetsun.hbfc/lib/libAES.so 0x4160abe0, skipping init

    01-07 15:37:43.230: W/dalvikvm(2537): No implementation found for native Lcom/jetsun/hbfc/core/AESCoder;.decryptCNew:()Ljava/lang/String;

    return makes pointer from integer without a cast [enabled by default]

    01-07 17:51:47.520: D/dalvikvm(12438): No JNI_OnLoad found in /data/data/com.jetsun.hbfc/lib/libAES.so 0x41601a80, skipping init 01-07 17:51:47.525: I/JNIMsg(12438): jclass == NULL 01-07 17:51:47.525: I/JNIMsg(12438): step 1 : jclass Begin ok ! 01-07 17:51:47.525: I/JNIMsg(12438): encryptC == NULL 01-07 17:51:47.525: I/JNIMsg(12438): step 2 : decryptC new failed 01-07 17:51:47.525: I/JNIMsg(12438): step 2 : decryptC method prepared ok !

    41.jni基础

    android __android_log_print打印函数__源代码 http://blog.csdn.net/sno_guo/article/details/8143050 JNI字段描述符“([Ljava/lang/String;)V” http://fgsink.blog.163.com/blog/static/16716997020124310169911/ jni函数讲解http://blog.csdn.net/caimouse/article/category/661872/2 基于 Android NDK 的学习之旅----- C调用Javahttp://www.cnblogs.com/luxiaofeng54/archive/2011/08/17/2142000.html No JNI_OnLoad found in … skipping inithttp://stackoverflow.com/questions/11798054/no-jni-onload-found-in-skipping-init eclipse ndk配置详细描述http://www.cnblogs.com/chenjiajin/archive/2012/04/12/2444188.html 基于 Android NDK 的学习之旅

    汇总 ndk精华

    http://www.cnblogs.com/chenjiajin/archive/2012/04/12/2444188.htmlhttp://www.cnblogs.com/luxiaofeng54/archive/2011/08/17/2142000.htmlhttp://blog.csdn.net/caimouse/article/details/6853795http://fgsink.blog.163.com/blog/#m=0&t=1&c=fks_084071081085086066085080094095085080086066082095095068084

    42.md5 aes加密

    有固定的密钥key的AES加密 http://fenglingcorp.iteye.com/blog/586600 android Rsa 算法加 密明文--->公钥--->密文 密文-->密钥-->明文 http://blog.sina.com.cn/s/blog_6568e7880100x8r9.html java加密与解密的艺术作者http://snowolf.iteye.com/blog/379860 Android AES加密算法及其实现http://blog.csdn.net/randyjiawenjie/article/details/6587986 AES加密解密Android版http://www.cnblogs.com/carlosk/archive/2012/05/18/2507975.html

    加密方式 AES 加密模式 AES/CBC/PKCS5Padding 加密向量 iv secretkey 秘钥 编码方式 utf-8

    43.proguard的使用

    代码混淆时,不混淆的部分。

    44.socket

    Socket简单用法 http://www.cnblogs.com/harrisonpc/archive/2011/03/31/2001565.html 即时通讯
    基于xmpp openfire smack开发之openfire介绍和部署[1] http://blog.csdn.net/shimiso/article/details/8816558 Openfire+Spark聊天Demo http://www.apkbus.com/android-69413-1-1.html openfire的Android客户端实现http://download.csdn.net/detail/sky_monkey/5820879#comment

    45.音频编解码

    FFmpeg的Android平台移植—编译篇 http://blog.csdn.net/gobitan/article/details/22750719#reply

    46.f5 负载均衡
    47. 掌上指路标 —– APP架构与导航设计 http://www.yixieshi.com/ucd/13188.html

     APP导航设计的步骤主要为以下三步:

      1. APP框架整理:信息架构 or 任务分析

      2. 框架层级判断: 扁平 vs 树状

      3. 导航具体表现形式:控件形式and摆放位置

    48.移动App架构设计

    http://blog.csdn.net/uxyheaven/article/details/38041091 移动App设计之分层架构+MVChttp://www.cnblogs.com/Logen/archive/2012/11/08/2760638.html

    49.Android 精品开源项目

    http://blog.csdn.net/caesardadi/article/details/21091645

    50.使用GDB调试JNI代码

    Android NDK应用原理 http://shihongzhi.com/ndk/ NDK 开发指南---Android NDK概览http://hualang.iteye.com/blog/1135105

    51.ubuntu下搜狗输入法,使用过程中突然出现 “搜狗面板程序加载失败 请重启以使用输入法”导致无法使用

    解决方法:终端sogou-qimpanel &

    52.layout_alignBaseline的作用
    53.android:layout_weight的真实含义

    android:layout_weight的真实含义是:一旦View设置了该属性(假设有效的情况下),那么该 View的宽度等于原有宽度(android:layout_width)加上剩余空间的占比! 简单的说,就是剩余空间的权重.http://blog.csdn.net/yanzi1225627/article/details/24667299

    54.即时通讯

    基础:socket 原理: 如何保证socket长连接 http://blog.csdn.net/chengyingzhilian/article/details/7633640 android中对服务端的长连接【socket】 http://blog.csdn.net/yaya_soft/article/details/11778593

    1.Android 基于Socket的聊天应用(二)  http://www.cnblogs.com/-run/archive/2012/04/07/2434837.html#!comments   下载demo
    Ubuntu 14.04下MySQL服务器和客户端的安装  http://www.linuxidc.com/Linux/2014-10/107912.htm
    Ubuntu 安装mysql和简单操作   http://www.cnblogs.com/zhuyp1015/p/3561470.html
    如何在mysql中创建数据库  http://www.360doc.com/content/11/0719/18/2104556_134548635.shtml
    Java连接MYSQL 数据库的连接步骤  http://database.51cto.com/art/201006/204217.htm
    
    
    2.基于XMPP的即时聊天项目  需要google账号,目前无法登录 本项目是一套基于android+asmack+openfire+xmpp的安卓即时聊天服务端,项目直连google talk服务器,可以使用谷歌帐号登录客户端,测试需要至少两个谷歌帐号。在程序里添加好友即可聊天
    
    3.Android手机通过socket与pc通信 http://blog.csdn.net/tobacco5648/article/details/7742295
    
    55.ubuntu显示端口占用、正在运行的程序,以及强制关闭一个进程
    1. 显示占用某个端口的程序
    
    lsof -i:80
    lsof -i:5000
    
    2. 显示某个程序是否在运行,查看某个运行的程序
    
    ps -aux | grep "paster"
    ps -aux | grep apache2
    
    3. 杀掉一个进程,和强制杀掉一个进程
    
    kill 211119
    sudo kill -s 9 21119
    
    56.设置Activity进入退出动画

    使用代码设定

    通过调用overridePendingTransition() 可以实时修改Activity的切换动画。但需注意的是:该函数必须在调用startActivity()或者finish()后立即调用,且只有效一次。

    57.滑动返回

    android-swipelistview
    SwipeBackLayout SlidingFinish

    自从用了swipebacklayout, 友好度提高了许多。 但是又遇到一个问题 每个界面在滑动返回时候都能够看到桌面 ,然后才跳到我的主界面。 解决方案: 主界面窗口不要设置透明 false,其他界面true

    58.Android 虚拟键盘弹出把底部栏顶上去的解决办法

    解决办法:

    在AndroidManifest的相应的activity中加上:android:windowSoftInputMode="adjustPan"http://www.linuxidc.com/Linux/2011-10/46070.htm

    59. 在EditText中插入表情图片 (CharacterStyle&SpannableString) http://gundumw100.iteye.com/blog/904107
    EditText通常用于显示文字,但有时候也需要在文字中夹杂一些图片,比如QQ中就可以使用表情图片,又比如需要的文字高亮显示等等,如何在android中也做到这样呢?
    记得android中有个android.text包,这里提供了对文本的强大的处理功能。
    添加图片主要用SpannableString和ImageSpan类:
    Java代码  收藏代码
    
        Drawable drawable = getResources().getDrawable(id);  
    	    drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());  
    	    //需要处理的文本,[smile]是需要被替代的文本  
    	    SpannableString spannable = new SpannableString(getText().toString()+"[smile]");  
    	    //要让图片替代指定的文字就要用ImageSpan  
    	    ImageSpan span = new ImageSpan(drawable, ImageSpan.ALIGN_BASELINE);  
    	    //开始替换,注意第2和第3个参数表示从哪里开始替换到哪里替换结束(start和end)  
        //最后一个参数类似数学中的集合,[5,12)表示从5到12,包括5但不包括12  
    	    spannable.setSpan(span, getText().length(),getText().length()+"[smile]".length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE);    
    	    setText(spannable); 
    
    60.viewpager中嵌套gridview

    自定义带表情键盘 android 表情,软键盘冲突解决方案(仿微博等SNS应用)http://blog.csdn.net/jj120522/article/details/9825871 日历 android中ViewPager嵌套GridView引发的一系列UI卡顿不顺畅的问题 http://www.android100.org/html/201403/10/5840.html Android UI开发篇之 ViewPager+九宫格布局 实现左右滑动http://blog.csdn.net/janice0529/article/details/17335473 ViewPager+GridView实现宫格横向滑动切换http://download.csdn.net/detail/yefengyulu/5433913

    61.异常:java.lang.ClassCastException: android.view.ViewGroup$LayoutParams cannot be cast to android.view.ViewGroup$MarginLayoutParams的终极解决方式

    思路:从原来的View中直接获取LayoutParams。http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2014/1117/1991.html 今天在使用LayoutParams时出现了一个问题,我是这样用的:

    在gridview初始化的时候,为gridview添加了一个header(我用的是第三方GridView是可以添加header的):
    
    
    headerView = new View(getActivity());
    LayoutParams params = new LayoutParams(LayoutParams.FILL_PARENT, (int)300); 
    headerView.setLayoutParams(params);     
    mGridView.addHeaderView(headerView);
    然后当程序执行到某处,我希望通过setLayoutParams来改变这个高度,于是我这样做:
    
    
    LayoutParams params = new LayoutParams(LayoutParams.FILL_PARENT, 500); 
    headerView.setLayoutParams(params);
    重点是,两个LayoutParams 都是ViewGroup的LayoutParams ,然后一执行就出现下列错误:
    
    java.lang.ClassCastException: android.view.ViewGroup$LayoutParams cannot be cast to android.view.ViewGroup$MarginLayoutParams
    
    跟android中的很多异常一样,你去仔细推敲异常本来的含义往往是百思不得其姐的,异常说的是两个是不同类型的LayoutParams ,但明明都是ViewGroup的LayoutParams。而且我确定ViewGroup的LayoutParams用在GridView的header上是可以的,因为我不执行上面的第二段代码不会报错(再次强调我用的是第三方GridView是可以添加header的)。
    
    
    
    然后就在stackoverflow上查找答案,虽然没找到满意的,但是有个人的回答倒是点醒了我,是不是第二段代码中又重新创建了一个LayoutParams的关系?于是我将第二段代码改成:
    
    
    **LayoutParams params = headerView.getLayoutParams();**
    params.height = 500;
    其实就是不去新建一个LayoutParams,而是从原来的View中直接获取LayoutParams。
    
    改完运行结果没有出现异常了。
    
    看来,当一个View已经有了LayoutParams,是不能再次添加一个新创建的LayoutParams的。
    
    62.android4.0的edittext屏蔽输入法时候光标显示问题 通过反射解决 http://www.eoeandroid.com/thread-248276-1-1.html
    	if (android.os.Build.VERSION.SDK_INT <= 10) {
                                        mEditText.setInputType(InputType.TYPE_NULL);
                                } else {
                                        getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
                                        try {
                                                Class<EditText> cls = EditText.class;
                                                Method setSoftInputShownOnFocus;
                                                setSoftInputShownOnFocus = cls.getMethod("setSoftInputShownOnFocus", boolean.class);
                                                setSoftInputShownOnFocus.setAccessible(true);
                                                setSoftInputShownOnFocus.invoke(mEditText, false);
                                        } catch (Exception e) {
                                                e.printStackTrace();
                                        }
                                        try {
                                                Class<EditText> cls = EditText.class;
                                                Method setShowSoftInputOnFocus;
                                                setShowSoftInputOnFocus = cls.getMethod("setShowSoftInputOnFocus", boolean.class);
                                                setShowSoftInputOnFocus.setAccessible(true);
                                                setShowSoftInputOnFocus.invoke(mEditText, false);
                                        } catch (Exception e) {
                                                e.printStackTrace();
                                        }
                                }
    
    63.自定义控件

    getContext的使用

    自定义android用户控件,使用回调函数实现自定义事件

    64.如何获取到,EditView 的 粘贴复制呢(解决) 重写editview控件,onTextContextMenuItem 。http://www.eoeandroid.com/thread-61482-1-1.html

    Android学习笔记之通过剪切板传递数据 http://www.it165.net/pro/html/201404/11599.html

    Android EditText 取消复制粘贴剪贴功能 http://www.xuebuyuan.com/2038921.html 在API-11以上,也就是Android 3.0以上的版本,这个操作就无效了,需要用到以下方法:

    editText.setCustomSelectionActionModeCallback(new ActionMode.Callback() 
        editText.setImeOptions(EditorInfo.IME_FLAG_NO_EXTRACT_UI);
    

    如何捕获Edittext的粘贴方法?http://www.apkbus.com/android-92944-1-1.html 向EditView插入qq表情,并可删除表情或文字 android开发教程 http://cache.baiducontent.com/c?m=9d78d513d99417f41efa950e494d80230e55f0744ddcc76508c3e34984102d564616f4cd27356074c4c40c7071a55e28eee47132690c7af1dd8a9f4baea68f6d6acd3034074fda17528e42f9c84427d620e707a9fa04bdfcaf6c8eaed0d0d95652d751066787f58f5b1714bd35b64b6f&p=80769a47959d18ff57ee927c1c4791&newp=c67f8f5e85cc43be43bd9b7d0b148a231610db2151d6d2176ecf&user=baidu&fm=sc&query=editview%C9%BE%B3%FD%D2%BB%B8%F6&qid=f5bf3b5b0000bd4e&p1=3

    65.android EditText插入字符串到光标所在位置
    EditText mTextInput=(EditText)findViewById(R.id.input);//EditText对象
    
    int index = mTextInput.getSelectionStart();//获取光标所在位置
    
    String text="I want to input str";
    
    Editable edit = mTextInput.getEditableText();//获取EditText的文字
    
    if (index < 0 || index >= edit.length() ){
    
           edit.append(text);
    
    }else{
    
          edit.insert(index,text);//光标所在位置插入文字
    
     }
    
    66.Android学习笔记:浅析自己的聊天系统的设计思想 http://www.android100.org/html/201406/09/22125.html
    67.java 正则表达式(Invalid escape sequence (valid ones are \b \t \n \f \r " ' \ ) 请问是啥原因呢?
    把你的里面的\全部替换为\\即可
    
    69.error

    NewsCommentDetailActivity

    01-20 11:35:28.990: E/AndroidRuntime(6166): java.lang.RuntimeException: Unable to instantiate application com.jetsun.hbfc.core.MyApplication: java.lang.NullPointerException 01-20 11:35:28.990: E/AndroidRuntime(6166): at android.app.LoadedApk.makeApplication(LoadedApk.java:508) 01-20 11:35:28.990: E/AndroidRuntime(6166): at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4245) 01-20 11:35:28.990: E/AndroidRuntime(6166): at android.app.ActivityThread.access$1400(ActivityThread.java:131) 01-20 11:35:28.990: E/AndroidRuntime(6166): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1288) 01-20 11:35:28.990: E/AndroidRuntime(6166): at android.os.Handler.dispatchMessage(Handler.java:99) 01-20 11:35:28.990: E/AndroidRuntime(6166): at android.os.Looper.loop(Looper.java:137) 01-20 11:35:28.990: E/AndroidRuntime(6166): at android.app.ActivityThread.main(ActivityThread.java:4866) 01-20 11:35:28.990: E/AndroidRuntime(6166): at java.lang.reflect.Method.invokeNative(Native Method) 01-20 11:35:28.990: E/AndroidRuntime(6166): at java.lang.reflect.Method.invoke(Method.java:511) 01-20 11:35:28.990: E/AndroidRuntime(6166): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 01-20 11:35:28.990: E/AndroidRuntime(6166): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 01-20 11:35:28.990: E/AndroidRuntime(6166): at dalvik.system.NativeStart.main(Native Method) 01-20 11:35:28.990: E/AndroidRuntime(6166): Caused by: java.lang.NullPointerException 01-20 11:35:28.990: E/AndroidRuntime(6166): at android.app.LoadedApk.initializeJavaContextClassLoader(LoadedApk.java:384) 01-20 11:35:28.990: E/AndroidRuntime(6166): at android.app.LoadedApk.getClassLoader(LoadedApk.java:327)

    01-20 04:05:16.637: E/AndroidRuntime(1372): Process: com.jetsun.hbfc:webview, PID: 1372 01-20 04:05:16.637: E/AndroidRuntime(1372): java.lang.RuntimeException: Unable to instantiate application com.jetsun.hbfc.core.MyApplication: java.lang.IllegalStateException: Unable to get package info for com.jetsun.hbfc; is package not installed? 01-20 04:05:16.637: E/AndroidRuntime(1372): at android.app.LoadedApk.makeApplication(LoadedApk.java:561) 01-20 04:05:16.637: E/AndroidRuntime(1372): at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4491) 01-20 04:05:16.637: E/AndroidRuntime(1372): at android.app.ActivityThread.access$1500(ActivityThread.java:144) 01-20 04:05:16.637: E/AndroidRuntime(1372): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1339) 01-20 04:05:16.637: E/AndroidRuntime(1372): at android.os.Handler.dispatchMessage(Handler.java:102) 01-20 04:05:16.637: E/AndroidRuntime(1372): at android.os.Looper.loop(Looper.java:135) 01-20 04:05:16.637: E/AndroidRuntime(1372): at android.app.ActivityThread.main(ActivityThread.java:5221) 01-20 04:05:16.637: E/AndroidRuntime(1372): at java.lang.reflect.Method.invoke(Native Method) 01-20 04:05:16.637: E/AndroidRuntime(1372): at java.lang.reflect.Method.invoke(Method.java:372) 01-20 04:05:16.637: E/AndroidRuntime(1372): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) 01-20 04:05:16.637: E/AndroidRuntime(1372): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) 01-20 04:05:16.637: E/AndroidRuntime(1372): Caused by: java.lang.IllegalStateException: Unable to get package info for com.jetsun.hbfc; is package not installed? 01-20 04:05:16.637: E/AndroidRuntime(1372): at android.app.LoadedApk.initializeJavaContextClassLoader(LoadedApk.java:410) 01-20 04:05:16.637: E/AndroidRuntime(1372): at android.app.LoadedApk.getClassLoader(LoadedApk.java:363) 01-20 04:05:16.637: E/AndroidRuntime(1372): at android.app.LoadedApk.makeApplication(LoadedApk.java:554)

    70.解决eclipse闪退的办法 http://blog.csdn.net/ieicihc/article/details/9629991
    方法1.最好解决办法: 
    删除文件 [workspace]/.metadata/.plugins/org.eclipse.e4.workbench/workbench.xmi
    
    方法2.在文件eclipse/configuration/config.ini末尾加上如下一行:
    

    org.eclipse.swt.browser.DefaultType=mozilla

    但是不怎么起作用,在不断切换引用时,有时也会闪退。回来转到androidstudio,用eclipse不多了,偶尔用用没问题。

    71.Android WebView的前进、后退、与刷新
    mWebView.goBack();   //后退  
    mWebView.goForward();//前进
    mWebView.reload();  //刷新
    
    webview有自己的堆stack
    
    72.You must call removeView() on the child's parent first
    在做alertdialog是的时候报了这么一个错误:
    
    java.lang.IllegalStateException: 
    The specified child already has a parent. 
    You must call removeView() on the child's parent first.
    
    搞了许久,终于理解了。
    
    et1 = (EditText)findViewById(R.id.editText1);
    builder.setView(et1);  -- AlertDialog.Builder builder
    et1我写在了xml里面,这样报错,原因是一女不可二嫁。
    
    et1的parent即是R.layout.main 又是AlertDialog。
    
    自然就报错了要你removeView()了。
    
    解决方法有两种
    
    1.动态生成EditText
    
    et1 = new EditText(this);
    builder.setView(et1);
    2. 放在另一个xml中,用inflater
    
    LayoutInflater inflater = LayoutInflater.from(this);  
    	    View textEntryView = inflater.inflate(R.layout.test1, null);  
    	    et1 = (EditText)textEntryView.findViewById(R.id.editText1);
    builder.setView(textEntryView ); 注意这里是textEntryView ,不是et1 
    
    补充还有一种方法,如果此布局中只有该view,可以直接在xml只布局此view。
    
    73.Activity切换动画无效(android:windowIsTranslucent)影响(android:windowAnimationStyle)http://blog.csdn.net/xuewater/article/details/36398803
    style里面设置了android:windowIsTranslucent这个属性
    
    74.Android 解决程序启动时的黑屏问题 http://blog.csdn.net/fancylovejava/article/details/39643449
    android 界面切换黑屏处理从A切换到B的过程中出现黑屏,可以在Manifest文件中改变B的theme,在theme里添加<item name="android:windowIsTranslucent">true</item>,这样从A到B的过程中,因为B是透明的,所以背景就是A。这样的用户体验比较好
    
    75.
    atvity主题加透明属性 如下: <item name="android:windowIsTranslucent">true</item>  
    

    在该atvtivity中使用webview。 webview中有videos,可以播放视频,点击视频全屏后,导致其上级fragmentactivity重新加载,导致内容空白。

    76.打包过程中出现错误 Unexpected error while computing stack sizes:

    java.lang.IllegalArgumentException] (Stack size becomes negative after instruction [12] invokevirtual #96 in [cn/jpush/android/a/a.()V])

    解决办法: 如何在代码时混淆忽略 jpush-sdk-release.jar? http://www.xuebuyuan.com/1683269.html

    请下载最新的proguard.jar,   umeng官方最新的试了也是有问题,估计兼容型的不好吧,采用http://download.csdn.net/detail/msn465780/6625061这个 ok。
    并替换你Android Sdk "tools\proguard\lib\proguard.jar"
    在你的proguard.cfg加上代码:
    -dontwarn
    cn.jpush.**
    -keep class cn.jpush.** { *; }
    
    77.android eclipse设置的断点无效的解决方案
    1.排除 Run——Skip All Breakpoints
    2.排除断点无效的activity所在的进程是否是主进程。
    
    78.极光推送富媒体
     推送富媒体时,推送模版其实是通知,推送文件其实是自定义消息类型
    通知 vs. 自定义消息  http://docs.jpush.cn/pages/viewpage.action?pageId=3309701
    富文本页面 Javascript 回调API  http://docs.jpush.cn/pages/viewpage.action?pageId=7536748
    Rich Push 开发指南  http://docs.jpush.cn/pages/viewpage.action?pageId=7536799
    
    79.内部跳转 Routable for Android
    80.fjrefox firebug插件。chrome 自身F12都可以方便的查看并且编辑html
    81 带有凭证的activity 必须在一个进程中。否则凭证会为空。还有一点在调试的时候,非主进程无法和主进程跳转调试。
    82.apktool反编译过程中出现如下错误
    Exception in thread "main" brut.androlib.AndrolibException: Could not decode arsc file
    	at brut.androlib.res.decoder.ARSCDecoder.decode(ARSCDecoder.java:56)
    	at brut.androlib.res.AndrolibResources.getResPackagesFromApk(AndrolibResources.java:491)
    	at brut.androlib.res.AndrolibResources.loadMainPkg(AndrolibResources.java:74)
    	at brut.androlib.res.AndrolibResources.getResTable(AndrolibResources.java:66)
    	at brut.androlib.Androlib.getResTable(Androlib.java:50)
    	at brut.androlib.ApkDecoder.getResTable(ApkDecoder.java:189)
    	at brut.androlib.ApkDecoder.decode(ApkDecoder.java:114)
    	at brut.apktool.Main.cmdDecode(Main.java:146)
    	at brut.apktool.Main.main(Main.java:77)
    Caused by: java.io.IOException: Expected: 0x001c0001, got: 0x00000000
    	at brut.util.ExtDataInput.skipCheckInt(ExtDataInput.java:48)
    	at brut.androlib.res.decoder.StringBlock.read(StringBlock.java:44)
    	at brut.androlib.res.decoder.ARSCDecoder.readPackage(ARSCDecoder.java:102)
    	at brut.androlib.res.decoder.ARSCDecoder.readTable(ARSCDecoder.java:83)
    	at brut.androlib.res.decoder.ARSCDecoder.decode(ARSCDecoder.java:49)
    	... 8 more
    

    由于使用新的adt,而反编译的apktool.jar不是最新的导致。使用新的apktool.jar替换原来的就可以了。官方下载地址 https://code.google.com/p/android-apktool/。

    83.渠道打包工具

    之前有的umeng,但是现在无法使用【因为android更新了编译的sdk版本,而umeng不在提供更新】。目前的做法是通过 gradle来打包Gradle多渠道打包

    84.genymotion快速高效的android模拟器

    https://www.genymotion.com/#!/developers/user-guide#license http://blog.csdn.net/langyuewu/article/details/39196653

    需要翻墙。部分需要付费

    85.使用Vitamio打造自己的Android万能播放器

    直播方面 可以参考我翻译的Android如何直播RTMP流 86. Ctrl+Shift+F7 可以高亮当前元素在当前文件中的使用 Android Studio 如何提示函数用法? 先选中,然后按F2

    87.android 提供的很多List控件如 listview、gridview 默认都会显示一个fadingedge的东西,它在View的top和bottom处各显示一个渐变半透的阴影以达到更好的视觉效果,但是这个带来的副作用就是导致在性能不是那么强劲的机器上,一些listview,gridview的拖动会显得很不流畅,因为我们知道绘制带Alpha的图片是最耗时的。

    我们的优化思路就是对这个fadingedge做一些修改,当view处于滚动状态时,通过接口setVerticalFadingEdgeEnabled(false)让其不显示fadingedge,当view处于静止状态时,通过接口setVerticalFadingEdgeEnabled(true)恢复显示fadingedge。以上的listview和gridview等控件都是继承与AbsListView,所以我们直接修改framework中的AbsListView.java文件,就可以达到系统级的改动效果了。

    88. 从github上clone下来swipebacklayout

    编译报错查看log为 android-studio llij.ide.plugins.PluginManager - null

    修改方法 tasks.withType(Compile) { options.encoding = "UTF-8" } 改为 tasks.withType(JavaCompile) { options.encoding = "UTF-8" }

    89.Error:Execution failed for task ':xxx:compileDebugNdk'.

    NDK not configured. Download the NDK from http://developer.android.com/tools/sdk/ndk/.Then add ndk.dir=path/to/ndk in local.properties. (On Windows, make sure you escape backslashes, e.g. C:\ndk rather than C:\ndk)

    在androidstudio中的local.properties中添加ndk.dir= 你的ndk的路径

    90.Error:(8, 0) Could not find property 'ANDROID_BUILD_SDK_VERSION' on project ':ActionBar-PullToRefresh'.

    dependencies { compile 'com.github.castorflex.smoothprogressbar:library:0.4.+@aar' } 解决方法 I think you should also import 'SmoothProgressBar' library in your project https://github.com/castorflex/SmoothProgressBar

    #####91.@+id @id android:id ?android:attr

    。@+id:宣告一個id值來識別控制項

    。@id:透過id值引用控制項

    。android:id:透過id值, 引用Android系統內部的資源

    。?android:attr:引用Android預置定義樣式

    #####92. Looks like there is no way to avoid modifications made by the import plugin. All the settings it has is three checkboxes related to dependency management. I tried to uncheck all of them but still it does change my project structure.

    I managed to add existing library projects manually:

    1. Copied library's directory under the root directory of my project.
    2. Referenced that library in settings.gradle by adding include ':libraryA'.
    3. Added dependency to my project's build.gradle: compile project(':libraryA').

    Moreover, after that the IDE recognized that library as module and highlighted its folder in bold font whithin Project Structure.

    #####93.如何从当前的activity获得根视图 或者 Android如何获取Activity的View?

    ((ViewGroup)findViewById(android.R.id.content)).getChildAt(0) 或者 getWindow().getDecorView().findViewById(android.R.id.content)

    #####94.radiogroup中的radiobutton如何不显示图标button,并且可以等比例再用wight android:button="@none" 或@null android:drawableTop ="@drawable/xxx" 或者也设置为空

    #####95.搜索也是一门艺术 浓缩搜索 详细搜索

    #####96.android layoutinfater 没有显示内容 检查parent试图是否为空

    #####97..Error:Execution failed for task ':app:dexDebug'.UNEXPECTED TOP-LEVEL EXCEPTION: com.android.dex.DexException: Multiple dex files define Landroid/support/annotation/AnimRes; at com.android.dx.merge.DexMerger.readSortableTypes(DexMerger.java:596) at com.android.dx.merge.DexMerger.getSortedTypes(DexMerger.java:554) at com.android.dx.merge.DexMerger.mergeClassDefs(DexMerger.java:535) at com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:171) at com.android.dx.merge.DexMerger.merge(DexMerger.java:189) at com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:454) at com.android.dx.command.dexer.Main.runMonoDex(Main.java:303) at com.android.dx.command.dexer.Main.run(Main.java:246) at com.android.dx.command.dexer.Main.main(Main.java:215) at com.android.dx.command.Main.main(Main.java:106)

    检查 Multiple dex #####98.android动画的三种形式 tween animition ,frame animition ,property animition

    #####99.LoopingViewPager QuickReturn

    #####100. appcompat-v7:21.0.0': No resource found that matches the given name: attr 'android:actionModeShareDrawable'http://stackoverflow.com/questions/26431676/appcompat-v721-0-0-no-resource-found-that-matches-the-given-name-attr-andro

    #####101.recycleview vs listview head foot .recycleview实现gridview 新事物不要躲避,机遇。

    #####102.清除Android工程中没用到的资源 http://www.cnblogs.com/angeldevil/p/3725358.html

    #####103.xmlns:tools与tools:context tools:context="activity name"这一句不会被打包进APK。只是ADT的Layout Editor在你当前的Layout文件里面设置对应的渲染上下文,说明你当前的Layout所在的渲染上下文是activity name对应的那个activity,如果这个activity在manifest文件中设置了Theme,那么ADT的Layout Editor会根据这个Theme来渲染你当前的Layout。就是说如果你设置的MainActivity设置了一个Theme.Light(其他的也可以),那么你在可视化布局管理器里面看到的背景啊控件啊什么的就应该是Theme.Light的样子。仅用于给你看所见即所得的效果而已。

    #####104. android-studio下使用volley Android working with Volley Library http://www.androidhive.info/2014/05/android-working-with-volley-library-1/ http://blog.gssxgss.me/setup-android-studio-and-volley-usage-1/

    #####105.androidstudio 导入libs后要同步一下才可以用

    #####106.fragment + butterknife 的使用 othersetting-->Compiler → Annotation Processors. Check "Enable annotation processing".

    #####107. com.astuetz.PagerSlidingTabStrip$PageListener.onPageScrolled(

    #####108. E/InputEventReceiver﹕ Exception dispatching input event. E/MessageQueue-JNI﹕ Exception in MessageQueue callback: handleReceiveCallback E/MessageQueue-JNI﹕ java.lang.RuntimeException: native typeface cannot be made at android.graphics.Typeface.(Typeface.java:175) at android.graphics.Typeface.createFromAsset(Typeface.java:149) at NewsFragment$1.onPageSelected(NewsFragment.java:74)

    androidstudio中assert的位置和eclipse中的不同。需要注意。否则调用assert中资源会找不到而出现问题。

    #####109.Custom Fonts in Android
    http://sudharti.github.io/articles/custom-fonts-android/

    Typeface tf = Typeface.createFromAsset(getActivity().getAssets(), "fonts/font_name.ttf"); Typeface tf2 = Typeface.createFromAsset(getActivity().getAssets(), "fonts/font_name2.ttf");

    TextView tv = (TextView) findViewById(R.id.textview); tv.setTypeface(tf); //Set Typeface

    EditText et = (EditText) findViewById(R.id.edittext); et.setTypeface(tf2);

    #####110.PagerSlidingTabStrip the view throws an exception if there are no tabs available to display. It would be great if the view failed gracefully or gave a better error message. https://github.com/astuetz/PagerSlidingTabStrip/issues/69

    #####111. Android开发之ScrollView中嵌套ListView的解决方案 http://blog.csdn.net/minimicall/article/details/40983331

     重写listview的onmeasure方法   
     @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    	int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
    	        MeasureSpec.AT_MOST);
    	super.onMeasure(widthMeasureSpec, expandSpec);
        }
    
    这个方法有一个同样的毛病,就是默认显示的首项是ListView,需要手动把ScrollView滚动至最顶端。
    sv = (ScrollView) findViewById(R.id.act_solution_4_sv);
    sv.smoothScrollTo(0, 0);
    
    int	AT_MOST	Measure specification mode: The child can be as large as it wants up to the specified size.
    int	EXACTLY	Measure specification mode: The parent has determined an exact size for the child.
    int	UNSPECIFIED	Measure specification mode: The parent has not imposed any constraint on the child.
    
    112. java.lang.NullPointerException at android.webkit.HTML5VideoView.isPlaying(HTML5VideoView.java:122) at android.webkit.HTML5VideoViewProxy$VideoPlayer.isPlaying(HTML5VideoViewProxy.java:269)
    检查清单文件对应activity的配置
    android:configChanges="orientation|screenLayout"
    

    #####113. Caused by: java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.

    #####114.http://jgilfelt.github.io/android-actionbarstylegenerator/ 这个网站可以在线配置action bar的样式,支持holo、support v7、sherlock

    #####115.在其它界面异常之后返回到FragmentActivity Fragment显示异常(重叠或不显示)解决方 ...

    前面专门开了个帖来问这个问题,问题描述详见:http://www.eoeandroid.com/thread-496879-1-1.html
    当然,问题没有解决掉,一直也很郁闷,今天花了点时间换了N多关键词来找,最后也忘了在哪里看到一个方法,死马当活马医的写上,居然好了。
    解决方案是,在FragmentActivity里重写onSaveInstanceState,并且去掉super.onSaveInstanceState()即可。
    原因:猜测应该是在二级界面抛了异常之后,应用在返回上级界面时会从onSaveInstanceState内读取FragmentActivity缓存的状态,所以导致Fragment全部显示(显示重叠)或者显示不出来。(只是猜测)
    @Override protected void onSaveInstanceState(Bundle outState) { }
    

    #####116.修复Android App中出现的重复菜单项及Fragment重叠 https://typeblog.net/tech/2014/08/22/fix-duplicate-menu.html

     fragment replace出现重叠
    
    
    一般fragment的容器都是fragment,用到的方法:
    
    FragmentManager fm = getActivity().getSupportFragmentManager();
    FragmentTransaction ft = fm.beginTransaction();
    ft.replace(R.id.container, fragment);
    ft.addToBackStack(null);
    ft.commit();
    replace这个方法在fragment内部直接代入布局的id是不会有问题的,但是在外部比如Activitiy中用就会出现fragment叠加的问题。
    
    有很多人说给每个fragment设置背景色或图片,但是我觉得额外费资源。
    
    其实只要改成这样就好了,但这之中的原理又有谁懂呢?
    
    http://stackoverflow.com/questions/12958555/android-replace-fragment-still-displays-some-of-the-replaced-fragment
    
    transaction.replace(((ViewGroup)(getView().getParent())).getId(), fragment);
    

    #####117.通过activity 得到它的fM,通过tag指定到上级fragment,从而获取到其中的接口数据 yyb if (getActivity().getSupportFragmentManager().findFragmentByTag("videos") instanceof QuickReturnInterface) { mCoordinator = (QuickReturnInterface) getActivity().getSupportFragmentManager().findFragmentByTag("news"); } else { throw new ClassCastException("Parent container must implement the QuickReturnInterface"); }

    #####118.内存优化相关 ANDROID内存优化(大汇总) http://blog.csdn.net/a396901990/article/details/38707007

    #####119.PagerSlidingTabStrip Changing the title of the adapter and notifyDatasetChanged does not work. #13 Call notifyDataSetChanged() on the PagerSlidingTabStrip instead. Worked for me yesterday with data loaded from a CursorLoader.

    #####120.Ubuntu下的屏幕录制软件RecordMyDesktop

    安装:
    sudo apt-get install gtk-recordmydesktop
    
    使用:
    
    安装好之后该软件会在影音软件里面,打开就可以。然后可以选择需要录制的窗口,如果不选择的话就默认是用户在屏幕上的所有操作。点击“录制”就开始了,此时该软件隐藏在   上方的任务栏(红色圆圈),可以随时停止录制。得到的视频保存在主目录下,其格式为Ogg。如果需要把它转换为avi格式,可以安装软件mencoder,命令如下:
    
    sudo apt-get install mencoder
    
    然后用下面的命令转换:
    mencoder -ovc lavc -oac copy -lavcoptsvcodec=mpeg4 -o outfile.avi infile.ogv
    
    
    
    
     ubuntu动态截图,制作GIF动画
    
    Ubuntu 下, 如何录制 gif 格式的屏幕截图
    
    1. 安装 gtk-recordmydesktop 来录制屏幕, 安装 mplayer 將视频分解成单帧图片, 安装 imagemagick 將单帧图片压缩成一张 gif:
    
    sudo apt-get install imagemagick mplayer gtk-recordmydesktop
    2. 命令行下执行, 录制并保存文件为 out.ogv:
    
    gtk-recordmydesktop
    3. 执行如下命令將 out.ogv 分解成单帧图片:
    
    mplayer -ao null out.ogv -vo jpeg:outdir=.
    4. 执行如下命令將单帧图片压缩成 gif 图片:
    
    convert *.jpg out.gif
    5. 执行如下命令將 gif 图片进行压缩:
    
    convert out.gif -fuzz 10% -layers Optimize optimized.gif
    Live Like You're Dying And Never Stop Tying
    

    #####121.一个ListView中会创建很多个convertview,并不是所有的都复用的,比如同一屏显示的肯定都是不一样的convertview。

    #####122.性能优化 框架的选择。volley【尽量google支持的或者原生的】 buttferty greendao 【没有采用反射技术的,比如greendao使用的是code generation。而不是注解】

    为什么greenDao使用的是code generation,而不是注解?
    
    对于greenDao,代码生成是非常合理的。在Android平台上,基于注解的解决方式是有缺陷的:它们不得不依赖于元数据的解析和反射。特别是反射,会显著降低ORM工具的性能。另一方面,greenDao会为Android生成优化过的代码。这些生成的代码完全避免了反射。这也是greenDao如此快的主要原因。另一个优势是大小。
    
    greenDao的核心lib是非常小的(在100K以下,包括单元测试)。这是因为对于一些ORM的内部逻辑都在generator中,而不是在核心库中。
    
    greenDao包含了:DaoCore,DaoGenerator和DaoTest。DaoCore是需要你加入到android项目中的,在Apache License 2版本以下是许可的。
    
    DaoGenerator是java程序,负责实体的生成,DAO和其它的文件。DaoTest是单元测试用例额,确保了greenDao本身和其稳定性。
    
    DaoGenerator 和DaoTest 在GPL V3以下是可用的。这些许可条款可以满足大部分的开发者使用。
    

    #####123.Lazy Loading lazy不是翻译成懒,差不多算延迟、推迟的意思。 是说不在初始化时loading,而是推迟到必须loading时才进行loading。

    #####124.android-stuido File > Invalidate 问题:could not save application settings:java.util.zip.zipexception:incorrect header check

    https://code.google.com/p/android/issues/detail?id=56190
    

    解决 It looks like there's a corrupted cache. To work around this, invoke File > Invalidate Caches. If you can't start Android Studio at all, try going to the cache directory (its location depends on your platform) and delete it, then start Studio.

    #####125.Android.gitignore .gradle /local.properties /.idea/workspace.xml /.idea/libraries .DS_Store /build # Built application files *.apk *.ap_

    # Files for the Dalvik VM
    *.dex
    
    # Java class files
    *.class
    
    # Generated files
    bin/
    gen/
    
    # Gradle files
    .gradle/
    build/
    /*/build/
    
    # Local configuration file (sdk path, etc)
    local.properties
    
    # Proguard folder generated by Eclipse
    proguard/
    
    # Log Files
    *.log
    

    #####126.NDK With Android Studio http://blog.csdn.net/u011570979/article/details/43966567

    #####127.chrome+红杏 honx.in/i/VLMhwoIaA1yvXz7n

    #####127.ANDROID仿IOS时间_ANDROID仿IOS弹出提示框 http://dwtedx.com/itshare_297.html

    #####128. Android TextView drawableLeft 在代码中实现

    方法1

    Drawable drawable= getResources().getDrawable(R.drawable.drawable); /// 这一步必须要做,否则不会显示. drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight()); myTextview.setCompoundDrawables(drawable,null,null,null);

    方法2

    public void setCompoundDrawablesWithIntrinsicBounds (Drawable left, Drawable top, Drawable right, Drawable bottom)

    #####129. /* 去锯齿 */ paint.setAntiAlias(true);

    #####130.android 画图之setXfermode
    http://blog.csdn.net/wm111/article/details/7299294 setXfermode

    设置两张图片相交时的模式 
    
    我们知道 在正常的情况下,在已有的图像上绘图将会在其上面添加一层新的形状。 如果新的Paint是完全不透明的,那么它将完全遮挡住下面的Paint; 
    
    而setXfermode就可以来解决这个问题 
    
    
    一般来说 用法是这样的 
    [java] view plaincopy
    
        Canvas canvas = new Canvas(bitmap1);  
          
        paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));  
          
        canvas.drawBitmap(mask, 0f, 0f, paint);    
    

    #####131. ubuntu android cordova Setting up PhoneGap on Ubuntu for Android app development

    #####132.webview的页面都finish了居然还能听到视频播放的声音,查了下发现webview的 onResume方法可以继续播放, onPause可以暂停播放, 但是这两个方法都是在Added in API level 11添加的,所以需要用反射来完成。 停止播放:在页面的onPause方法中使用: webView.getClass().getMethod("onPause").invoke(webView,(Object[])null); 继续播放:在页面的onResume方法中使用: webView.getClass().getMethod("onResume").invoke(webView,(Object[])null); 这样就可以控制视频的暂停和继续播放了。

    在webView的Activity配置里面加上:
    android:hardwareAccelerated="true"
    

    #####133.Create new project on Android, Error: Studio Unknown host 'services.gradle.org' 解决方法 please try following steps: Go to..

    File --> settings --> HTTP Proxy [Under IDE Settings] --> Auto-detect proxy settings
    
    you can also use the test connection button and check with google.com if it works or not
    [关于红杏的公益代理, Android Studio以及freso的编译](http://www.liaohuqiu.net/cn/posts/about-red-apricot-and-compiling-fresco/)
    

    #####134.ListView.setOnItemClickListener 点击无效

    如果ListView中的单个Item的view中存在checkbox,button等view,会导致ListView.setOnItemClickListener无效,
    
    事件会被子View捕获到,ListView无法捕获处理该事件.
    
    解决方法:
    
    在checkbox、button对应的view处加android:focusable="false"
       android:clickable="false"android:focusableInTouchMode="false"
    
    其中focusable是关键
    
     
    
    从OnClickListener调用getSelectedItemPosition(),Click 和selection 是不相关的,Selection是通过D-pad or trackball 来操作的,Click通常是点击操作的。
    
     
    
    arg2参数才是点击事件位置的参数
    

    #####135.listview addheader 如果有多个header,可以把多个header封装。把封装后的view作为header

    #####136.emojicon emojicon, https://github.com/rockerhieu/emojicon emojicon, https://github.com/ankushsachdeva/emojicon

    #####137.新闻评论页,如何实现盖楼,listview的高度自适应? 控件的高度 设为wrap_content

    #####138.android改变CheckBox和后面文字的间距 http://www.haodaima.net/art/1891872 解决方法: 1.设置android:paddingLeft="25dip",就可以了。 2.设置checkbox的背景图片。系统默认的给checkbox加的有一个透明的背景。

    #####139.volley请求超时 如何处理 http://stackoverflow.com/questions/17094718/android-volley-timeout

    myRequest.setRetryPolicy(new DefaultRetryPolicy(
    	        MY_SOCKET_TIMEOUT_MS, 
    	        DefaultRetryPolicy.DEFAULT_MAX_RETRIES, 
    	        DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));  
    

    #####140.Listview getItemViewType的使用 对于不同xml,使用多个viewhold

    #####141.Android “Only the original thread that created a view hierarchy can touch its views.”http://stackoverflow.com/questions/5161951/android-only-the-original-thread-that-created-a-view-hierarchy-can-touch-its-vi thread = new Thread(){ @Override public void run() { try { synchronized (this) { wait(5000);

    	            runOnUiThread(new Runnable() {
    	                @Override
    	                public void run() {
    	                    dbloadingInfo.setVisibility(View.VISIBLE);
    	                    bar.setVisibility(View.INVISIBLE);
    	                    loadingText.setVisibility(View.INVISIBLE);
    	                }
    	            });
    
    	        }
    	    } catch (InterruptedException e) {
    	        e.printStackTrace();
    	    }
    	    Intent mainActivity = new Intent(getApplicationContext(),MainActivity.class);
    	    startActivity(mainActivity);
    	};
        };  
        thread.start();
    

    #####142.Java SDK提供了对上述三种压缩技术的支持:Inflater类和Deflater类直接用zlib库对数据压缩/ 解压缩,GZIPInputStream类和GZIPOutputStream类提供了对gzip格式的支持,ZipFile、Zi pInputStream、ZipOutputStream则用于处理zip格式的文件。

    所以,你应当根据你的具体需求,选择不同的压缩技术:如果只需要压缩/解压缩数据,你
    可以直接用zlib实现,如果需要生成gzip格式的文件或解压其他工具的压缩结果,你就必须
    用gzip或zip等相关的类来处理了。
    

    #####143.利用volley进行http设置请求头、超时及请求参数设置(post)

    这里以post请求说明,get请求相似设置请求头及超时。
    
    1.自定义request,继承com.android.volley.Request
    
    2.构造方法实现(basecallback,为自定义的监听,实现Response.Listener,ErrorListener接口)--post请求
    
     public BaseRequest(String url,String params, BaseCallback<T> callback)
        {
    	super(Method.POST, url, callback);
    	this.callback = callback;
    	this.params = params;
    	Log.e(TAG, "request:" + params);
    	setShouldCache(false);
        }
    3.请求头设置:重写getHeaders方法
    
     @Override
        public Map<String, String> getHeaders() throws AuthFailureError
        {
    	Map<String, String> headers = new HashMap<String, String>();
    	headers.put("Charset", "UTF-8");
    	headers.put("Content-Type", "application/x-javascript");
    	headers.put("Accept-Encoding", "gzip,deflate");
    	return headers;
        }
    设置字符集为UTF-8,并采用gzip压缩传输
    
    4.超时设置:重写getRetryPolicy方法
    
     @Override
        public RetryPolicy getRetryPolicy()
        {
    	RetryPolicy retryPolicy = new DefaultRetryPolicy(SOCKET_TIMEOUT, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT);
    	return retryPolicy;
        }
    5.请求参数组装:重写getBody方法
    
     @Override
        public byte[] getBody() throws AuthFailureError
        {
    	return params == null ? super.getBody() : params.getBytes();
        }
    

    #####144. android handler的警告Handler Class Should be Static or Leaks Occur

    在使用Handler更新UI的时候,我是这样写的:
    
    
    public class SampleActivity extends Activity {
    	                                                      
      private final Handler mLeakyHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
          // TODO
        }
      }
    }
    看起来很正常的,但是 Android Lint 却给出了警告:
    
    This Handler class should be static or leaks might occur
    
    意思是说:这个Handler 必须是static的,否则就会引发内存泄露。
    
    其实,对于这个问题,Android Framework 的工程师 Romain Guy 早已经在Google论坛上做出过解释,并且给出了他的建议写法:
    
    
    
    I wrote that debugging code because of a couple of memory leaks I 
    found in the Android codebase. Like you said, a Message has a 
    reference to the Handler which, when it's inner and non-static, has a 
    reference to the outer this (an Activity for instance.) If the Message 
    lives in the queue for a long time, which happens fairly easily when 
    posting a delayed message for instance, you keep a reference to the 
    Activity and "leak" all the views and resources. It gets even worse 
    when you obtain a Message and don't post it right away but keep it 
    somewhere (for instance in a static structure) for later use. 
    
    
    
    他的建议写法是:
    
    
    class OuterClass {
    	                          
      class InnerClass {
        private final WeakReference<OuterClass> mTarget;
    	                          
        InnerClass(OuterClass target) {
    	   mTarget = new WeakReference<OuterClass>(target);
        }
    	                          
        void doSomething() {
    	   OuterClass target = mTarget.get();
    	   if (target != null) {
    	        target.do();    
    	   }
         }
    }
    下面,我们进一步解释一下:
    
    1.Android App启动的时候,Android Framework 为主线程创建一个Looper对象,这个Looper对象将贯穿这个App的整个生命周期,它实现了一个消息队列(Message  Queue),并且开启一个循环来处理Message对象。而Framework的主要事件都包含着内部Message对象,当这些事件被触发的时候,Message对象会被加到消息队列中执行。
    2.当一个Handler被实例化时(如上面那样),它将和主线程Looper对象的消息队列相关联,被推到消息队列中的Message对象将持有一个Handler的引用以便于当Looper处理到这个Message的时候,Framework执行Handler的handleMessage(Message)方法。
    3.在 Java 语言中,非静态匿名内部类将持有一个对外部类的隐式引用,而静态内部类则不会。
    
    到底内存泄露是在哪里发生的呢?以下面代码为例:
    
    
    public class SampleActivity extends Activity {
    	          
      private final Handler mLeakyHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
          // ...
        }
      }
    	          
      @Override
      protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    	          
        // Post a message and delay its execution for 10 minutes.
        mLeakyHandler.postDelayed(new Runnable() {
          @Override
          public void run() { }
        }, 60 * 10 * 1000);
    	          
        // Go back to the previous Activity.
        finish();
      }
    }
    当Activity被finish()掉,Message 将存在于消息队列中长达10分钟的时间才会被执行到。这个Message持有一个对Handler的引用,Handler也会持有一个对于外部类(SampleActivity)的隐式引用,这些引用在Message被执行前将一直保持,这样会保证Activity的上下文不被垃圾回收机制回收,同时也会泄露应用程序的资源(views and resources)。
    
    为解决这个问题,下面这段代码中的Handler则是一个静态匿名内部类。静态匿名内部类不会持有一个对外部类的隐式引用,因此Activity将不会被泄露。如果你需要在Handler中调用外部Activity的方法,就让Handler持有一个对Activity的WeakReference,这样就不会泄露Activity的上下文了,如下所示:
    
    
    public class SampleActivity extends Activity {
    	 
      /**
       * Instances of static inner classes do not hold an implicit
       * reference to their outer class.
       */
      private static class MyHandler extends Handler {
        private final WeakReference<SampleActivity> mActivity;
    	 
        public MyHandler(SampleActivity activity) {
          mActivity = new WeakReference<SampleActivity>(activity);
        }
    	 
        @Override
        public void handleMessage(Message msg) {
          SampleActivity activity = mActivity.get();
          if (activity != null) {
    	// ...
          }
        }
      }
    	 
      private final MyHandler mHandler = new MyHandler(this);
    	 
      /**
       * Instances of anonymous classes do not hold an implicit
       * reference to their outer class when they are "static".
       */
      private static final Runnable sRunnable = new Runnable() {
          @Override
          public void run() { }
      };
    	 
      @Override
      protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    	 
        // Post a message and delay its execution for 10 minutes.
        mHandler.postDelayed(sRunnable, 60 * 10 * 1000);
    	     
        // Go back to the previous Activity.
        finish();
      }
    }
    总结:
    在实际开发中,如果内部类的生命周期和Activity的生命周期不一致(比如上面那种,Activity finish()之后要等10分钟,内部类的实例才会执行),则在Activity中要避免使用非静态的内部类,这种情况,就使用一个静态内部类,同时持有一个对Activity的WeakReference。
    
    146.FragmentPagerAdapter (getSupportFragmentManager() ) You must call removeView() on the child's parent
    How to solve for viewpager : The specified child already has a parent. You must call removeView() on the child's parent first
    

    http://stackoverflow.com/questions/13559353/how-to-solve-for-viewpager-the-specified-child-already-has-a-parent-you-must 解决方法 I had the same problem when I used

    View res = inflater.inflate(R.layout.fragment_guide_search, container);
    inside Fragment.onCreateView(...
    
    You must call
    
    View res = inflater.inflate(R.layout.fragment_guide_search, container, false);
    or
    
    View res = inflater.inflate(R.layout.fragment_guide_search, null);
    

    参考:

    [1]https://groups.google.com/forum/?fromgroups=#!msg/android-developers/1aPZXZG6kWk/lIYDavGYn5UJ[2]http://www.androiddesignpatterns.com/2013/01/inner-class-handler-memory-leak.html[3]http://stackoverflow.com/questions/11407943/this-handler-class-should-be-static-or-leaks-might-occur-incominghandler

    145. 使用代码为textview设置drawableLeft
    Drawable drawable= getResources().getDrawable(R.drawable.drawable);  
    /// 这一步必须要做,否则不会显示.  
    drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight());  
    myTextview.setCompoundDrawables(drawable,null,null,null);  
    
    146.Android如何在java代码中设置margin
    LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);  
    lp.setMargins(10, 20, 30, 40);  
    imageView.setLayoutParams(lp);
    
    147.出错了表现:Conversion to Dalvik format failed: Unable to execute dex: method ID not in [0, 0xffff]: 65536
    解决:谷歌出了 新的Multidex支持库  androidstudio    https://developer.android.com/tools/building/multidex.html
    	android {
    		    compileSdkVersion 21
    		    buildToolsVersion "21.1.0"
    
    		    defaultConfig {
    			...
    			minSdkVersion 14
    			targetSdkVersion 21
    			...
    
    			// Enabling multidex support.
    			multiDexEnabled true
    		       }
    		      ...
    		}
    
    		dependencies {
    		  compile 'com.android.support:multidex:1.0.0'
    		}
    
    148.How to get Nautilus-scripts working on Ubuntu 14.04?
    nautilus-actions-config-tool
    
    http://askubuntu.com/questions/281062/how-to-get-nautilus-scripts-working-on-ubuntu-13-04  设置好之后 nautilus -q。重启下nautilus服务生效
    
    http://ubuntuhandbook.org/index.php/2014/04/ubuntu-14-04-add-open-as-rootadministrator-to-context-menu/
    
    149. imageloader显示图片所使用的uri:
    String imageUri = "http://site.com/image.png"; // from Web
    String imageUri = "file:///mnt/sdcard/image.png"; // from SD card
    String imageUri = "content://media/external/audio/albumart/13"; // from content provider
    String imageUri = "assets://image.png"; // from assets
    String imageUri = "drawable://" + R.drawable.image; // from drawables (only images, non-9patch)
    注意:使用drawable://除非你真的需要他。时刻要注意使用本地图片加载方法:setImageResource带代替ImageLoader。
    五,有用的信息
    1,ImageLoader.getInstance().init(config); // 在应用开启的时候初始化。
    2,<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>sd卡缓存是需要写入权限
    3,ImageLoader根据ImageView的width,height确定图片的宽高。
    4,如果经常出现OOM
       ①减少配置之中线程池的大小,(.threadPoolSize).推荐1-5;
       ②使用.bitmapConfig(Bitmap.config.RGB_565)代替ARGB_8888;
       ③使用.imageScaleType(ImageScaleType.IN_SAMPLE_INT)或者try.imageScaleType(ImageScaleType.EXACTLY);
       ④避免使用RoundedBitmapDisplayer.他会创建新的ARGB_8888格式的Bitmap对象;
       ⑤使用.memoryCache(new WeakMemoryCache()),不要使用.cacheInMemory();
    5,内存缓存,sd卡缓存,显示图片,可以使用已经初始化过的实现;
    6,为了避免使用list,grid,scroll,你可以使用
    boolean pauseOnScroll = false; // or true
    boolean pauseOnFling = true; // or false
    PauseOnScrollListener listener = new PauseOnScrollListener(imageLoader, pauseOnScroll, pauseOnFling);
    listView.setOnScrollListener(listener);
    
    150.View's getWidth() and getHeight() returning 0
    You should use: image1.getLayoutParams().width;    http://stackoverflow.com/questions/18268915/views-getwidth-and-getheight-returning-0
    
    151.GridView的行数问题
    在gridview里边设置属性 android:numColumns="3";意思是三列 然后在BaseAdapter的 getCount()方法 里边返回9。这样就可以平分为3行3列了
    
    152.ArrayList和数组间的相互转换 http://wanglihu.iteye.com/blog/243238
    ArrayList提供public <T> T[] toArray(T[] a)
    
    public static <T> List<T> asList(T... a)
    
    153.Unexpected response code 500
    网页已经被关闭
    还有就是,一般由于内部服务器错误造成的。
      服务器关闭或者服务器升级而造成的资源无法访问
      由于服务器太忙而造成的,此时无法处理请求。通讯量超出 Web 站 点的能力
    
    154. banner广告及view pager 的小圆点指示器 CirclePageIndicator http://9437752.blog.51cto.com/9427752/1580984
    155.使用ViewPager+GridView实现横向滑动的效果 http://blog.csdn.net/developer_jiangqq/article/details/9364501
    156.CircleImageView https://github.com/hdodenhof/CircleImageView
    157.ViewPager FragmentPagerAdapter Nullpointer fragmentpageradapter和pageradapter的区别。使用的场景。
    158.unable to have ViewPager WRAP_CONTENT http://stackoverflow.com/questions/8394681/android-i-am-unable-to-have-viewpager-wrap-content
    Overriding onMeasure of your ViewPager as follows will make it get the height of the biggest child it currently has.
    
    @Override 
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
     
        int height = 0;
        for(int i = 0; i < getChildCount(); i++) {
    	View child = getChildAt(i);
    	child.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
    	int h = child.getMeasuredHeight();
    	if(h > height) height = h;
        } 
     
        heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);
     
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    } 
    
    159.在自定义视图布局文件中,仅支持FrameLayout、LinearLayout、RelativeLayout三种布局控件和AnalogClock、Chronometer、Button、ImageButton、ImageView、ProgressBar、TextView、ViewFlipper、ListView、GridView、StackView和AdapterViewFlipper这些显示控件,不支持这些类的子类或Android提供的其他控件。否则会引起ClassNotFoundException异常
    160.Android模拟器Genymotion加载ARM架构so文件
    http://www.eoeandroid.com/thread-552875-1-1.html
    https://www.genymotion.com/#!/support?chapter=collapse-logs#faq
    
    161.Viewpager wrap_hight导致不显示。 重写ViewPager
     /**
         * for bug   : unable to have ViewPager WRAP_CONTENT
         */
        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    	int hight = 0;
    	for (int i = 0; i < getChildCount(); i++) {
    	    View child = getChildAt(i);
    	    child.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
    	    int h = child.getMeasuredHeight();
    	    if (h > hight) hight = h;
    
    	}
    	heightMeasureSpec = MeasureSpec.makeMeasureSpec(hight, MeasureSpec.EXACTLY);
    	super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        } 
    
    162.选择项有RadioGroup和另外一个button组成 点击button的时候,清除radiogroup中选中的radiobutton。调用radiogroup的clearCheck方法即可
    163.gridview columnnum。上传照片
    164. 9.png Error:Must have one-pixel frame that is either transparent or white. -xxx/app/src/main/res/drawable-xhdpi/icon_addpic_focused.png: libpng warning: iCCP: Not recognizing known sRGB profile that has been edited

    解决方法如下 this is the problem with latest adt that is 20.0.3. you can instead rename the *.9.png to *.png and start working. i think this is the bug with the adt only, since for 18.0.0 version adt it doesnt prompts for this type of error and works fine

    165. IntentRecieverLeakedException, Are you missing a call to unregisterReceiver() ? in android
    注册广播接收者有两种方式,一种在清单文件中注册。这个是长期有效的。另外一种是。在activity中注册,这种注册的生命周期在actity的生命周期内,还有第二种注册不要registerReceiver必须要和unregisterReceiver配套使用,否则会出现上述问题。
    http://stackoverflow.com/questions/9078390/intentrecieverleakedexception-are-you-missing-a-call-to-unregisterreceiver
    
    1. SVN Ignore files in Android Studio http://stackoverflow.com/questions/23536563/svn-ignore-files-in-android-studio
    There was nothing in the repository, until I did Share Directory on the project. It then created the folder for the project in the repository. I entered the following in Settings|Version Control|Subversion:
    
    File:.idea/workspace.xml
    File: .gradle
    Directory: build/
    Mask: *.iws
    Directory: .idea/libraries/
    Directory: app/build/
    File: local.properties
    
      下面的更彻底
    *.iml
    *.iws
    *.ipr
    .idea/
    .gradle/
    local.properties
    
    */build/
    
    *~
    *.swp
    
    167. packagingOptions {
        exclude 'META-INF/LICENSE.txt'
        exclude 'META-INF/NOTICE.txt'
    }
    
    168.CLEAN

    Android Studio fails to debug with error org.gradle.process.internal.ExecException Error:Execution failed for task ':app:dexDebug'.

    com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command 'C:\Program Files\Java\jdk1.7.0_11\bin\java.exe'' finished with non-zero exit value 2

    169.Eclipse混淆文件导入Android Studio Gradle编译报input jar file is specified twicehttp://blog.csdn.net/X_i_a_o_H_a_i/article/details/41979983 原因是build.gradle文件配置了

    dependencies { compile fileTree(include: '*.jar', dir: 'libs')

    }

    里面已经添加过jar包,混淆文件proguard-rules.pro里面又加了句-libraryjars libs/***.jar,将-libraryjars libs/***.jar 前面用#号注释或者直接删掉即可。

    170.key.java android-stuido 中错误提示:“非法字符: \65279” http://www.cnblogs.com/littlehb/archive/2013/04/20/3032721.html

    对设置为“UTF-8”编码的文件在修改后保存时自动加入了UTF-8文件签名,即BOM(将文件以十六进制形式查看,可见文件首部为“EF BB BF”).

    解决方法: 使用Notepad++去除BOM 【在IntelliJ IDEA 12使用,可成功】

    具体方法:先设置以UTF-8无ROM方式编码,然后打开文件,另存此文件,覆盖掉原文件。
    
    设置方法:格式->以UTF-8无ROM方式编码。
    
    171.LocalBroadcastManager 解决fragment中通信的问题
    最近在开发平板项目,完全是fragmentactivity+fragment的结构。看起来似乎简单,但是和以前不同的是,业务逻辑非常复杂,多处的非常规跳转,
    fragment之间的数据交换,一处更新多处更新等操作,有时玩起来都心塞。项目背景介绍完毕。
    现在有这样一个场景,项目需求是,后台可配置功能,也就是说app端所有的功能都是后台配置上去的动态生成,对应的功能界面如下图。
    能够完成在应用内的广播发送,而且比全局广播更具优势:
    1).广播只会在你的应用内发送,所以无需担心数据泄露,更加安全。
    2).其他应用无法发广播给你的应用,所以也不用担心你的应用有别人可以利用的安全漏洞
    3).相比较全局广播,它不需要发送给整个系统,所以更加高效。
    
    2. 使用方式
    广播注册:
    LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(getActivity());
    IntentFilter filter = new IntentFilter();
    filter.addAction(ACTION);
    myBroadcastReciver = new MyBroadcastReciver();
    localBroadcastManager.registerReceiver(myBroadcastReciver, filter);
    复制代码
    广播发送:
    Intent intent = new Inten();
    intent.setAction(SaleLeftFragment.ACTION);
    intent.putExtra(TAG, data);
    LocalBroadcastManager.getInstance(getActivity()).sendBroadcast(intent);
    复制代码
    3.使用注意
    在使用的时候,请关注以下几点:
    1).LocalBroadcastManager注册广播只能通过代码注册的方式。
    2).LocalBroadcastManager注册广播后,一定要记得取消监听。
    3).重点的重点,使用LocalBroadcastManager注册的广播,您在发送广播的时候务必使用
    

    Fragment间的广播消息接收

    广播注册,可以写在Activity(onCreate),也可以写在Fragment(onActivityCreated)里。
    
    复制代码
    LocalBroadcastManager broadcastManager = LocalBroadcastManager.getInstance(getActivity());
    IntentFilter intentFilter = new IntentFilter();
    intentFilter.addAction("android.intent.action.CART_BROADCAST");//建议把它写一个公共的变量,这里方便阅读就不写了。
    BroadcastReceiver mItemViewListClickReceiver = new BroadcastReceiver() {
    	    @Override
    	    public void onReceive(Context context, Intent intent){
    	        System.out.println("OK");
    	    }
     };
     broadcastManager.registerReceiver(mItemViewListClickReceiver, intentFilter);
    复制代码
     
    
     
    
    
    发送广播
    
    Intent intent = new Intent("android.intent.action.CART_BROADCAST");
    LocalBroadcastManager.getInstance(getActivity()).sendBroadcast(intent);
    
    172.[How can I] Change the password, so I can share it with others and let them sign

    Using keytool:

    keytool -storepasswd -keystore /path/to/keystore
    Enter keystore password:  changeit
    New keystore password:  new-password
    Re-enter new keystore password:  new-password
    
    173.How to create a release signed apk file using Gradle?

    http://stackoverflow.com/questions/18328730/how-to-create-a-release-signed-apk-file-using-gradle

    174.No activity found to handle intent action.dial

    Uri.parse("tel:" + a1) Android 调用系统Email --多附件 Intent.ACTION_SENDTO 无附件的发送 Intent.ACTION_SEND 带附件的发送 Intent.ACTION_SEND_MULTIPLE 带有多附件的发送 Intent data=new Intent(Intent.ACTION_SENDTO);
    data.setData(Uri.parse("mailto:455245521@qq.com"));
    data.putExtra(Intent.EXTRA_SUBJECT, "这是标题");
    data.putExtra(Intent.EXTRA_TEXT, "这是内容");
    startActivity(data);

    175.HTML 中有用的字符实体

    注释:实体名称对大小写敏感! 显示结果 描述 实体名称 实体编号 空格     < 小于号 < <

    大于号 > > & 和号 & & " 引号 " " ' 撇号 ' (IE不支持) ' ¢ 分 ¢ ¢ £ 镑 £ £ ¥ 日圆 ¥ ¥ € 欧元 € € § 小节 § § © 版权 © © ® 注册商标 ® ® ™ 商标 ™ ™ × 乘号 × × ÷ 除号 ÷ ÷

    176.Generating signed release APK using Gradle https://github.com/almalkawi/Android-Guide/wiki/Generating-signed-release-APK-using-Gradle
     How to create a release signed apk file using Gradle?   http://stackoverflow.com/questions/18328730/how-to-create-a-release-signed-apk-file-using-gradle
    android {
        compileSdkVersion 17
    
        signingConfigs {
    	releaseSigning {
    	    storeFile file(System.getenv("ANDROID_KEYSTORE"))
    	    storePassword System.console().readLine("\nStore password: ")
    	    keyAlias System.getenv("ANDROID_KEYALIAS")
    	    keyPassword System.console().readLine("Key password: ")
    	}
        }
    
        buildTypes {
    	release {
    	    signingConfig signingConfigs.releaseSigning
    	}
        }
    }
    Now, you can generate the signed and zipaligned release APK using the Gradle task:
    
    ./gradlew assembleRelease
    
    177.Android Studio: How to use Monitor(DDMS) tool to debug application step by step?
    Go to "Tools > Android > Android Device Monitor" in v0.8.6. That will pull up the DDMS eclipse perspective.
    
     dump viewhierarchy for ui automator 可以查看应用的布局,当对某个app布局感兴趣时,可以采用此种方式查看此app的布局,相当于布局反编译功能。
    
    178. 如何通过java代码设置textview字体加粗。
    textView.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD));//加粗  
    
    179.qickreturn swiperefreshlayout
    180. viewpager中彻底性动态添加、删除Fragment http://stackoverflow.com/questions/10396321/remove-fragment-page-from-viewpager-in-android
    viewpager在加载当前页的时候已经将pager页左右页的内容加载进内存里了,这样才保证了viewpager左右滑动的时候的流畅性;
    为了解决彻底删除fragment,我们要做的是:
    1.将FragmentPagerAdapter 替换成FragmentStatePagerAdapter,因为前者只要加载过,fragment中的视图就一直在内存中,在这个过程中无论你怎么刷新,清除都是无用的,直至程序退出; 后者 可以满足我们的需求。
    2.我们可以重写Adapter的方法--getItemPosition(),让其返回PagerAdapter.POSITION_NONE即可;
    
    181. Uri.encode
    182.omniplan mac
    183.androidstudio svn delete
    184.GreenDao query OR within AND
    http://stackoverflow.com/questions/22785327/greendao-query-or-within-and
    
    QueryBuilder.and() and QueryBuilder.or() are used to combine WhereConditions. The resulting WhereConditions have to be used inside QueryBuilder.where() (which will combine the conditions using AND) or QueryBuilder.whereOr().
    
    185.greendao 删除某个对象

    http://www.cnblogs.com/spring87/p/4364769.html 1.public void deleteCityInfo(int cityId) 2.{ 3.QueryBuilder qb = cityInfoDao.queryBuilder(); 4.DeleteQuery bd = qb.where(Properties.CityId.eq(cityId)).buildDelete(); 5.bd.executeDeleteWithoutDetachingEntities(); 6.}

    187. androidstudio ctrl+shift+t 模糊搜索类
                    ctrl+o 本文件的函数
    	    ctrl+g  全局搜索类 变量 函数
                   alter+insert 快速插入getset等
    	Ctrl+Shift+F7 可以高亮当前元素在当前文件中的使用
    	Android Studio 如何提示函数用法?   先选中,然后按F2
    
    188.Fragment的通信有关问题, 新建Fragment为何不要在构造方法中传递参数

    http://233.io/article/1057296.html

    189.

    在理解反射的时候,不得不说一下内存。 先理解一下JVM的三个区:堆区,栈区,和方法去(静态区)。 堆区:存放所有的对象,每个对象都有一个与其对应的class信息。在JVM中只有一个堆区,堆区被所有的线程共享。 栈区:存放所有基础数据类型的对象和所有自定义对象的引用,每个线程包含一个栈区。每个栈区中的数据都是私有的,其他栈不能访问。 栈分为三部分: 基本类型变量区、执行环境上下文、操作指令区(存放操作指令)。 方法区:即静态区,被所有的线程共享。方法区包含所有的class和static变量。它们都是唯一的。

    在启动一个java虚拟机时,虚拟机要加载你程序里所用到的类 ,这个进程会首先跑到jdk中(在jdk的jre/lib/ext文件夹里找那些jar文件),如果没有找到,会去classpath里设置的路径去找。
    在找到要执行的类时:
    1.首先将找到的类的信息加载到运行时数据区的方法区。这个过程叫做类的加载。所以一下static类型的在类的加载过程中就已经放到了方法区。所以不用实例化就能用一个static类型的方法。
    2.加载完成后,在new一个类时,首先就是去方法区看看有没有这个类的信息。如果没有这个类的信息,先装载这个类。then,加载完成后,会在堆区为new的这个类分配内存,有了内存就有了实例,而这个实例指向的是方法区的该类信息。其实就是存放了在方法区的地址。而反射就是利用了这一点。
    
    190. Genymotion Crash after a few minutes

    E/eglCodecCommon(2163): writeFully: failed: Broken pipe

    http://stackoverflow.com/questions/23855115/genymotion-crash-after-a-few-minutes

    It's not really caused by your application, so don't worry.
    
    It often happens when you computer goes in sleep mode and when you come back Genymotion will throw this exception (it happens to me very often).
    
    In your specific case sounds like the device goes in sleep mode so a way to fix it is simply to enable "Always stay awake" in developers options.
    
    192. A WebView method was called on thread 'Timer-1'. All WebView methods must be called on the UI thread. Future versions of WebView may not support use on other threads.

    java.lang.IllegalStateException: Timer was canceled at java.util.Timer.scheduleImpl(Timer.java:561) at java.util.Timer.schedule(Timer.java:481) at com.jetsun.hbfc.activity.base.CommonWebViewActivity$3.onPageStarted(CommonWebViewActivity.java:178)

    Webview reload page get force close

    Change your TimerTask to the following:

    new TimerTask() { @Override public void run() { runOnUiThread(new Runnable() { public void run() { wvNovaMenzaCammera.reload(); } });
    } }

    193.http://blog.csdn.net/xieyuooo/article/details/8607220

    Timer与TimerTask的真正原理&使用介绍

    194.http://233.io/article/1057296.html Fragment的通信有关问题, 新建Fragment为何不要在构造方法中传递参数
    195.Add a new file in Intellij doesn't add to subversion
    http://stackoverflow.com/questions/2817452/add-a-new-file-in-intellij-doesnt-add-to-subversion
    	Go to File -> Settings -> Version control -> Confirmation -> When files are created You're probably looking for "Add silently".
    
    196.使用Android Studio的lint清除无用的资源文件 http://waychel.com/shi-yong-android-studiode-lintqing-chu-wu-yong-de-zi-yuan-wen-jian/
    197. Android应用程序release打签名包时,出现错误:"XXX" is not translated in "af" (Afrikaans), "am" (Amharic), "ar" (Arabic).....

    eclipse http://blog.csdn.net/u012264122/article/details/39371343

    androidstudio http://stackoverflow.com/questions/20699147/gradle-build-fails-on-lint-task

    // This is important, it will run lint checks but won't abort build
      lintOptions {
          abortOnError false
      }
    
    
    if abortOnError false will not resolve your problem, you can try this.
    
    lintOptions {
        checkReleaseBuilds false
    }
    
    198.

    全面提高Ubuntu Linux操作系统运行速度

    1.六招让你的Ubuntu马上提速  http://article.yeeyan.org/view/205625/294577
    
    
           Where did the startup-applications-preferences program go?  ubuntu satartup applications preference
    	 http://askubuntu.com/questions/159887/where-did-the-startup-applications-preferences-program-go
    	The if you can't find the program anywhere, try running gnome-session-properties from the command line (or alt+f2).
    
    	If it's not installed, I'm sure you can install the package gnome-session-properties.
    
    2. 将localhost化名为主机名
    
    	据说这个方法可以改善使用Ubuntu一段后,在GNOME中启动应用程序变慢的问题
    
    	# vi /etc/hosts
    
    	127.0.0.1 localhost
    
    	127.0.1.1 Ubuntu
    
    	===>
    
    	127.0.0.1 localhost Ubuntu
    
    	127.0.1.1 Ubuntu
    
    	注:在第一行末尾加上主机名,也就是第二行的那个名字。
    
    3.安装preload
    
    	可以把一些常用到的lib库和应用程序预加载到内存,以提高程序的启动速度
    
    	# apt-get install preload
    
    199.volley由于网络访问比较慢,导致访问两次的现象 http://stackoverflow.com/questions/22428343/android-volley-double-post-when-have-slow-request?
    	http://stackoverflow.com/questions/3352424/httpurlconnection-openconnection-fails-second-time
    
    200.当你想让一个高度值不足scrollview的子控件fillparent的时候,单独的定义 android:layout_height="fill_parent"是不起作用的,必须加上fillviewport属性,当子控件的高度值大于 scrollview的高度时,这个标签就没有任何意义了。
    201.activity FLAG_ACTIVITY_REORDER_TO_FRONT 无法startActivity http://blog.csdn.net/mingli198611/article/details/8678513
    202. Genymotion模拟器运行项目 jPush报错jpush Couldn't load jpush: findLibrary returned null

    at cn.jpush.android.api.JPushInterface.init(Unknown Source)

    203.androidstudio检查更新。Android Studio支持自动检查更新。之前尚未发布正式版时,一周有时会有几次更新。你可以设置检查的类型,用以控制更新类型。
    Settings --> Updates 。勾选 Check for updates in channel ,即开通了自动检查更新。你可以禁用自动检查更新。右侧的列表,是更新通道。
    Stable Channel : 正式版本通道,只会获取最新的正式版本。
    Beta Channel : 测试版本通道,只会获取最新的测试版本。
    Dev Channel : 开发发布通道,只会获取最新的开发版本。
    Canary Channel : 预览发布通道,只会获取最新的预览版本。rc  release candidates
    

    以上4个通道中, Stable Channel 最稳定,问题相对较少, Canary Channel 能获得最新版本,问题相对较多。

    204.AndroidのActivity之Listview组件快速拖动 android:fastScrollEnabled="true" android:focusable="true"

    205. Lint: How to ignore “ is not translated in ” errors?

    http://stackoverflow.com/questions/11443996/lint-how-to-ignore-key-is-not-translated-in-language-errors To ignore this in a gradle build add this to the android section of your build file:

    lintOptions { disable 'MissingTranslation' }

    Authentication Error errorcode: 201 uid: -1 appid -1 msg: APP被用户自己禁用 205. ubuntu apktool 2.0 Exception in thread "main" brut.androlib.err.UndefinedResObject

    keytool -list -keystore SportsApp.keystore

    206.

    Exception in thread "main" brut.androlib.AndrolibException: Could not decode arsc file at brut.androlib.res.decoder.ARSCDecoder.decode(ARSCDecoder.java:56) at brut.androlib.res.AndrolibResources.getResPackagesFromApk(AndrolibResources.java:491) at brut.androlib.res.AndrolibResources.loadMainPkg(AndrolibResources.java:74) at brut.androlib.res.AndrolibResources.getResTable(AndrolibResources.java:66) at brut.androlib.Androlib.getResTable(Androlib.java:50) at brut.androlib.ApkDecoder.getResTable(ApkDecoder.java:189) at brut.androlib.ApkDecoder.decode(ApkDecoder.java:114) at brut.apktool.Main.cmdDecode(Main.java:146) at brut.apktool.Main.main(Main.java:77) Caused by: java.io.IOException: Expected: 0x001c0001, got: 0x00000000 at brut.util.ExtDataInput.skipCheckInt(ExtDataInput.java:48) at brut.androlib.res.decoder.StringBlock.read(StringBlock.java:44) at brut.androlib.res.decoder.ARSCDecoder.readPackage(ARSCDecoder.java:102) at brut.androlib.res.decoder.ARSCDecoder.readTable(ARSCDecoder.java:83) at brut.androlib.res.decoder.ARSCDecoder.decode(ARSCDecoder.java:49) ... 8 more

    It seems there's some problem in building the resources while recompiling the apk. what you can do is, when you decompile your apk use this command

    apktool d -f -r apkfilename.apk here -f is to replace previous decompiled apk's code and -r is to ignore the decompiling of resources.

    this would prevent the resources from being decompiled and will simply copy the same resources when you recompile the apk.

    207.尊敬的三星用户您好:

    三星I9228手机截止目前支持升级的最新版本是安卓4.1 1.Fota方式升级:通过手机设定-(一般)-关于设备-系统更新(或软件更新)-更新。 此方式升级固件注意事项: 1).手机需设置为当前时间 2).建议升级时手机有足够的电量最好多于50%。 3).手机需要有足够的存储空间(至少1GB USB存储器)。 4).网络环境稳定(系统/固件更新版本较大,可能会消耗较多流量,建议升级时可以使用WLAN上网方式操作)。 2.Kies方式升级:在电脑中安装Kies软件,安装后手机和电脑通过USB连接,打开Kies软件,如有手机系统/固件新版本时Kies软件会有固件升级提示,点击升级即可。 1).Kies下载链接如下:http://www.samsung.com/cn/support/usefulsoftware/KIES/JSP 注意:下载安装时手机与电脑不要连接。 若您使用的手机或平板电脑采用的是安卓4.3及以上操作系统,请下载安装Kies3版本。 2).Kies方式升级固件注意事项:http://skp.samsungcsportal.com/integrated/popup/FaqDetailPopup3.jsp?cdsite=cn&seq=438936 3.送到三星服务中心升级:携带购机发票、包修卡和机器到三星服务中心,由专业的售后工程师帮助您升级。 具体服务中心查询请访问:http://support-cn.samsung.com/support/ServiceLocations.asp 欢迎您向我们反馈您的建议和评价: www.diaochaquan.cn/s/3Z0LE

    208

    android sharesdk微信分享 创建应用时所需的应用签名怎么得到

    根据这个页面提供的一个工具 签名生成工具 https://open.weixin.qq.com/cgi-bin/readtemplate?t=resource/app_download_android_tmpl&lang=zh_CN Android资源下载 开发工具包 开发第三方应用所需要的库以及文件。点击下载 范例代码 包含了一个完整的范例工程。该范例的使用可以参阅Android平台上手指南:HelloWeixin@Android。点击下载 签名生成工具用于获取安装到手机的第三方应用签名的apk包。点击下载

    可以一个字符串,类似于: 应用签名:049a9fde46bfc5087f3825582208b248 安装这个应用可以获取本手机已经安装的某个android软件,根据软件的包名,类似于: com.demo.AppX 来查找这个软件,以及获取这个软件的 应用签名。 还有一个工具是在http://wiki.open.qq.com/wiki/mobile/SDK下载 Android_SDK_V2.3.1 的tools目录下有一个 获取签名.apk ,这个也可以获取,但是我测试发现,只能显示一部分的本机应用,有些应用查不到,就麻烦了..

    209.:app:lintVitalRelease

    Failed converting ECJ parse tree to Lombok for file /home/yyb/work/BoShiTong/trunk/HBFC/Android/Comment/HBFC-AS2/app/src/main/java/com/jetsun/hbfc/widget/ioc/AbIocView.java java.lang.ClassCastException: lombok.ast.Annotation cannot be cast to lombok.ast.Expression

    210.

    Ignoring InnerClasses attribute for an anonymous inner class

    211.

    WebView 在Android4.4的手机上onPageFinished()回调会多调用一次(具体原因待追查) 需要尽量避免在onPageFinished()中做业务操作,否则会导致重复调用,还有可能会引起逻辑上的错误. onPageStarted和onPageFinished 会加载两次

    212.Android WebView常见问题及解决方案汇总

    http://blog.csdn.net/t12x3456/article/details/13769731

    213.Android check network connectivity on some tablets crash

    java.lang.NullPointerException at com.xxx.Util.getNetworkState(Util.java:246)

    214.What is the equivalent of Eclipse “Custom debug Keystore” in Android studio?
    http://stackoverflow.com/questions/17189076/what-is-the-equivalent-of-eclipse-custom-debug-keystore-in-android-studio
    
    215.Android Studio在调试时,修改变量的值 在“Variables”窗口中,选择需要修改的变量,然后右键,选“Set Value..."。快捷键F2
    216.打开百度定位导致MyApplication中的初始化重新加载一遍。如果此时有自动登录等,会导致重新登录 而目前的凭证失效
    217.android webview和js交互json对象 。通过字符串传递。然后通过jsonobject把字符串生成json对象从中获取数据。
    218. Android Studio开发jni ndk

    主要有以下三块

    1. Javah生成JNI头文件
      需要进入到/src/mian 这个目录下 。如果不进入这个目录等会运行javah的时候会提示: 错误: 找不到 'com.lcj.ndk_demo_2.HelloNDK' 的类文件 javah -d jni -classpath ....\build\intermediates\classes\debug com.lcj.ndk_demo_2.HelloNDK jni 是生成的头文件需要存放的文件夹(一般取名jni才对) ....\build\intermediates\classes\debug 是class所在目录(Build—>Make Project生成的class文件都在这里,这是一个相对路径)
      com.lcj.ndk_demo_2.HelloNDK 是class文件的文件名(根据之前的java文件生成的) 参考 http://wenku.baidu.com/view/105474098e9951e79b8927a3.html 2.根据上不生成的.h文件 写.c和makefile 3.ndk-build【这个androidstudio1.2已经集成,可以直接编译ndk,所以多一个选择】 易出现的问题 When running the ndk-build command I get the following error:
    Android NDK: Could not find application project directory !    
    Android NDK: Please define the NDK_PROJECT_PATH variable to point to it
    
    解决方案
    
    NDK_PROJECT_PATH is an environment variable so you don't have to include in the Android.mkfile. Is nkd-build launched in the project directory?
    
    For more info read the docs in docs/HOWTO.html in the NDK folder where I read
    
    Starting with NDK r4, you can simply place the file under $PROJECT/jni/ and launch the 'ndk-build' script from your project tree.
    
    If you want to use 'ndk-build' but place the file to a different location, use a GNU Make variable override as:
    
    ndk-build NDK_APPLICATION_MK=/path/to/your/Application.mk
    
    219.Android下使用lamemp3库将PCM录音数据压缩为MP3格式
            文章最下面有demo 很不错 通过javah修改下,可以直接用
       来源:    http://ikinglai.blog.51cto.com/6220785/1228730
    
    220.Android Studio 不自动弹起代码提示功能解决办法 do not auto popup code completion

    升级后不自动弹起代码提醒功能了,而且变量也不标注颜色,简直是气死我了,Google了各种关键词,都没办法 后来看到有个Power Save Mode,昨天看到笔记本发热厉害就给勾上了,是不是这个原因呢? 取消之后一切正常,看来是省电模式下禁用了这些功能,通过反射来实现代码的autoComplete是会增加CPU运算量。

    File-->Power Save Mode .勾掉省电模式 参考:http://blog.csdn.net/ameryzhu/article/details/14105275

    221. 百度地图相关 在Genymotion上启动项目时,程序抛出异常
    1. 问题描述: 1、在Genymotion上启动项目时,程序抛出异常,报错日志为:11-10 09:18:44.577: E/com.btten.base.CrashReportHandler(1298): Caused by: java.lang.UnsatisfiedLinkError: Cannot load library: load_library[1093]: Library '/system/lib/libhoudini.so' not found

    2. 问题分析: 1、鉴于Genymotion是只支持x86架构的,所以从.so文件入手找问题,项目中导入了jpush的.so配置文件,jpush官网上的解释通常都是http://docs.jpush.cn/pages/viewpage.action?pageId=7864765,新建x86、mips 、armeabi-v7a几个目录,然后把libjpush.so也复制一份过去。尝试之后发现不起作用。

    3. 解决办法: 1、网上找了很久发现如下办法,下载一个ARM Translation Installer的压缩包,安装到Genymotion上,重启下,重新运行程序,ok,问题顺利解决。简要摘抄步骤如下: Download the following ZIPs: ARM Translation Installer v1.1 Hosted by FILETRIP(Mirrors) - If you have issues flashing ARM Trnaslation, Try re-downloading from a mirror Download the correct GApps for your Android version: If you have issues flashing GApps, Try re-downloading from a mirror Google Apps for Android 4.4(Mirror)(Download from CM11 Links)(4.4 GApps might be buggy) Google Apps for Android 4.3(Mirrors) Google Apps for Android 4.2 Google Apps for Android 4.1 Next Open your Genymotion VM and go to the Homescreen Now Drag&Drop the Genymotion-ARM-Translation.zip onto the Genymotion VM window. It should say "File transfer in progress", once it asks you to flash it click 'OK' Now Reboot your VM using ADB or an app like ROM Toolbox. If nescessary you can simply close the VM window, but I don't recommend it.

      详情转载地址:http://forum.xda-developers.com/showthread.php?t=2528952

    222. 百度地图相关。E/baidumapsdk﹕ Authentication Error errorcode: -1 uid: -1 appid -1 msg: AndroidManifest.xml的application中没有meta-data标签
    223. 百度地图相关 百度地图去掉缩放按钮

    MapView放在ScrollView中,滚动时出现黑条 http://bbs.lbsyun.baidu.com/forum.php?mod=viewthread&tid=1093 应该GLSurfaceView放在ScrollView内部的问题.1.3.5用View直接绘制没有问题.能否在下版中提供一个底层基于View绘制的MapView

    版主,我在想,当滚动用截取当前地图的bitmap.(调用getCurrentMap())然后盖在GLSurface上.但getCurrentMap()操作是异步的,用android自带的View.getDrawingCache()也未能成功获取.上述不成功后,由于需求限制可以对地图不操作,尝试了下能不能再MapView完成地图加载后getCurrentMap()把截图放在ImageView中盖在MapView上,但未能找到相应的监听方法.见贴:http://bbs.lbsyun.baidu.com/viewthread.php?tid=1104&extra=page%3D1.现在改用1.3.5在做.QQ:396920165能否交流下

    scrollview内嵌mapview后的滑动问题

    百度地图mapview放在scrollview中滑动黑屏

    后面我试下了直接用截图功能。mapview设置隐藏,然后方法没被执行。是不是在mapview 不显示的情况下。截图功能不可用? 开始移动前截图覆盖 静态。不可拖动但是可要能点击

    建议不要在scroll中使用mapview 因为本身map是用opengl绘制的,这个东西在scroll中存在性能问题,所以导致的体验效果不佳,请考虑改变实现方式。

    百度map1.3.5 http://developer.baidu.com/map/reference/index.php?title=Class:android%E6%A0%B8%E5%BF%83%E7%B1%BB/MapView

    静态【不可放大缩小】的mapview。点击无效

    http://www.cnblogs.com/trinea/archive/2012/11/14/2770433.html

    224.Android自定义DataTimePicker(日期选择器) http://blog.csdn.net/wwj_748/article/details/38778631
    225.Content-Type: application/x-www-form-urlencoded;

    可以通过mitmproty分析

    https://www.imququ.com/post/four-ways-to-post-data-in-http.html

    四种常见的 POST 提交数据方式

    application/x-www-form-urlencoded multipart/form-data text/xml application/json text/xml

    226.androidstudio 升级后无法使用git svn等代码管理工具。

    vcs -->Enable Version Control Integration 选择git/subversion 即可

    227.androidstudio 升级后发现 编写代码自动提醒功能没了。

    原因在于打开了File--->Power Saved Mode,关闭即可。

    228.dshow 音频采集
    229.kill -SIGKILL PID

    强行中止(经常使用杀掉)一个进程标识号为324的进程:   #kill -9 324   (2)解除Linux系统的死锁    在Linux中有时会发生这样一种情况:一个程序崩溃,并且处于死锁的状态。此时一般不用重新启动计算机,只需要中止(或者说是关闭)这个有问题的程序 即可。当kill处于X-Window界面时,主要的程序(除了崩溃的程序之外)一般都已经正常启动了。此时打开一个终端,在那里中止有问题的程序。比 如,如果Mozilla浏览器程序出现了锁死的情况,可以使用kill命令来中止所有包含有Mozolla浏览器的程序。首先用ps命令查找该程序的 PID,然后使用kill命令停止这个程序:   #kill -SIGKILL XXX   其中,XXX是包含有Mozolla浏览器的程序的进程标识号。   (3)使用命令回收内存   我们知道内存对于系统是非常重要的,回收内存可以提高系统资源。kill命令可以及时地中止一些"越轨"的程序或很长时间没有相应的程序。例如,使用top命令发现一个无用(Zombie)的进程,此时可以使用下面命令:   #kill -9 XXX   其中,XXX是无用的进程标识号。   然后使用下面命令:   #free   此时会发现可用内存容量增加了。   (4)killall命令   Linux下还提供了一个killall命令,可以直接使用进程的名字而不是进程标识号,例如:   # killall -HUP inetd

    #####230.android导入eclipse项目后,出现如下问题

    1.Error:The project is using an unsupported version of the Android Gradle plug-in (0.12.2). The recommended version is 1.2.3.

    classpath 'com.android.tools.build:gradle:1.2.3'

    在build.gradle 根据提示把 dependencies { classpath 'com.android.tools.build:gradle:0.12.+' }

    修改为 dependencies { classpath 'com.android.tools.build:gradle:1.2.3' }

    2.上面修改后会出现如下错误:

    Error:Unable to load class 'org.codehaus.groovy.runtime.typehandling.ShortTypeHandling'. Possible causes for this unexpected error include:You are using JDK version 'java version "1.7.0_71"'. Some versions of JDK 1.7 (e.g. 1.7.0_10) may cause class loading errors in Gradle. Please update to a newer version (e.g. 1.7.0_67).

    明明用的就是jdk1.7.0_71[比1.7.0_67还新] 却提示不对,问题起始不在jdk这而是 gradle-wrapper.properties

    distributionUrl=http://services.gradle.org/distributions/gradle-1.12-all.zip 估计用的是jdk1.7.0.10

    把 distributionUrl=http://services.gradle.org/distributions/gradle-1.12-all.zip 修改为 distributionUrl=https://services.gradle.org/distributions/gradle-2.2.1-all.zip

    ok 经过上面两步,从studio导入eclipse项目的正常使用。

    #####231.android 注释模板 Settings-->Editor-->File and Code Templates-->Includes

    #####232.shape中子节点的常用属性

    1. <gradient> 渐变

    android:startColor 起始颜色 android:endColor 结束颜色 android:angle 渐变角度,0从上到下,90表示从左到右,数值为45的整数倍默认为0; android:type 渐变的样式 liner线性渐变 radial环形渐变 sweep

    例如:

    <shape xmlns:android="http://schemas.android.com/apk/res/android"
        type="rectangle">
        <gradient
            android:angle="270"
            android:endColor="#9f36a0"
            android:startColor="#65216a" />
    </shape>
    

    2.<corners > 圆角 android:radius 圆角的半径 值越大角越圆

    android:topRightRadius 右上圆角半径

    android:bottomLeftRadius 右下圆角角半径

    android:topLeftRadius 左上圆角半径

    android:bottomRightRadius 左下圆角半径 如果你把4个角设成为90的话,那么改图片是一个圆! 3.<solid > 填充android:color 填充的颜色

    4.<stroke > 描边 android:width 描边的宽度 android:color 描边的颜色 android:dashWidth 表示'-'横线的宽度 android:dashGap 表示'-'横线之间的距离

    参考 http://blog.csdn.net/cs_li1126/article/details/11781577

    #####233. GestureOverlayView

    #####234.Animation lInAnim = AnimationUtils.loadAnimation(mActivity, R.anim.push_left_in); #####235. 使用volley 错误时,无法看到详细的信息。 可以有两种方式处理

    方法1.抓包 通过Fiddler抓包,在ubuntu系统下通过mitmproty来抓包。或者android4.4chrome浏览器--工具--检查设备来抓包。

    方法2. 参考 Android: How handle message error from the server using Volley? 在gsonrequest中重写parseNetworkError 如下: //In your extended request class

    @Override 
    protected VolleyError parseNetworkError(VolleyError volleyError){
            if(volleyError.networkResponse != null && volleyError.networkResponse.data != null){
                    VolleyError error = new VolleyError(new String(volleyError.networkResponse.data));
                    volleyError = error;
                } 
     
            return volleyError;
        } 
    } 
    

    还要提示一点排查错误信息可以通过androidstudio的筛选 error volley。来直观的看到错误的状态码。 NetworkError ClientError ServerError AuthFailureError ParseError NoConnectionError TimeoutError

    知其然,还要知其所以然

    BasicNetwork.java 中函数 performRequest执行错误时会抛出错误。 throw new ServerError(networkResponse);

    networkResponse的类如下: public class NetworkResponse { public final int statusCode; public final byte[] data; public final Map<String, String> headers; public final boolean notModified; ...... } 所以重写gsongrequest中的 方法parseNetworkError。通过networkResponse的data获得更详细的错误信息信息。

    #####236. url编码 遇到一个很奇怪的问题,同一个url在手机端请求 返回400【页面不存在】 而把这个url放在pc浏览器请求却是好的。 最后发现是url中有个空格 。在app上没有进行url.encode 导致。至于pc上请求没问题是自动做了url编码处理。 切记 请求的url有特殊字符 如空格 加号等,一定要url编码。

    #####237. How to add a header to a listView which is inside SwipeRefreshLayout?http://stackoverflow.com/questions/27048416/how-to-add-a-header-to-a-listview-which-is-inside-swiperefreshlayouthttps://code.google.com/p/android/issues/detail?id=80227 上述是2014年12月份报的android自身 bug。先已经修改

    android.widget.ListView{41ad4e90 VFED.VC. .F...... 0,0-720,1110 #7f090078 app:id/listview}

    #####238. 定义键盘 会遇到“当按返回键界面退出,但虚拟键盘没有消失的现象”针对这个问题,可以在onpause中强制隐藏它。代码如下。 InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(et_content.getWindowToken(), 0);

    #####239. 代码混淆导致问题,快速定位 在代码混淆打包时,屏蔽了用到的第三方库,以及常规的android混淆屏蔽,但生成的apk,运行还是会崩溃。事出必有因,后来分析找到原因是使用greendao自动生成的java-gen下package中的内容没有屏蔽代码混淆,导致存储数据库时,报a(SourceFile:) NullPointerException **** 混淆打包apk,运行崩溃 总结如下:

    我们在打包时,debug版本没问题,但混淆后release版本有时会出现异常崩溃, 比如:**a(SourceFile:) NullPointerException **

    针对这种情况,可以通过抓UncaughtExceptionHandler崩溃日志或者第三方比如云测工具查看崩溃的原因。在androidstudio下还有一种更好的方式。

    在androidstudio中可以设置debug下也混淆,通过android log直观的、快速的定位问题所在

     signingConfigs {
                release {
    
                }
    
                debug{
    
                }
       }
    
        }
    
        buildTypes {
            release {
                // 不显示Log
                buildConfigField "boolean", "LOG_DEBUG", "false"
                minifyEnabled true
                // 移除无用的resource文件
                shrinkResources true
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
                signingConfig signingConfigs.release  //使用上述签名信息
    
             }
            }
            debug {
                minifyEnabled true
                // 移除无用的resource文件
                shrinkResources true
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
                signingConfig signingConfigs.debug
            }
        }
    

    #####240 通过gif展示一个效果是否直观,Ubuntu平台gif动画录制工具可以使用命令行,录制的效果很好,并且录制gif大小很小。 byzanz-record --duration=30 --x=0 --y=50 --width=500 out.gif 参数说明 --duration 录制的时长 --x录制开始的x坐标 --y录制开始的y坐标 --width 宽度 out.gif 输出文件名

    #####241.微信开放平台申请流程 http://bbs.mob.com/thread-95-1-4.html 命令操作如下

    keytool -list -keystore keystore文件路径 得到对应app的秘钥 把:去掉,大写转小写即可。

    #####242.编译ijkplayer时,报错 NDK r10: Fix make-standalone-toolchain.sh "<<<" bashism

    这个是android官方问题 把for ABI in $(tr ',' ' ' <<< $ABIS); do 修改为 for ABI in $(echo "$ABIS" | tr ',' ' '); do

    https://code.google.com/p/android/issues/detail?id=74145 #####243.ubuntu nginx rtmp流媒体服务器的安装 Setup Nginx-RTMP on Ubuntu 14.04
    英文文档 https://www.vultr.com/docs/setup-nginx-rtmp-on-ubuntu-14-04 中文文档 http://www.cnblogs.com/cocoajin/p/4353767.html

    nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use) 80端口被占用解决方法:

    sudo fuser -k 80/tcp sudo service nginx start

    #####242.ubuntu查看占用某端口的程序 查看端口使用情况,使用netstat命令。 查看已经连接的服务端口(ESTABLISHED netstat -a 查看所有的服务端口(LISTEN,ESTABLISHED) netstat -ap
    查看8080端口,则可以结合grep命令:netstat -ap | grep 8080

    1. 显示占用某个端口的程序
    lsof -i:80
    lsof -i:5000
    2. 显示某个程序是否在运行,查看某个运行的程序
    ps -aux | grep "paster"
    ps -aux | grep apache2
    

    #####243.架构师编写详细设计的重要性。 详细设计,这是考验技术专家设计思维的重要关卡,详细设计说明书应当把具体的模块以最’干净’的方式(黑箱结构)提供给编码者,使得系统整体模块化达到最大;一份好的详细设计说明书,可以使编码的复杂性减低到最低,实际上,严格的讲详细设计说明书应当把每个函数的每个参数的定义都精精细细的提供出来,从需求分析到概要设计到完成详细设计说明书,一个软件项目就应当说完成了一半了。换言之,一个大型软 件系统在完成了一半的时候,其实还没有开始一行代码工作。 #####244.http请求的url含有中字符时,需要Uri编码。Uri.encoder() #####245.使用androidstudio时,不知道什么原因svn不见了
    Android Studio missing Subversion plugin

    Please make sure that the "SubversionIntegration" plugin is enabled in Preferences > Plugins

    #####246.Error:Execution failed for task ':app:dexDebug'.> com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command '/home/xxx/tools/android/jdk1.7.0_71/bin/java'' finished with non-zero exit value 2

    检查下是否多次引用同一个jar包 以下情况

    1. module下jar包版本不同

    2. 同一个module 在libs中包含乐.jar,而在src下又把相应的source页加入了

    3. gradle中是否重复编译,

    比如 已经加了compile fileTree(include: ['*.jar'], dir: 'libs') 然而在下面又加一句compile files('libs/xxx.jar')

    参考 Error:Execution failed for task ':app:dexDebug'. com.android.ide.common.process.ProcessException

    #####246.android handler的警告Handler Class Should be Static or Leaks Occur 在使用Handler更新UI的时候public class SampleActivity extends Activity {

    private final Handler mLeakyHandler = new Handler() { @Override public void handleMessage(Message msg) { // TODO } } }会包上述warning 会导致内存泄露 原因在于匿名内部类handler持有activity的引用,当activity finish后 handler还没有处理完,导致activity的view和resource资源不能得到释放,导致内存泄露 针对这个问题google官方给出了正确的做法 通过静态内部类 包含activity的弱引用来处理。 public class SampleActivity extends Activity {

    /**

    • Instances of static inner classes do not hold an implicit
    • reference to their outer class. */ private static class MyHandler extends Handler { private final WeakReference mActivity;
    public MyHandler(SampleActivity activity) {
      mActivity = new WeakReference<SampleActivity>(activity);
    }
         
    @Override
    public void handleMessage(Message msg) {
      SampleActivity activity = mActivity.get();
      if (activity != null) {
        // ...
      }
    }
    

    }

    private final MyHandler mHandler = new MyHandler(this);

    /**

    • Instances of anonymous classes do not hold an implicit
    • reference to their outer class when they are "static". */ private static final Runnable sRunnable = new Runnable() { @Override public void run() { } };

    @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);

    // Post a message and delay its execution for 10 minutes.
    mHandler.postDelayed(sRunnable, 60 * 10 * 1000);
             
    // Go back to the previous Activity.
    finish();
    

    } }

    参考android handler的警告Handler Class Should be Static or Leaks Occur

    #####247.androidstudio不同tab切换 ctrl+tab

    #####248.androidstudio 如何自动import用到的类或接口? For Windows/Linux, you can go to File -> Settings -> Editor -> General -> Auto Import -> Java and make the following changes:

    change Insert imports on paste value to All
    
    markAdd unambigious imports on the fly option as checked
    On a Mac, do the same thing in Android Studio -> Preferences
    

    参考What is the shortcut to Auto import all in Android Studio?

    #####249.Android NDK: Could not find application project directory ! Android NDK: Please define the NDK_PROJECT_PATH variable to point to it.
    /home/cenuser/android/android-ndk-r7b/build/core/build-local.mk:130: *** Android NDK: Aborting . Stop.

    cd到jni目录。或者 ndk-build -C your_project_path
    

    #####250 .Why do I want to avoid non-default constructors in fragments? fragment设置参数正确的做法

    Make a bundle object and insert your data (in this example your Category object). Be careful, you can't pass this object directly into the bundle, unless it's serializable. I think it's better to build your object in the fragment, and put only an id or something else into bundle. This is the code to create and attach a bundle:
    
    Bundle args = new Bundle();
    args.putLong("key", value);
    yourFragment.setArguments(args);
    After that, in your fragment access data:
    
    Type value = getArguments().getType("key");
    That's all.
    

    #####251. ubuntu下删除.svn的方法

    find -type d -name '.svn' -exec rm -rfv {} \;
    
    参考 http://blog.csdn.net/zhaoyu7777777/article/details/9445717
    

    #####252. Fatal : Could not read from remote repository. git配置使用,已经把公钥发给发给服务端,在终端命令行也是可以正常的pull push,但是在androidstudio push或者pull的时候确出现上述错误 解决方式 setting --> Version Control -->Git ,In the SSH executable dropdown, choose Native

    #####253. ubuntu获取证书指纹的命令 keytool -list -keystore xxx.keystore eg:查看debug.keystore keytool -list -keystore ~/.android/debug.keystore #####254. mac 命令行安装软件 通过brew安装,相当于ubuntu中得apt-get 首先安装brew curl -LsSf http://github.com/mxcl/homebrew/tarball/master | sudo tar xvz -C/usr/local --strip 1
    然后就可以使用brew安装软件了 比如 使用brew安装软件 brew install wget
    #####255.代码混淆时 报如下错误 Error:Execution failed for task ':app:proguarxxxRelease'.

    java.io.IOException: Can't read [/libs/xxx.jar] (No such file or directory)http://stackoverflow.com/questions/26028171/android-studio-proguard-java-io-ioexception-bin-classes-no-such-file-or-d

    解答 proguard-android.txt文件中不用在指定 -injars, -outjars, or -libraryjars or libs.

    The Android Gradle plugin already specifies all input and output for you, so you must not specify -injars, -outjars, or -libraryjars.

    Moreover, the file proguard-android.txt in the Android SDK specifies all generic Android settings for you, so you shouldn't specify them again.

    Essentially, your file proguard-rules.txt can be empty, except for any application-specific settings to make sure any reflection continues to work

    #####256.Android中如何设置RadioButton在文字的右边,图标在左边 解决方法 : 第一步: android:button="@null"这条语句将原来系统的RadioButton图标给隐藏起来。 第二步: android:drawableRight="@android:drawable/btn_radio"这条语句 参考 http://blog.csdn.net/sunnyfans/article/details/7901592

    #####257.java报“非法字符: \65279 ”错误的解决方法

    众所周知,在跨程序的工程中,统一编码是至关重要的,而目前最普遍的则是统一采用“utf8”编码方案。 但是在采用utf8方案的时候,请注意编辑器的自作聪明。 比如editplus。 原因就在于某些编辑器会往utf8文件中添加utf8标记(editplus称其为签名),它会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM),它的表示的是 Unicode 标记(BOM)。 参考 http://hyl198611.iteye.com/blog/1336981 #####258.手机root后 还会出现下述情况Android: adb: copy file to /system (Permission denied) 解决方式,需要remount /system mount -o remount,rw /system #####259.androidstudio 手动添加assets文件 路径在哪 XXX\src\main\assets
    #####260.android双击back退出

    public class MainActivity extends Activity {
    
    
        private Toast toast;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            toast = Toast.makeText(getApplicationContext(), "确定退出?", 0);
    
        }
        public void onBackPressed() {
            quitToast();
        }
    
        private void quitToast() {
            if(null == toast.getView().getParent()){
                toast.show();
            }else{
                System.exit(0);
            }
        }
    }

    或者

    private Toast toast;
     protected void onCreate(Bundle savedInstanceState) {
     	...
             toast = Toast.makeText(this, "再按一次退出应用", Toast.LENGTH_SHORT);
            toast.setGravity(Gravity.BOTTOM, 0, ConversionUtil.dip2px(this, 150));
     }
    @Override 
    public void onBackPressed() { 
        if (doubleBackToExitPressedOnce) { 
            if(toast!=null){
                toast.cancel();
            }
            super.onBackPressed(); 
            return; 
        } 
     
        this.doubleBackToExitPressedOnce = true;
        toast.show();
     
        new Handler().postDelayed(new Runnable() {
     
            @Override 
            public void run() { 
                doubleBackToExitPressedOnce=false;                        
            } 
        }, 2000); 
    }  

    参考 Android关于双击退出应用的问题 #####261.anroid几个很不错的快捷键

    1. Ctrl+Shift+Alt+T 重构代码 change name
    2. Ctrl+I 水平分屏显示【需要在keymap中搜索split 设置move right的快捷键】
    3. shift+alt+L 变量生成
    4. ctrl+shift+v
      #####262.在旧项目中引入android materialdesign 时 出现如下问题 android.view.InflateException: Binary XML file line #17: Error inflating class android.support.design.internal.NavigationMenuView Caused by: java.lang.reflect.InvocationTargetException Caused by: android.content.res.Resources$NotFoundException: Resource is not a Drawable (color or path): TypedValue{t=0x2/d=0x7f0100c5 a=-1} You need to use a Theme.AppCompat theme (or descendant) with this activity.

    解决方法 :使用NavigationMenuView的Activity【一般都是mainActivity】继承自AppCompatActivity,并且修改AndroidManifest.xml中对应activity的theme,使用继承自@style/Theme.AppCompat的主题。 #####262.How to get key and value of HashMap in java

    public class AccessKeyValueOfHashMap {
            public static void main(String[] args) {
                    // Create a Empty HashMap 
                    HashMap<String, String> obHashMap = new HashMap<String, String>();
                    // Put values in hash map
                    obHashMap.put("AB", "1");
                    obHashMap.put("EF", "2");
                    obHashMap.put("Gh", "3");
                    obHashMap.put("CD", "4");
                    //Store entry (Key/Value)of HashMap in set
                    Set mapSet = (Set) obHashMap.entrySet();
                    //Create iterator on Set 
                    Iterator mapIterator = mapSet.iterator();
                    System.out.println("Display the key/value of HashMap.");
                    while (mapIterator.hasNext()) {
                            Map.Entry mapEntry = (Map.Entry) mapIterator.next();
                            // getKey Method of HashMap access a key of map
                            String keyValue = (String) mapEntry.getKey();
                            //getValue method returns corresponding key's value
                            String value = (String) mapEntry.getValue();
                            System.out.println("Key : " + keyValue + "= Value : " + value);
                    }
            }
    }

    #####263. 设置键盘回车为发送建

            android:imeOptions="actionSend"
            android:inputType="text"

    #####264. editText 取消背景格式 取消下划线等自带样式 去掉下划线只需把背景设置成为“@null”, 如果想设为其他样式也是设置背景

    #####265. How to build an .so binary for a device with a 64-bit CPU?

    latest version of the NDK (right now it's r10e)
    Application.mk
    APP_ABI := armeabi arm64-v8a armeabi-v7a x86 mips
    

    #####266. Android NDK for x86_64 has no reference for bcopy and index

    You can fix this cleanly with a single line in Application.mk (docs):
    
    APP_CFLAGS += -DSTDC_HEADERS
    

    #####267.Error:Execution failed for task ':xxx:processDebugManifest'. > Manifest merger failed : uses-sdk element cannot have a "tools:node" attribute

    This has been updated to reflect the release of API 21, Lollipop. Be sure to download the latest SDK.
    
    In one of my modules I had the following in build.gradle:
    
    dependencies {
        compile 'com.android.support:support-v4:+'
    }
    Changing this to
    
    dependencies {
        // do not use dynamic updating.
        compile 'com.android.support:support-v4:21.0.0' 
    }
    fixed the issue.
    

    参考Manifest merger failed : uses-sdk:minSdkVersion 14

    #####268.Error:(1, 1) A problem occurred evaluating project 'xxx'. > Could not create plugin of type 'LibraryPlugin'.

    修改了build.gradle中的gradle 也要修改gradle-wrapper.properties 例如:

    build.gradle
      dependencies {
            classpath 'com.android.tools.build:gradle:1.2.3'
        }
        gradle-wrapper.properties
      distributionUrl=https\://services.gradle.org/distributions/gradle-2.4-all.zip

    #####269.androidstudio Building Apps with Over 65K Methods

    android {
        compileSdkVersion 21
        buildToolsVersion "21.1.0"
    
        defaultConfig {
            ...
            minSdkVersion 14
            targetSdkVersion 21
            ...
    
            // Enabling multidex support.
            multiDexEnabled true
        }
        ...
    }
    
    dependencies {
      compile 'com.android.support:multidex:1.0.0'
    }

    #####270.Caused by: java.lang.NoClassDefFoundError: android.support.v4.util.Pools$SimplePool

    http://stackoverflow.com/questions/25477860/error-inflating-class-android-support-v7-widget-recyclerview

    #####271.Caused by: java.lang.NoSuchMethodException: [class android.content.Context, interface android.util.AttributeSet]

    http://stackoverflow.com/questions/11753719/how-do-i-properly-extend-a-layout-class

    #####272.java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid view holder adapter positionViewHolder{423a4c60 position=4 id=-1, oldPos=1, pLpos:1 scrap tmpDetached not recyclable(1) no parent}

    #####273.Failure [INSTALL_PARSE_FAILED_MANIFEST_MALFORMED]http://stackoverflow.com/questions/6056564/installation-error-install-parse-failed-manifest-malformed I was having this error because i had capital letters in my package name like this

    Com.Example.packagename after i had changed it to something like

    com.example.packagename it was solved

    #####273.解决异常Circular dependencies cannot exist in RelativeLayout RelativeLayout中存在循环的相关 #####274.java.lang.ClassNotFoundException 使用MultiDex 后,运行时发现有些crash或者有些类无法调用 报NoClassDefFound error 首先正确使用 google的multipartdex

    1. 修改Gradle,导入'com.android.support:multidex:1.0.0',打开multiDexEnabled;
    android {
        compileSdkVersion 21
        buildToolsVersion "21.1.0"
    
        defaultConfig {
            ...
            minSdkVersion 14
            targetSdkVersion 21
            ...
    
            // Enabling multidex support.
            multiDexEnabled true
        }
        ...
    }
    
    dependencies {
      compile 'com.android.support:multidex:1.0.0'
    }
    1. 修改Application.两种方法:

      1. 直接把Application替换成MultiDexApplication
    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.android.multidex.myapplication">
        <application
            ...
            android:name="android.support.multidex.MultiDexApplication">
            ...
        </application>
    </manifest>
    1. 在原来的Application中修改调用MultiDex.install(this);
    public class HelloMultiDexApplication extends Application {
        @Override
        public void onCreate() {
            super.onCreate();
        }
    
        @Override
        protected void attachBaseContext(Context base) {
            super.attachBaseContext(base);
            MultiDex.install(this);
        }
    }

    如果做了上面处理,依旧NoClassDefFound error 通过如下方式处理: 一些在二级Dex加载之前,可能会被调用到的类(比如静态变量的类),需要放在主Dex中.否则会ClassNotFoundError. 通过修改Gradle,可以显式的把一些类放在Main Dex中.

    参考Android 分Dex (MultiDex)

    #####275.Linux 32 Bit Libraries sudo apt-get install libc6:i386 libncurses5:i386 libstdc++6:i386 lib32z1 #####276.Android Material Design TabLayout.when more than screen width scroll when less than screen width fill Android TabLayout,当tab总宽度少于一屏时候,扩展为屏幕宽度展示.当tab总宽度大于一屏时,滚动显示

    Tab gravity only effects MODE_FIXED.
    
    One possible solution is to set your layout_width to wrap_content and layout_gravity to center_horizontal:
    
    <android.support.design.widget.TabLayout
        android:id="@+id/sliding_tabs"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        app:tabMode="scrollable" />
    If the tabs are smaller than the screen width, the TabLayout itself will also be smaller and it will be centered because of the gravity. If the tabs are bigger than the screen width, the TabLayout will match the screen width and scrolling will activate.
    

    参考Android Support Design TabLayout: Gravity Center and Mode Scrollable #####277. android多渠道打包

    目前采用的方案是,在AndroidManifest.xml文件中配置

    <meta-data
                android:name="UMENG_CHANNEL"
                android:value="${UMENG_CHANNEL_VALUE}" />

    在app的build.gradle文件中配置

    android{
     //用于生成不同渠道号
        productFlavors {
            wandoujia {}
            baidu {}
            yingyongbao{}
            ...
    
        }
    
        productFlavors.all {
            flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
        }
    
    }

    这样编译时会生成对应的渠道包apk.现在问题来了,如果有几十个渠道,会生成对应几十个apk包.打包编译一个apk一般需要1分钟左右(和电脑配置有关).那么打包几十个要几十分钟的时间.确实挺费时间的.那么有没有好的方式呐? 当然是有的 我们可以采用如下方案处理.通过文件配置只需要生成一个apk包

    此种方法是需要创建文件的。
    我们在写完我们的代码之后,在app/src下面,分别创建和main同级目录的文件夹umeng, wandoujia, yingyongbao,这三个文件夹里面都各只有一个AndroidManifest.xml文件,文件只需要如下:
    [plain] view plain copy 在CODE上查看代码片派生到我的代码片
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
        package="your.package.name">  
        <application>  
      
              <meta-data android:name="UMENG_CHANNEL" android:value="UMENG"/>  
      
        </application>  
    </manifest>  
    注意,上面的value的值要和你的渠道名所对应。比如wandoujia里面要对应为你豌豆荚上的渠道名(如WANDOUJAI)。
    然后在你的build.gradle的android{}节点里面,添加productFlavors节点,代码如下:
    [plain] view plain copy 在CODE上查看代码片派生到我的代码片
    android {  
        // 这里是你的其他配置  
      
        productFlavors{  
            umeng{  }  
            wandoujai {  }  
            yingyongbao{  }  
        }  
        // 你的其他配置  
    }  
    注意这里的flavors的名字要和你的文件夹的名字对应。这样配置之后,构建的就是多渠道的APK了。

    参考 Gradle实现的两种简单的多渠道打包方法

    #####278 Tcpdump抓包

    有些模拟器比如genymotion自带了tcpdump,如果没有的话,需要下载tcpdump: http://www.strazzere.com/android/tcpdump

    把tcpdump push到/data/local下,抓包命令:

    #####279 查看签名

    很多开发者服务都需要绑定签名信息,用下面的命令可以查看签名:

    #####280 系统日志中几个重要的TAG

    #####281 一行居中,多行居左的TextView

    这个一般用于提示信息对话框,如果文字是一行就居中,多行就居左。 在TextView外套一层wrap_content的ViewGroup即可简单实现:

    #####282 setCompoundDrawablesWithIntrinsicBounds()

    网上一大堆setCompoundDrawables()方法无效不显示的问题,然后解决方法是setBounds,需要计算大小…

    不用这么麻烦,用setCompoundDrawablesWithIntrinsicBounds()这个方法最简单!

    #####282 更新媒体库文件

    以前做ROM的时候经常碰到一些第三方软件(某音乐APP)下载了新文件或删除文件之后,但是媒体库并没有更新,因为这个是需要第三方软件主动触发。

    #####283 Monkey参数

    大家都知道,跑monkey的参数设置有一些要注意的地方,比如太快了不行不切实际,太慢了也不行等等,这里给出一个参考:

    一边跑monkey,一遍抓log吧。

    #####284 强大的dumpsys

    dumpsys可以查看系统服务和状态,非常强大,可通过如下查看所有支持的子命令:

    这里列举几个稍微常用的:

    媒体库会在手机启动,SD卡插拔的情况下进行全盘扫描,不是实时的而且代价比较大,所以单个文件的刷新很有必要。

    注[278-284来源于]  你应该知道的那些Android小经验

    #####285. 在布局文件时,在xml可视化文件中看到效果,而又不影响最终展示.可以通过tools来协助 比如:

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/rootView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center">
    
        <ProgressBar
            android:id="@+id/progress_loading"
            android:layout_width="75dp"
            android:layout_height="60dp"/>
    
        <TextView
            android:id="@+id/tv_reload"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@android:color/transparent"
            android:src="@drawable/refresh_big"
            android:scaleType="centerInside"
            android:visibility="gone"
            tools:text="点我,重新加载"
            tools:visibility="visible"/>
    </RelativeLayout>
    

    加填充xml文件时,TextView是隐藏的,但又想在xml中直观的看到它显示后的整体效果.借助xmlns:tools="http://schemas.android.com/tools" 完美实现.

    参考android中xml tools属性详解 #####286. android studio对于错误拼写/不识别的英文单词,给予波浪提示。 Spellchecker inspection helps locate typos and misspelling in your code, comments and literals, and fix them in one click android studio对于错误拼写/不识别的英文单词,给予波浪提示 选中单词,单击鼠标右键 spelling Save ‘xxx’ to dictionary.. #####287. Warning: Use '$' instead of '.' for inner classes (or use only lowercase letters in package names); replace .with $

    Package names are written in all lower case to avoid conflict with the names of classes or interfaces. 包名小写,避免和类名或接口名冲突 #####288. JNI undefined reference to `__android_log_print'

    android {
        defaultConfig {
            ndk {
                moduleName "your_module_name"
                ldLibs "log"
            }
        }
    }
    

    参考undefined reference to `__android_log_print'

    #####289. gradle升级到gradle2.10后出现如下问题

    Error:Execution failed for task ':xxx:packageReleaseResources'.

    xxxx/res/drawable/data.bin: Error: The file name must end with .xml or .png

    解决方案 Restart Eclipse (unfortunately) and the problem will go away. 参考Android: failed to convert @drawable/picture into a drawable

    #####290. No JDK found. Please validate either STUDIO_JDK, JDK_HOME or JAVA_HOME environment variable points to valid JDK installation.

    我安装了android-studio,通过命令行可以启动androidstudio,但是创建启动器后启动失败

    解决方案: 参考http://forum.ubuntu.org.cn/viewtopic.php?f=48&t=466830 不能有多余的空白字符。 你完全可以用desktop-file-validate xxx.desktop命令来检验 用xdg-open xxx.desktop看报错没有

    #####291. $ adb devices List of devices attached adb server version (32) doesn't match this client (35); killing... error: could not install smartsocket listener: Address already in use ADB server didn't ACK

    • failed to start daemon * error: cannot connect to daemon

    同一类问题 android studio 识别不到 genymotion device

    解决方案 https://m.oschina.net/blog/647554 http://blog.csdn.net/wuyuxing24/article/details/45169991 设置好之后重启下genymotion以及androidstudio

    #####292. Error:No cached version of com.android.tools.build:gradle:1.2.3 available for offline mode. Disable Gradle 'offline mode' and sync project

    使用匹配的gradle 2.0.0 2.10.0

    #####293. xxx/IxxxbackService.aidl Error:(31) couldn't find import for class com.kugou.common.module.fm.IxxFmPlayStateListener Error:(33) couldn't find import for class com.kugou.common.service.ringtone.IxxRingtonePlayStateListener Error:Execution failed for task ':androidkugou:compileDebugAidl'.

    java.lang.RuntimeException: com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command '/home/yabinyang/tools/sdk/build-tools/22.0.1/aidl'' finished with non-zero exit value 1

    选择匹配的 buildToolsVersion rebuild

    #####294.java中 volatile static结合使用 static 静态 volatile 不稳定的 JAVA 里static 和volatile的区别

    变量放在主存区上,使用该变量的每个线程,都将从主存区拷贝一份到自己的工作区上进行操作。
    
    volatile, 声明这个字段易变(可能被多个线程使用),Java内存模型负责各个线程的工作区与主存区的该字段的值保持同步,即一致性。
    
    static, 声明这个字段是静态的(可能被多个实例共享),在主存区上该类的所有实例的该字段为同一个变量,即唯一性。
    
    volatile, 声明变量值的一致性;static,声明变量的唯一性。
    
    此外,volatile同步机制不同于synchronized, 前者是内存同步,后者不仅包含内存同步(一致性),且保证线程互斥(互斥性)。
    static 只是声明变量在主存上的唯一性,不能保证工作区与主存区变量值的一致性;除非变量的值是不可变的,即再加上final的修饰符,否则static声明的变量,不是线程安全的。
    
    1) If a field is declared static, there exists exactly one incarnation of the field, no matter how many instances (possibly zero) of the class may eventually be created. 
    
    2) A field may be declared volatile, in which case the Java Memory Model ensures that all threads see a consistent value for the variable。
    
    
    295.ids的作用和使用场景

    作用:通过ids.xml中事先定义好id,在使用时候不用重新生成对应的id,提高性能和可维护性。优化编译效率。统一管理资源Id。 eg:如果没有ids.xml中定义。在layout文件中声明方式如下@+id/xxx。 如果定义过,使用方式如下@id/xxx 即不用加"+"号。 使用场景,对于需要同意管理资源id的场景,比如框架id 参考android项目中values中ids.xml的作用

    296.音乐领域,什么是EQ?

    EQ就是均衡器equalizer的缩写。在高级一点的混音器上,都会有EQ的调整钮。一般来说,EQ调整的都是音轧的播放的高音量(terble)、中音(middle)、以及重音(bass)的音乐频变化

    297.Android, ListView IllegalStateException: “The content of the adapter has changed but ListView did not receive a notification”

    http://stackoverflow.com/questions/3132021/android-listview-illegalstateexception-the-content-of-the-adapter-has-changed

    298. 在mac os上安装了oracle官网的jdk 1.7后,怎么找不到具体jdk路径了

    一般在 /Library/Java/JavaVirtualMachines/jdk1.7.0_71.jdk/Contents/Home

    299. Error:Could not read cache value from 'xxx/gradle/daemon/2.10/registry.bin'.

    根据路径找到registry.bin,删除,重启androidstudio即可。

    300. Android: AlertDialog causes a memory leak
    in the leaked activity's onDestroy(), set the AlertDialog's ListView's onItemClickListener() to null, which will release the reference to the listener an make whatever memory allocated within that listener to be eligible for GC. This way you won't get OOM. It's just a workaround and the real solution should actually be incorporated in the ListView.
    
    Here's a sample code for your onDestroy():
    
    @Override 
    protected void onDestroy() { 
        super.onDestroy(); 
        if(leakedDialog != null) { 
                ListView lv = leakedDialog.getListView();
                if(lv != null)  lv.setOnItemClickListener(null);
        } 
    } 
    

    对于adapter同理 参考 http://stackoverflow.com/questions/7083441/android-alertdialog-causes-a-memory-leak

    301 viewpager setcurrentItem之后,调用相关的监听 onpageSelected onPageChangedState onPageScrolled

    如果是想在动画执行完成之后,执行某些操作,可以通过如下方式

    private class PageChangeListener implements OnPageChangeListener { 
     
        @Override 
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
       } 
     
        @Override 
        public void onPageSelected(int position) {
            isPageChanged = true; 
        } 
     
        @Override 
        public void onPageScrollStateChanged(int state) {
            switch (state) {
            case ViewPager.SCROLL_STATE_IDLE:
                if (isPageChanged) { 
                    updateCurrentPage();//this will be called when animation ends 
                    isPageChanged = false; 
                } 
                break; 
            case ViewPager.SCROLL_STATE_DRAGGING:
                break; 
            case ViewPager.SCROLL_STATE_SETTLING:
                break; 
            } 
        } 
    } 

    参考Android viewpager animation

    #####302 Instant Run does not support deploying build variants with multidex enabled, to a target with API level 20 or below. To use Instant Run with a multidex enabled build variant, deploy to a target with API level 21 or higher.");

    http://stackoverflow.com/questions/36516931/instant-run-disabled-for-multidexed-application

    #####303 java.util.ConcurrentModificationException at java.util.LinkedList$LinkIterator.next(LinkedList.java:124)

    linkedlist 不是线程安全的,用ConcurrentLinkedQueue 参考 LinkedList多线程不安全的解决办法

    304 sqlite 出现 unrecognized token: "xxxx"

    使用sql 语句中,如果有字符串,必须加上 ‘ ‘单括号 括起来

    You need to escape the filename parameter. The punctuation in the filename is confusing SQLite. You could do it by surrounding the filename in 'single quotes' in the string you pass in to SQLite, but it`s cleaner and safer to pass it as a separate argument, like this:
    
    sqliteDatabase.update(AndroidOpenDbHelper.TABLE_FILE, values, 
            AndroidOpenDbHelper.COLUMN_NAME_FILE_NAME+"=?", new String[] {filename});
    	
    

    android.database.sqlite.SQLiteException: unrecognized token:

    305 ScrollView嵌套ListView,listItem.measure(0,0);报空指针异常NullPointerException
    当调用listItem.measure(0, 0);报空指针时问题:
    检查Adapter适配时Item的根容器为RelativeLayout,
    报错原因:
    In platform version 17 and lower, RelativeLayout was affected by a measurement bug that could cause child views to be measured with incorrect MeasureSpec values. (See MeasureSpec.makeMeasureSpec for more details.) This was triggered when a RelativeLayout container was placed in a scrolling container, such as a ScrollView or HorizontalScrollView. If a custom view not equipped to properly measure with the MeasureSpec mode UNSPECIFIED was placed in a RelativeLayout, this would silently work anyway as RelativeLayout would pass a very large AT_MOST MeasureSpec instead.
    This behavior has been preserved for apps that set android:targetSdkVersion="17" or older in their manifest`s uses-sdktag for compatibility. Apps targeting SDK version 18 or newer will receive the correct behavior
    有三种解决方案:
    一、升级版本到4.2.2
    二、更改根容器为LinearLayout
    三、在适配器里添加convertView.setLayoutParams(new LayoutParams(
                    LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); convertView为Item的view
    

    参考ScrollView嵌套ListView,listItem.measure(0,0);报空指针异常NullPointerException 动态计算listview的高度listItem.measure(0, 0)报空指针异常解决办法

    ##### 306 Webview访问https 报错 primary error: 5 certificate: Issued to: CN=*

    public void onReceivedSslError(final WebView view, final SslErrorHandler handler, SslError error) {
        Log.d("CHECK", "onReceivedSslError");
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        AlertDialog alertDialog = builder.create();
        String message = "Certificate error.";
        switch (error.getPrimaryError()) {
            case SslError.SSL_UNTRUSTED:
                message = "The certificate authority is not trusted.";
                break;
            case SslError.SSL_EXPIRED:
                message = "The certificate has expired.";
                break;
            case SslError.SSL_IDMISMATCH:
                message = "The certificate Hostname mismatch.";
                break;
            case SslError.SSL_NOTYETVALID:
                message = "The certificate is not yet valid.";
                break;
        }
        message += " Do you want to continue anyway?";
        alertDialog.setTitle("SSL Certificate Error");
        alertDialog.setMessage(message);
        alertDialog.setButton(DialogInterface.BUTTON_POSITIVE, "OK", new OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                Log.d("CHECK", "Button ok pressed");
                // Ignore SSL certificate errors
                handler.proceed();
            }
        });
        alertDialog.setButton(DialogInterface.BUTTON_NEGATIVE, "Cancel", new OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                Log.d("CHECK", "Button cancel pressed");
                handler.cancel();
            }
        });
        alertDialog.show();
        }
    });
    webView.loadUrl("https://www.google.co.in/");
    

    参考 Android : Workaround for webview not loading https url Android WebView not loading an HTTPS URL How can load https url without use of ssl in android webview

    Android安全开发之安全使用HTTPS 这是一篇很好的文章!!! 目前很多应用都用webview加载H5页面,如果服务端采用的是可信CA颁发的证书,在webView.setWebViewClient(webviewClient)时重载WebViewClient的onReceivedSslError(),如果出现证书错误,直接调用handler.proceed()会忽略错误继续加载证书有问题的页面,如果调用handler.cancel()可以终止加载证书有问题的页面,证书出现问题了,可以提示用户风险,让用户选择加载与否,如果是需要安全级别比较高,可以直接终止页面加载,提示用户网络环境有风险:  不建议直接用handler.proceed(),聚安全的应用安全扫描器会扫出来直接调用handler.proceed()的情况。 如果webview加载https需要强校验服务端证书,可以在onPageStarted()中用HttpsURLConnection强校验证书的方式来校验服务端证书,如果校验不通过停止加载网页。当然这样会拖慢网页的加载速度,需要进一步优化,具体优化的办法不在本次讨论范围,这里也不详细讲解了。

    需要在客户端中预埋证书文件,或者将证书硬编码写在代码中

    正确使用HTTPS并非完全能够防住客户端的Hook分析修改,要想保证通信安全,也需要依靠其他方法,比如重要信息在交给HTTPS传输之前进行加密,另外实现客户端请求的签名处理,保证客户端与服务端通信请求不被伪造

    Which versions of WebView are impacted? The impacted versions are 53 and 54 builds of Android WebView. Versions 52 and earlier, or 55 and later, do not exhibit the problem. For affected versions, all channels including stable, beta, dev, canary releases are impacted.

    When does the issue start occurring? The issue manifests 10 weeks after the build date. For 53 stable builds, 10 weeks have already passed. For 54, builds will expire as follows:

    Build ID Expiration Date 54.0.2840.68 12/27/2016 54.0.2840.85 1/7/2017

    WebView FAQ for Symantec Certificate Transparency Issue

    #####307 Nautilus not opening up, showing GLib error

    
    (nautilus:12837): GLib-GIO-CRITICAL **: g_dbus_interface_skeleton_unexport: assertion 'interface_->priv->connections != NULL' failed
    
    (nautilus:12837): GLib-GIO-CRITICAL **: g_dbus_interface_skeleton_unexport: assertion 'interface_->priv->connections != NULL' failed
    无法注册应用程序: 已到超时限制
    
    (nautilus:12837): Gtk-CRITICAL **: gtk_icon_theme_get_for_screen: assertion 'GDK_IS_SCREEN (screen)' failed
    
    (nautilus:12837): GLib-GObject-WARNING **: invalid (NULL) pointer instance
    
    (nautilus:12837): GLib-GObject-CRITICAL **: g_signal_connect_object: assertion 'G_TYPE_CHECK_INSTANCE (instance)' failed
    
    
    

    解决方案:

    To be able to restart nautilus properly, do the following:
    
    See what nautilus processes are running :
    ps aux | grep nautilus
    Kill all nautilus processes you see :
    sudo kill PIDNUMBER
    Restart nautilus :
    nautilus -q
    

    参考Nautilus not opening up, showing GLib error

    #####308 javaWeb中URLEncoder.encode空格问题

    java中URLEncoder.encode之前进行替换:
    
     //解决urlecode空格问题
    
    message=message.replaceAll(" ", "%20");
    
    event.setField("msg", URLEncoder.encode(message,"UTF-8"));

    参考javaWeb中URLEncoder.encode空格问题

    309 Using node.js as a simple web server
    You can use Connect and ServeStatic with Node.js for this:
    
    1. Install connect and serve-static with NPM
    $ npm install connect serve-static
    2. Create server.js file with this content:
    var connect = require('connect');
    var serveStatic = require('serve-static');
    connect().use(serveStatic(__dirname)).listen(8080, function(){
        console.log('Server running on 8080...');
    });
    3. Run with Node.js
    $ node server.js
    You can now go to http://localhost:8080/yourfile.html
    
    

    Using node.js as a simple web server

    310 when user androidstudio look at source of androidsdk ,Sources for Android API xx Platform not found (Android Studio xx)
    1. download API xx SDK
    2. reboot as
    3. if still cannot look ,find this file ~/.AndroidStudio2.3/config/options and
    diff --git a/options/jdk.table.xml b/options/jdk.table.xml
    index 0112b91..33828b8 100644
    --- a/options/jdk.table.xml
    +++ b/options/jdk.table.xml
    @@ -76,7 +76,7 @@
             </javadocPath>
             <sourcePath>
               <root type="composite">
    -            <root type="simple" url="file:///Applications/Android Studio.app/sdk/sources/android-19" />
    +            <root type="simple" url="file:///Users/tehdawgz/dev/android-sdk/sources/android-19" />
               </root>
             </sourcePath>
           </roots>
    

    展开全文
  • ETL开发过程中遇到的问题

    千次阅读 2018-06-08 17:24:32
    1 动态数据源的切换问题 近期在开发ETL过程中遇到了动态数据源的切换问题 要求是常规配置好自己的数据库 然后后期可以自定义连接数据 有点类似与msql的可视化连接工具 实际开发中主要遇到的一些问题 现在记录 1 ...

    1 动态数据源的切换问题

       近期在开发ETL过程中遇到了动态数据源的切换问题 要求是常规配置好自己的数据库 然后后期可以自定义连接数据 有点类似与msql的可视化连接工具 

       实际开发中主要遇到的一些问题 现在记录

     1 数据源的动态切换时 如何保证每个线程的独立

       解决主要使用的使用的是ThreadLocal

     /**
     * 动态数据源持有者,负责利用ThreadLocal存取数据源名称 
     * 确保数据源的独立安全
     */
    public class DynamicDataSourceHolder {
        /**
         * 本地线程共享对象
         */
        private static final ThreadLocal<String> THREAD_LOCAL = new ThreadLocal<>();


        public static void putDataSource(String name) {
            THREAD_LOCAL.set(name);
        }


        public static String getDataSource() {
            return THREAD_LOCAL.get();
        }


        public static void removeDataSource() {
            THREAD_LOCAL.remove();
        }

    }

    在增加数据源的时候 数据源的名字创建出数据源后 利用ThreadLocal 保存每个数据源 确保其当前线程的独立


     

    展开全文
  • 前端开发过程中遇到的问题1

    千次阅读 2017-06-05 01:53:50
    1.使用Bootstrap框架的过程中,代码没有错误但是元素样式却无法正常显示。 原因可能是导入js文件顺序不正确。 html文件加载和执行javaScript文件时,会按照一定顺序来进行加载和执行,如果导入代码顺序...

    1.在使用Bootstrap框架的过程中,代码没有错误但是元素样式却无法正常显示。

    原因可能是导入的js文件顺序不正确。

    html文件在加载和执行javaScript文件时,会按照一定的顺序来进行加载和执行,如果导入的代码顺序有误,就可能会导致想要的效果无法正常显示。

    因为导入的javaScript文件就是HTML文档的一部分,因此JavaScript在页面装载时,会按照文档中的引入标记<script />的顺序来装载执行各个js文件


    2.Font Awesome Font针对IE浏览器的兼容性问题


    Font Awesome是在网页开发中十分实用的图标字体,可以使得网页得到极大的美化,使用起来也很方便。

    但是在开发的过程中我们发现Font Awesome对IE的兼容性不是很好,有些图标根本无法显示。在查阅了网络资料以后,发现以下方法是实际可用的:

    在CSS文件中利用expression表达式输出图标

    在IE浏览器中,content:"\f08e";这样的写法是无效的,无法被浏览器正确地解释,但是expression表达式是可以的,因此我们可以把css文件中所有类似的表达都修改为expression表达式,代码如下所示:

    .fa-external-link {
      *zoom:expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf08e;');
    }

    这里的*zoom中的*表示仅对IE浏览器有效

    这样,只要在HTML文件中使用<i class="fa fa-external-link"></i>就可以正常使用该图标了。

    后来在网上发现了已经做完IE浏览器兼容的Font Awesome资源包,直接使用也是可以的。

    展开全文
  • 钉钉小程序开发过程中遇到的问题

    千次阅读 2020-04-02 18:14:51
    钉钉入门小白,写一些自己开发过程中遇到的问题,因为官方文档不是很清晰,百度上查到的有效资源也不多,可能会有更好的解决办法,如果写错了欢迎私信我给我指出,一起去交流一起进步哦 轮播图无显示 第一次接触...
  • 前言项目中开始要使用cordova 进行插件开发,本章节意在记录在开发过程中遇到的问题和解决方法。因此,该文章会不断更新,想到或遇到什么就记录一下,很随性,看心情。
  • Android开发过程中遇到的问题

    千次阅读 2015-03-17 11:52:52
    今天写这篇文章,是因为自己在开发过程中遇到一些bug,有实在不会的,也有的是粗心导致的,现在记录下来,给自己一个提醒, 也给初学者一个参考吧,此帖将会持续更新,后续遇到的问题有时间也会慢慢更新该博客内容
  • 前端开发过程中遇到的问题2

    千次阅读 2017-06-05 06:06:25
    visibility:hidden 该元素虽然会被隐藏,但是仍然占据网页中的位置和空间 2.js文件放置不同位置有什么不同效果 放在中的js通常是基础性,全局样式或者效果,不涉及某个具体DOM对象,因为此时如果想...
  • 软件开发过程中遇到的问题

    千次阅读 2016-08-28 16:43:19
    今天早晨去石家庄河北电力工程监理有限公司,回来后就整理这篇图文,结果还是过了12:00。这是针对昨天图文“Software Development Problem”翻译以及自己一些理解,分享给大家。其实,看看这些东西蛮好,最...
  • 项目开发过程中遇到的问题

    千次阅读 2019-05-10 09:37:24
    3、对接问题:对讲问题不是你的问题,就是我的问题,需要联查; 4、理解问题:对功能、逻辑流程或函数定义和使用的理解不清晰; 5、异常处理机制问题; 6、代码细节问题:变量类型、返回值、引用、指针; socket绑定...
  • CMMB开发过程中遇到的问题

    千次阅读 2011-11-17 17:00:00
    CMMB开发过程中遇到的问题  前段时间中途接手一个CMMB开发的项目,主要是做一些Bug修正及优化的工作,现在终于基本上完成了。CMMB的标准文档大致浏览了下,由于时间比较紧,许多细节并没有搞清楚。开发平台为wince...
  • JeePlus开发过程中遇到的问题

    千次阅读 2018-08-03 11:37:05
    应该有很多初学者都会有这个问题出现,下面是我记录下自己从发现问题到排查到解决问题的过程。 SEVERE: ContainerBase.addChild: start:  org.apache.catalina.LifecycleException:Failed to start component ...
  • Django开发过程中遇到的问题和解决方案 1.django向数据库中添加中文时报错 解决方案:创建数据库的时候设置编码格式 2.django的信号使用无法触发信号里的内容 解决方案:django 1.7后,使用信号时候需要...
  • 大数据开发过程中遇到的问题

    千次阅读 2018-03-01 15:48:38
    1.由于内存不够引起 linux下执行top命令查看各进程使用内存情况 如果发现没有进程耗费太大内存 查看空闲内存:free -m 发现空闲内存所剩无几: ...Linux内存管理,这里buffer指L...
  • 这里记录Android音频获取后,保存为G711或者AAc文件过程中遇到的问题 一、开启的Buffer太小  对于每一种声音采样频率,位数,通道,系统都会分配相应的Buffer,若此Buffer设置错误,则导致系统无法使用。 二...
  • android开发过程中一些遇到的问题

    千次阅读 2018-11-10 10:13:13
    记录android开发过程中遇到的问题。 1.一个xml中能否使用同一个include多次 http://www.apkbus.com/android-104152-1-1.html android中include标签的使用 ...
  • 最近在维护一个股票软件,新增加了一个通过指纹识别进行交易登录功能,这个功能只针对华为,小米,三星等基于Android6.0及以上系统手机,在开发过程中遇到了一些问题,最后终于解决了,我把它分享出来,供大家参考. ...
  • 180508 更新 网上下载demo 本地studio版本和demo版本不一致处理方式 修改两处 1 项目build.gradle 里面classpath2修改项目目录下 gradle--&gt;wrapper--&gt;...一个XML能否使用...
  • 在C代码中,除了主线程外,还需要创建两个子线程,并且在子线程中回调了Java中的方法,因为对JNI模块不太熟悉,在开发过程中遇到了不少问题,今天主要记录下在子线程中回调Java中方法的问题
  • 此篇记录Sommer学习、使用Java做软件开发过程中遇到的各种棘手问题。 1. 安装的jdk\lib文件夹下没有tools.jar文件 原因:安装jdk过程中会让你选择jdk和jre的安装目录,如果你设置成一样的话jre\lib下的jar文件...
  • 在开发过程中遇到了这样一个问题问题1:Error:Execution failed for task ':app:processDebugManifest'.&gt; Manifest merger failed with multiple errors, see logs在网上查到了一些这个问题的解决办法:...
  • 我之前公司里,调查了上百名工程师,询问他们工作中遇到问题的时候,通常用什么方法来解决? 得到结论如下所示: 不知道你是用哪一种方法来解决问题的,也许你的问题交给我,让我帮帮你! 包括且不限于下...
  • 一 登录顶号 问题: 首先需要弄明白是,一个客户端只有一个pomelo实例。 当用户登录之后,不退出,重启客户端。 服务器检测到玩家已经...目前处理方式是disconnect不断开链接。但这样处理有个问题,当服务器链接
  • 问题描述: ... 如果符合导出条件, 后端直接返回数据流,如下图所示一堆看不懂东西: 不满足导出条件, 则后端返回JSON, 并附上失败原因, 前端需要将失败原因展示出来 ...开发过程: 一开始就只...
  • 1:js中的运算问题 js变量声明:如果 var 语句没有初始化变量,变量自动取 JavaScript值 undefined。尽管并不安全,但声明语句忽略 var 关键字是合法 JavaScript语法。这时,JavaScript解释器给予...
  • 遇到的问题是测试发现应用某些设备不能调用识别功能。项目libs结构libs ├─ x86_64 ├─ x86 ├─ mips64 ├─ mips ├─ armeabi-v7a ├─ armeabi └─ arm64-v8a 定位问题:1. 识别功能不能使用说明问题出现...
  • 如果说生活是一门艺术,那么每天文档记录是程序员生活中的一首高昂赞歌!! 自己写工具类测试时候报错, org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean ...
  • React Native运行时各种错误
  • Android开发过程中遇到的一些问题和解决方法(持续更新) 混淆后注解丢失 解决方法:混淆的配置文件中添加 -keep class * extends java.lang.annotation.Annotation { *; } gradle plugn升级到3.0以上错误 Error...
  • 该标签主要针对各个标题进行组合,多用header导航栏标题 2、section标签 该标签定义页眉页脚,或页面中的其他部分,通常与标签article连用 3、clearfix与.clear:after (1)clearfix该属性用于清除浮动,其后...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 22,443
精华内容 8,977
关键字:

在开发过程中遇到的问题