导出Excel文件 解决科学计数法问题 - Avatar - 博客园

mikel阅读(1573)

来源: 导出Excel文件 解决科学计数法问题 – Avatar – 博客园

无论在做web还是在写winform程序是老是在导出excel数据是遇到科学计数法问题,如果字符太长(如身份证号)在导出的excel 文件中就会出现长字符串的科学计数法表示,反复导数据是就会出现错误 。

      我解决的办法是在到处是或者存储将要导出时,每条记录字符串形式处理

   在ASP.NET 中 我一般都是将要导出的数据放到gridview网格里,首先对网格邦定数据时 字符串形式处理,然后再用普通的形式导出excel就把问题解决了。

  我的代码非常简单:在邦定gridview控件时在rowdatabound事件中队数据格式化

 protected void gError_RowDataBound(object sender, GridViewRowEventArgs e)
{
//1)  文本:vnd.ms-excel.numberformat:@

          //2)  日期:vnd.ms-excel.numberformat:yyyy/mm/dd

         //3)  数字:vnd.ms-excel.numberformat:#,##0.00

         //4)  货币:vnd.ms-excel.numberformat:¥#,##0.00

         //5)  百分比:vnd.ms-excel.numberformat: #0.00%

        for (int i = 0; i < e.Row.Cells.Count; i++)
{
if (e.Row.RowType == DataControlRowType.DataRow)
e.Row.Cells[i ].Attributes.Add(“style”, “vnd.ms-excel.numberformat:@”);
}

    }

   然后执行到处操作就不会出现问题了

 protected void btnOut_Click(object sender, EventArgs e)
{

Response.Clear();
Response.Buffer = true;
Response.Charset = “GB2312”;
Response.AppendHeader(“Content-Disposition”, “attachment;filename=FileName.xls”);

Response.ContentEncoding = System.Text.Encoding.UTF7;

      //设置输出文件类型为excel文件。
Response.ContentType = “application/ms-excel”;
System.IO.StringWriter oStringWriter = new System.IO.StringWriter();
System.Web.UI.HtmlTextWriter oHtmlTextWriter = new System.Web.UI.HtmlTextWriter(oStringWriter);
this.gError.RenderControl(oHtmlTextWriter);
Response.Output.Write(oStringWriter.ToString());
Response.Flush();
Response.End();

    }

 

public override void VerifyRenderingInServerForm(Control control)
{
//base.VerifyRenderingInServerForm(control);
}

在winform程序开发时,处理的办法就是在导出的过程中,开始试了 处理excel对象的格式 mysheet.Cells.NumberFormat = “#”;

后来没有成功。最后还是用了逐条纪录进行字符格式转化的方法,即添加“ ‘  ”.

 我写得代码主要部分如下

  #region  执行数据导出
try
{
//到导出excel
Excel.ApplicationClass my = new Excel.ApplicationClass();
if (my == null)
{
MessageBox.Show(“无法创建excel对象,可能您的系统没有安装excel”);
return;
}
my.Visible = false;
Excel.Workbook mybook = (Excel.Workbook)my.Workbooks.Add(1);
((Excel.Worksheet)mybook.Worksheets[1]).Name = “sheet1”;
Excel.Worksheet mysheet = (Excel.Worksheet)mybook.Worksheets[1];
// mysheet.Cells.NumberFormat = “#”;
//导出列名
for (int j = 0; j < this.dgvShow.Columns.Count; j++)
{
if (this.dgvShow.Columns[j].Visible == true)
{
mysheet.Cells[1, j + 1] = “‘” + Convert.ToString(this.dgvShow.Columns[j].HeaderText);//加”‘”防止科 学计数法
}
}
//导出数据
for (int i = 0; i < this.dgvShow.Rows.Count; i++)
{
for (int j = 0; j < this.dgvShow.Columns.Count; j++)
{
mysheet.Cells[i + 2, j + 1] = “‘” + Convert.ToString(this.dgvShow.Rows[i].Cells[j].Value);
}
}

                if (savefilename != “”)
{
try
{
//mybook.Save();
mybook.SaveCopyAs(savefilename);
MessageBox.Show(“excel文件导出成功!”);
}
catch (Exception ex)
{
MessageBox.Show(“导出文件出现错误,文件可能正被打开!\n” + ex.Message);
}
}

                GC.Collect();
}
catch (Exception ex)
{
MessageBox.Show(“数据导出时出现错误,一下是详细错误信息:\n” + ex.Message);
return;
}
#endregion

ASP.NET MVC 将IList导出Excel文档的泛型类(继承自ActionResult) - iJerome - 博客园

mikel阅读(880)

来源: ASP.NET MVC 将IList导出Excel文档的泛型类(继承自ActionResult) – iJerome – 博客园

最近MVC项目中要使用到Excel导出功能,在网上找了些资料,自己写了 一个通用的泛型类(ExcelResult)。因为是直接继承自ActionResult这个抽象类的,所以用起来很方便,在控制器的Action中直接 实例化返回即可。本人的代码功底不是很好,写的代码有点烂,希望大伙指正。

 

废话少说,直接上类完整代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
/// <summary>
/// 提供将泛型集合数据导出Excel文档。
/// </summary>
/// <typeparam name="T"></typeparam>
public class ExcelResult<T> : ActionResult where T : new()
{
    public ExcelResult(IList<T> entity, string fileName, bool showDisplayName = true)
    {
        this.Entity = entity;
        this.FileName = fileName;
        this.ShowDisplayName = showDisplayName;
    }
    public ExcelResult(IList<T> entity, bool showDisplayName = true)
    {
        this.Entity = entity;
        DateTime time = DateTime.Now;
        this.FileName = string.Format("{0}_{1}_{2}_{3}",
            time.Month, time.Day, time.Hour, time.Minute);
        this.ShowDisplayName = showDisplayName;
    }
    public IList<T> Entity
    {
        get;
        set;
    }
    public string FileName
    {
        get;
        set;
    }
    public bool ShowDisplayName
    {
        get;
        set;
    }
    public override void ExecuteResult(ControllerContext context)
    {
        if (Entity == null)
        {
            new EmptyResult().ExecuteResult(context);
            return;
        }
        SetResponse(context);
    }
    /// <summary>
    /// 设置并向客户端发送请求响应。
    /// </summary>
    /// <param name="context"></param>
    private void SetResponse(ControllerContext context)
    {
        StringBuilder sBuilder = ConvertEntity();
        byte[] bytestr = Encoding.Unicode.GetBytes(sBuilder.ToString());
        context.HttpContext.Response.Clear();
        context.HttpContext.Response.ClearContent();
        context.HttpContext.Response.Buffer = true;
        context.HttpContext.Response.Charset = "GB2312";
        context.HttpContext.Response.ContentEncoding = Encoding.GetEncoding("GB2312");
        context.HttpContext.Response.ContentType = "application/ms-excel";
        context.HttpContext.Response.AddHeader("Content-Disposition", "attachment; filename=" + FileName + ".xls");
        context.HttpContext.Response.AddHeader("Content-Length", bytestr.Length.ToString());
        context.HttpContext.Response.Write(sBuilder);
        context.HttpContext.Response.Flush();
        context.HttpContext.Response.Close();
        context.HttpContext.Response.End();
    }
    /// <summary>
    /// 把泛型集合转换成组合Excel表格的字符串。
    /// </summary>
    /// <returns></returns>
    private StringBuilder ConvertEntity()
    {
        StringBuilder sb = new StringBuilder();
        AddTableHead(sb);
        AddTableBody(sb);
        return sb;
    }
    /// <summary>
    /// 根据IList泛型集合中的每项的属性值来组合Excel表格。
    /// </summary>
    /// <param name="sb"></param>
    private void AddTableBody(StringBuilder sb)
    {
        if (Entity == null || Entity.Count <= 0)
        {
            return;
        }
        PropertyInfo[] properties = typeof(T).GetProperties();
        if (properties.Length <= 0)
        {
            return;
        }
        for (int i = 0; i < Entity.Count; i++)
        {
            for (int j = 0; j < properties.Length; j++)
            {
                string sign = j == properties.Length - 1 ? "\n" : "\t";
                object obj = properties[j].GetValue(Entity[i], null);
                sb.Append(obj ?? string.Empty).Append(sign);
            }
        }
    }
    /// <summary>
    /// 根据指定类型T的所有属性名称来组合Excel表头。
    /// </summary>
    /// <param name="sb"></param>
    private void AddTableHead(StringBuilder sb)
    {
        PropertyInfo[] properties = typeof(T).GetProperties();
        if (properties.Length <= 0)
        {
            return;
        }
        for (int i = 0; i < properties.Length; i++)
        {
            string headName = properties[i].Name;
            string sign = i == properties.Length - 1 ? "\n" : "\t";
            if (!ShowDisplayName)
            {
                sb.Append(headName).Append(sign);
                continue;
            }
            Attribute attribute = Attribute.GetCustomAttribute(properties[i], typeof(DisplayNameAttribute));
            if (attribute != null)
            {
                DisplayNameAttribute displayNameAttribute = attribute as DisplayNameAttribute;
                if (displayNameAttribute != null && !string.IsNullOrWhiteSpace(displayNameAttribute.DisplayName))
                {
                    headName = displayNameAttribute.DisplayName;
                }
            }
            sb.Append(headName).Append(sign);
        }
    }
}

 

在控制器中调用方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public ActionResult Index()
{
    List<Student> students = new List<Student>();
    for (int i = 1; i <= 100; i++)
    {
        students.Add(new Student
        {
            Name = "Name " + i.ToString(),
            Age = i,
            Address = "Address " + i.ToString()
        });
    }
    return new ExcelResult<Student>(students);
}

 

上面代码中用到的Student类定义:

1
2
3
4
5
6
7
8
9
public class Student
{
    [DisplayName("姓名")]
    public string Name { get; set; }
    [DisplayName("年龄")]
    public int Age { get; set; }
    [DisplayName("家庭住址")]
    public string Address { get; set; }
}

 

结果导出的Excel文档截图:

 

Delphi从Excel导入 - 娃娃鸭的窝 - ITeye技术网站

mikel阅读(1179)

来源: Delphi从Excel导入 – 娃娃鸭的窝 – ITeye技术网站

Delphi从Excel导入数据

要写一程序从Excel导入数据,从网上查到通用程序的写法,我只做了少量修改。

ExcelProUnit.pas

Delphi代码  收藏代码
  1. unit ExcelProUnit;
  2. interface
  3. type
  4.   TExcelFunction = procedure(asheet: OleVariant); //声明导入函数
  5.   {访问单元格:sheet.cells[row,col]
  6. 转为string:vartostr(sheet.cells[row,col])
  7. 转为datetime:vartodatetime(sheet.cells[row,col])
  8. }
  9.   //afilename为数据源文件名,func为执行导入的函数
  10. procedure RunExcelApplication(afilename: string; func: TExcelFunction);
  11. implementation
  12. uses Controls, Forms, ComObj, windows, sysutils;
  13. procedure RunExcelApplication(afilename: string;
  14.   func: TExcelFunction);
  15. var
  16.   app: OleVariant;
  17.   oldCursor: TCurSor;
  18. begin
  19.   oldCursor := Screen.Cursor;
  20.  //保存鼠标指针状态
  21.   Screen.Cursor := crHourGlass;
  22.   try
  23.     CoInitializeEx(nil, 0);
  24.     app := CreateOleObject(‘Excel.Application’);
  25.     try
  26.       app.DisplayAlerts := False;
  27.       app.WorkBooks.open(afilename);
  28. //打开源文件
  29.       app.WorkSheets[1].Activate;
  30.       app.visible := False; //隐藏excel窗体
  31.       if Assigned(func) then //执行导入函数
  32.         func(app.ActiveSheet); //传递sheet给函数进行导入
  33.     finally
  34.       app.WorkBooks.close;
  35.       app.quit; //关闭推出excel
  36.       Screen.Cursor := oldCursor;
  37.     end;
  38.   except on e: Exception do
  39.     begin
  40.       MessageBox(GetActiveWindow, pchar(e.message), ‘提示’, MB_OK + MB_ICONINFORMATION);
  41.       Screen.Cursor := OldCursor;
  42.       Exit;
  43.     end;
  44.   end;
  45. end;
  46. end.

主要考虑的地方是传进去的函数的写法。以下写法没有进行过多的细化主要是完成功能。

ExcelMainUnit.pas

Delphi代码  收藏代码
  1. unit excelmainUnit;
  2. interface
  3. uses
  4.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  5.   Dialogs, StdCtrls;
  6. type
  7.   TForm1 = class(TForm)
  8.     Button1: TButton;
  9.     Memo1: TMemo;
  10.     Button2: TButton;
  11.     procedure FormCreate(Sender: TObject);
  12.     procedure Button1Click(Sender: TObject);
  13.     procedure Button2Click(Sender: TObject);
  14.   private
  15.     { Private declarations }
  16.   public
  17.     { Public declarations }
  18.   end;
  19. var
  20.   Form1: TForm1;
  21. implementation
  22. uses ExcelProUnit;
  23. var
  24.   sl: tStrings;
  25. {$R *.dfm}
  26. procedure GetFromExcel(asheet: OleVariant);
  27. var
  28.   s, rs: string;
  29.   row: integer;
  30. begin
  31.   row := 1;
  32.   s := trim(vartostr(aSheet.cells[row, 1]));
  33.   while s <>  do
  34.   begin
  35.     rs := ;
  36.     rs := rs + vartostr(aSheet.cells[row, 1]) + ‘  ‘;
  37.     rs := rs + vartostr(aSheet.cells[row, 2]) + ‘  ‘ + vartostr(aSheet.cells[row, 3]);
  38.     inc(row);
  39.     sl.Add(rs);
  40.     s := trim(vartostr(aSheet.cells[row, 1]));
  41.   end;
  42. end;
  43. procedure TForm1.FormCreate(Sender: TObject);
  44. begin
  45.   sl := TStringList.Create;
  46. end;
  47. procedure TForm1.Button1Click(Sender: TObject);
  48. begin
  49.   RunExcelApplication(ExtractFilePath(application.ExeName) + ‘success.xlsx’, GetFromExcel);
  50.   memo1.Lines.AddStrings(sl);
  51. end;
  52. procedure TForm1.Button2Click(Sender: TObject);
  53. begin
  54.   RunExcelApplication(ExtractFilePath(application.ExeName) + ‘success.xls’, GetFromExcel);
  55.   memo1.Lines.AddStrings(sl);
  56. end;
  57. end.

其中Excel数据为:

Java代码  收藏代码
  1. 姓名  成绩  备注
  2. Danny   100 完胜
  3. Way 99  差一分完胜
  4. Jay 59  没及格,太难受了
  5. Joan    77  中等

读取数据为:

Java代码  收藏代码
  1. 姓名  成绩  备注
  2. Danny  100  完胜
  3. Way  99  差一分完胜
  4. Jay  59  没及格,太难受了
  5. Joan  77  中等

2011-5-27 23:10 danny

Delphi Excel导入 的通用程序 - beyondqd的专栏 - 博客频道 - CSDN.NET

mikel阅读(1055)

步骤:1 连excel(自己知道其格式,最好是没个字段在数据一一对应)2 读excel数据,填入到数据库我这里有个函数,实现把excel表格中数据导入数据库,在一条数据导入前判断数据库中是否有该数据,如果有,就不再导入该数据(避免重复),你可以参考下procedure TForm_qyxxcx.BitBtn2Click(Sender: TObject);VAR I,J:INTE

来源: Delphi Excel导入 的通用程序 – beyondqd的专栏 – 博客频道 – CSDN.NET

步骤:
1 连excel(自己知道其格式,最好是没个字段在数据一一对应)
2 读excel数据,填入到数据库
我这里有个函数,实现把excel表格中数据导入数据库,在一条数据导入前判断数据库中是否有该数据,如果有,就不再导入该数据(避免重复)
,你可以参考下
procedure TForm1.btnClick(Sender: TObject);
 begin
   OpenDialog1.Title := '请选择正确的excel文件';
   OpenDialog1.Filter := 'Excel(*.xls)|*.xls';
   if OpenDialog1.Execute then
   edit1.Text := OpenDialog1.FileName;
 end;


 procedure TForm1.btninClick(Sender: TObject);
 const

   BeginRow = 2; BeginCol = 1;
 var
   Excel: OleVariant;
   iRow,iCol : integer;
   xlsFilename: string;
 begin
 if (trim(edit1.Text) = '') then
   begin
   MessageBox(GetActiveWindow(), 请选择正确的excel路径', MB_OK +
   MB_ICONWARNING);
   exit;
   end;
   xlsFilename := trim(edit1.Text);
   try
   Excel := CreateOLEObject('Excel.Application');
   except
   Application.MessageBox('excel没有安装', '提示信息', MB_OK+MB_ICONASTERISK+MB_DEFBUTTON1+MB_APPLMODAL);
   Exit;
   end;
   Excel.Visible := false;
   Excel.WorkBooks.Open(xlsFilename);
   try
   iRow := BeginRow;
   iCol := BeginCol;

   while trim(Excel.WorkSheets[1].Cells[iRow,iCol].value) <> '' do begin
   with ADOQuery1 do begin
   Append;
   Fields[0].AsString := trim(Excel.WorkSheets[1].Cells[iRow,iCol].value);
   Fields[1].AsString := trim(Excel.WorkSheets[1].Cells[iRow,iCol+1].value);
   Fields[2].Asstring := trim(Excel.WorkSheets[1].Cells[iRow,iCol+2].value);
   iRow := iRow + 1;
   end;

   end;
   Excel.Quit;
   ADOQuery1.UpdateStatus ;
   except
   Application.MessageBox('导入数据出错', '提示信息', MB_OK+MB_ICONASTERISK+MB_DEFBUTTON1+MB_APPLMODAL);
   Excel.Quit;
   end;
   MessageBox(GetActiveWindow(), '数据导入成功', '提示信息', MB_OK +
   MB_ICONWARNING);
 end;


procedure TForm1.btnClick(Sender: TObject);
 begin
   OpenDialog1.Title := '请选择正确的excel文件';
   OpenDialog1.Filter := 'Excel(*.xls)|*.xls';
   if OpenDialog1.Execute then
   edit1.Text := OpenDialog1.FileName;
 end;

 procedure TForm1.btninClick(Sender: TObject);
 const

   BeginRow = 2; BeginCol = 1;
 var
   Excel: OleVariant;
   iRow,iCol : integer;
   xlsFilename: string;
 begin
 if (trim(edit1.Text) = '') then
   begin
   MessageBox(GetActiveWindow(), 请选择正确的excel路径', MB_OK +
   MB_ICONWARNING);
   exit;
   end;
   xlsFilename := trim(edit1.Text);
   try
   Excel := CreateOLEObject('Excel.Application');
   except
   Application.MessageBox('excel没有安装', '提示信息', MB_OK+MB_ICONASTERISK+MB_DEFBUTTON1+MB_APPLMODAL);
   Exit;
   end;
   Excel.Visible := false;
   Excel.WorkBooks.Open(xlsFilename);
   try
   iRow := BeginRow;
   iCol := BeginCol;

   while trim(Excel.WorkSheets[1].Cells[iRow,iCol].value) <> '' do begin
   with ADOQuery1 do begin
   Append;
   Fields[0].AsString := trim(Excel.WorkSheets[1].Cells[iRow,iCol].value);
   Fields[1].AsString := trim(Excel.WorkSheets[1].Cells[iRow,iCol+1].value);
   Fields[2].Asstring := trim(Excel.WorkSheets[1].Cells[iRow,iCol+2].value);
   iRow := iRow + 1;
   end;

   end;
   Excel.Quit;
   ADOQuery1.UpdateStatus ;
   except
   Application.MessageBox('导入数据出错', '提示信息', MB_OK+MB_ICONASTERISK+MB_DEFBUTTON1+MB_APPLMODAL);
   Excel.Quit;
   end;
   MessageBox(GetActiveWindow(), '数据导入成功', '提示信息', MB_OK +
   MB_ICONWARNING);
 end;
procedure TForm_qyxxcx.BitBtn2Click(Sender: TObject);
VAR
  I,J:INTEGER;
  col,row:integer;
  MsExcel,WBook,WSheet:OLEVARIANT;
  f_temp,strtemp:string;
begin
  if Main_form.lwt.Message_Confirm('为预防不可预测情况发生(字段太长、类型不一致等)'+#10#13+'强烈建议在导入前备份原来数据,'+#10#13+'确认:终止导入'+#10#13+'取消:继续导入') then
    abort;

  cdsDJZY.Open;
  cdsDJZY.First;
  while not cdsDJZY.Eof do
    cdsDJZY.Delete;

  cdsDJZY.Close;
  cdsDJZY.Open;
  try
  begin
    MsExcel:= CreateOleObject('Excel.Application');
    WBook:=MsExcel.Application;
    if opendialog1.Execute then   //关联到文件
    begin
     if opendialog1.FileName='' then
       abort;
      wbook.workbooks.Open(opendialog1.FileName);
    end;
    WBook.Visible:= true;
    WSheet:=WBook.worksheets[1];
  end
  except
  begin
    Application.Messagebox('您取消了操作或 Excel   没有安装!','ERROR!',   MB_ICONERROR   +   mb_Ok);
    Abort;
  end;
  end;

  row:=WSheet.UsedRange.Rows.Count;      //行
  col:=WSheet.UsedRange.columns.Count;     //列
  if (row=0) or (col = 0)  then
  begin
    showmessage('该excel文件没有数据!请确认');
    abort;
  end;

  proform.Show;
  proform.ProgressBar1.Max:=row;

  with qqyb do
  begin
    open;
    for i:=1 to row-1 do    //要增加的行数
    begin   // 0 人员名称  2 企业名称
      //判断是否存在该企业和人员,如果存在,不导入该记录
      strtemp:='select * from qyb where qy_name = '''+WSheet.cells[i+1,1].Value+'''';
      Main_Form.lwt.DB_AdoQueryRun(qupdate,strtemp);
      if qupdate.RecordCount&lt;&gt;0 then   //  存在,加入临时表  ,退出本次循环
      begin
        cdsDJZY.Append ;
        cdsDJZY.FieldByName('企业名称').AsString := WSheet.cells[i+1,1].Value;
        cdsDJZY.Post;
        continue;
      end;
      Append; //不存在,继续
      for j:=0 to col-1 do   //列
      begin
        proform.ProgressBar1.Position:=proform.ProgressBar1.Position+1;
//        if adory.Fields[j].FieldKind
        Fields[j].Value:= WSheet.cells[i+1,j+1].Value;
      end;
      Post;
    end;
  end;
  proform.ProgressBar1.Position:=0;
  proform.Hide;

  if cdsDJZY.RecordCount&gt;1 then
  begin
    if Main_form.lwt.Message_Confirm('数据已经导入!,部分记录因为已经存在,没有导入,是否打印没有导入记录的请单?') then
    begin
      Main_form.lwt.DB_ShowReportByDataSet(cdsDJZY,'因为已经存在该企业导入失败的信息');
      main_form.lwt.DB_Excel_Export(cdsdjzy,'c:\hello.xls');
    end;
  end
  else
  begin
    Main_Form.lwt.Message_Show('数据已经导入!');
  end;
  wbook.workbooks.close;
end;

devexpress实现单元格合并以及依据条件合并单元格 - 曼彻斯特联队 - 博客园

mikel阅读(933)

来源: devexpress实现单元格合并以及依据条件合并单元格 – 曼彻斯特联队 – 博客园

1、devexpress实现单元格合并非常的简单,只要设置属性【AllowCellMerge=True】就可以了,实现效果如下图:

2、但是在具体要求中并非需要所有的相同单元格都合并,可能需要其他的条件来控制合并。这个时候我们就需要在事件 gridView1_CellMerge中来控制了。下图为根据最后一列判断是否合并单元格的效果图(其中第四列设置为不合并<非必需>,这 里只是为了达到一个比较效果。)。

3、重要代码:

复制代码
            int row1 = e.RowHandle1;
            int row2 = e.RowHandle2;
            string value1 = gridView1.GetDataRow(row1)["A4"].ToString();
            string value2 = gridView1.GetDataRow(row2)["A4"].ToString();
            if (value1 != value2)
            {
                e.Handled = true;
            }
复制代码

4、案例源代码下载链接(无需积分):http://download.csdn.net/detail/kehaigang29/8839689

java 日期格式化 将String日期重新格式化成String型 - 黑色头发 - ITeye技术网站

mikel阅读(810)

SimpleDateFormat sdf1 = new SimpleDateFormat(pat1) ;

来源: java 日期格式化 将String日期重新格式化成String型 – 黑色头发 – ITeye技术网站

将String型格式化,比如想要将2011-11-11格式化成2011年11月11日

Java代码  收藏代码
  1. public static void main(String args[]){
  2.         String strDate = “2011-11-11 10:11:30.345” ;
  3.         // 准备第一个模板,从字符串中提取出日期数字  
  4.         String pat1 = “yyyy-MM-dd HH:mm:ss.SSS” ;
  5.         // 准备第二个模板,将提取后的日期数字变为指定的格式  
  6.         String pat2 = “yyyy年MM月dd日 HH时mm分ss秒SSS毫秒” ;
  7.         SimpleDateFormat sdf1 = new SimpleDateFormat(pat1) ;        // 实例化模板对象  
  8.         SimpleDateFormat sdf2 = new SimpleDateFormat(pat2) ;        // 实例化模板对象  
  9.         Date d = null ;
  10.         try{
  11.             d = sdf1.parse(strDate) ;   // 将给定的字符串中的日期提取出来  
  12.         }catch(Exception e){            // 如果提供的字符串格式有错误,则进行异常处理  
  13.             e.printStackTrace() ;       // 打印异常信息  
  14.         }
  15.         System.out.println(sdf2.format(d)) ;    // 将日期变为新的格式  
  16.     }

封装了一下

Java代码  收藏代码
  1. /** 
  2.      * 将String型格式化,比如想要将2011-11-11格式化成2011年11月11日,就StringPattern(“2011-11-11″,”yyyy-MM-dd”,”yyyy年MM月dd日”).
  3.      * @param date String 想要格式化的日期
  4.      * @param oldPattern String 想要格式化的日期的现有格式
  5.      * @param newPattern String 想要格式化成什么格式
  6.      * @return String 
  7.      */
  8.     public final String StringPattern(String date, String oldPattern, String newPattern) {
  9.         if (date == null || oldPattern == null || newPattern == null)
  10.             return “”;
  11.         SimpleDateFormat sdf1 = new SimpleDateFormat(oldPattern) ;        // 实例化模板对象  
  12.         SimpleDateFormat sdf2 = new SimpleDateFormat(newPattern) ;        // 实例化模板对象  
  13.         Date d = null ;
  14.         try{
  15.             d = sdf1.parse(date) ;   // 将给定的字符串中的日期提取出来  
  16.         }catch(Exception e){            // 如果提供的字符串格式有错误,则进行异常处理  
  17.             e.printStackTrace() ;       // 打印异常信息  
  18.         }
  19.         return sdf2.format(d);
  20.     }

黑色头发:http://heisetoufa.iteye.com/  

资源就是竞争力

mikel阅读(818)

最近有个注册的任务,要求一天之内推广注册100人,并且都是有效手机号,需要短信验证。

单价不低,比较着急,于是论坛里的很多人都反应强烈。

有自叹不如,干不来,没那能力的;有跃跃欲试摩拳擦掌准备发力推广的;有看热闹不嫌事儿大,在那分析不好推广的;有默默看了,准备推广方法的;总之一句话,利益面前人人平等,机会来了你把握得住吗?

结果这个任务花落谁家不得而知,反正至今没到我的手里,其实我是蛮有信心做到100的量,毕竟有过推广经验,知道如何推广上量,但是架不住有资源的,人家根本不用想量的问题,因为人家手里有很多目标客户群,一下子就把我这些盲目推广的比下去了。可想而知作为广告主你是找一个把握着大量目标客户的人去花钱推广,还是找一帮没有目标客户的人撒网式的烧钱推广呢?答案不言而喻。

所以说要想把握机会,手里一定要有资源,就比如你要平时激励多个圈子内的资源,比如开发圈子,营销圈子,投资圈子,站长圈子等等,你积累了越来越多的人脉关系,还有知名度,你就更容易推广产品,就是不自己生产和销售的,找别人谈也更有竞争力,于是就有了前面的事件结果。

互联网虽然很大,但是只要你把握住精准的资源和人脉关系,一样可以赚得到很多钱,其实很简单推推项目就可以拿佣金的。

Android开发笔记(成长轨迹) - 其实并不难,是你太悲观 - 博客频道 - CSDN.NET

mikel阅读(931)

1.控制台输出:called unimplemented OpenGL ES API调用了未实现的OpenGL ES API函数,一般由于导入的第三方库如地图库,里面有用到OpenGL,但是模拟器的硬件默认是没有这个的,所以需要我们编辑模拟器Emulation Options选项勾选 Use Host GPU 然后重启模拟器再尝试,如果还是这个错误,那么我们只好用真机测试了。2

来源: Android开发笔记(成长轨迹) – 其实并不难,是你太悲观 – 博客频道 – CSDN.NET

1.控制台输出:called unimplemented OpenGL ES API

调用了未实现的OpenGL ES API函数,一般由于导入的第三方库如地图库,里面有用到OpenGL,但是模拟器的硬件默认是没有这个的,所以需要我们编辑模拟器Emulation Options选项勾选 Use Host GPU 然后重启模拟器再尝试,如果还是这个错误,那么我们只好用真机测试了。

2.控制台输出:

这个错误是由于真机里已经存在一个相同签名的应用程序,最简单是真机先卸载掉,然后再run。

3.高德地图Android版本,导入地图库,项目打开后报错:

06-05 09:10:46.718: W/dalvikvm(932): Unable to resolve superclass of Lcom/amapv2/cn/apis/BasicMapActivity; (29)
06-05 09:10:46.718: W/dalvikvm(932): Link of class ‘Lcom/amapv2/cn/apis/BasicMapActivity;’ failed

06-05 09:10:46.888: E/AndroidRuntime(932): FATAL EXCEPTION: main
06-05 09:10:46.888: E/AndroidRuntime(932): java.lang.ExceptionInInitializerError
06-05 09:10:46.888: E/AndroidRuntime(932):         at java.lang.Class.newInstanceImpl(Native Method)
06-05 09:10:46.888: E/AndroidRuntime(932):         at java.lang.Class.newInstance(Class.java:1319)
06-05 09:10:46.888: E/AndroidRuntime(932):         at android.app.Instrumentation.newActivity(Instrumentation.java:1054)

这个错误是由于你的android开发环境adt升级到最新版本导致的错误,属于你Android开发环境问题,选中你的项目,右击选择 “Properties”———》“Java Build  Path”——–》“Order  and  Export” ,把“Android  Private Libraries”选项打上勾,再次编译就可以了。

4.android横竖屏锁定:

xml文件中设置:
要实现这个目的,只需要在AndroidManifest.xml里声明Activity的时候加上一个属性:android:screenOrientation,属性取值landscape为固定横屏、portrait为固定纵屏幕。
代码:
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE););//强制为横屏
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//竖屏
============延伸========
屏幕会自动切换时,默认状态的应用程序,会重新调用onCreate,相当于重新启动了一次应用程序。同时,layout可能因为横屏带来不能合理适 配的问题。为了解决旋屏和键盘切换引起的程序重启问题,还需要增加一个属性:android:configChanges。这个属性可以理解为一个监听 器,它将拦截旋屏和键盘切换事件,阻止程序重启而变为回调onConfigurationChanged方法。这里常用的属性取值 为:keyboardHidden|orientation。

Socket TCP/UDP通信原理http://wenku.baidu.com/view/47437d4dcf84b9d528ea7a67.html

5,android 谷歌地图开发时,控制台输出:

也就是调试时真机运行后地图显示空白。造成这种现状的原因是由于 google api key配置错误。

Api key分为两种情况

一种是使用Debug keystore生成的api key

一种是使用release keystore生成的api key

不同的api key使用不同的sha1字符生成 ,所以如果是调试,如果使用android自带的Debug keystore,一定要是当时生成debug api key的那个 keystone。如果是release,自己的keystore来签名,APP配置文件就用 release下生成的api key。不能混用。否则显示不了地图。

解决办法:

1,把debug keystone替换成生成 api key 的那个:

,

2,APP配置文件里要启用debug 的 key:

6,Android Your content must have a ListView whose id attribute is ‘android.R.id.list’错误

错误提示:Your content must have a ListView whose id attribute is ‘android.R.id.list’

对于以上错误,其实可能是因为我们要实现对ListView中setOnItemClick的事件监听而去继承了LiseActivity,但是却没有ListView的标签,网上有说过只要在布局文件中添加如下代码即可:

  1. <ListView
  2. android:id=“@android:id/list” 或android:id=“@id/android:list”
  3. android:layout_width=“fill_parent”
  4. android:layout_height=“wrap_content”>
  5. </ListView>

 

7,view的onFinishInflate()何时调用的?

比如:自定义一个view叫myView ,路径是,com.test.view.MyView,此view是继承LinearLayout,定义的布局文件是my_view.xml
里面内容是:
<com.test.view.MyView>
<xxxx />
</com.test.view.MyView>

当在使用的时候,可以这样使用
MyView mv = (MyView)View.inflate (context,R.layout.my_view,null);
当加载完成xml后,就会执行那个方法。

8,onInterceptTouchEvent与onTouchEvent 执行顺序

ViewGroup里的onInterceptTouchEvent默认值是false这样才能把事件传给View里的onTouchEvent.

ViewGroup里的onTouchEvent默认值是false。

View里的onTouchEvent返回默认值是true.这样才能执行多次touch事件

http://blog.csdn.net/android_tutor/article/details/7193090

9,Jar mismatch! Fix your dependencies

这个问题是我们添加了多个开源应用例如ABS 或者 PageIndicator 由于他们都包含 support V4.jar, 或者你的工程目录里 libs 中包含这个包,所以冲突发生了,他们各自的签名SHA 不一致,解决方案:

去掉某一个libs里面的supportv4.jar,直接在引用  external jar using build path menu > add external jar,在目录外选一个(supportV4.jar)即可。

10,明明卸载掉了豌豆荚,可是.apk文件还是显示 wandoujia.file,如何去除?

开始=运行=输入CMD回车 输入assoc .apk=null (记得assoc后面有个空格和点) 回车即可。

11,gen already exists but is not a source folder. Convert to a source folder or rename it.

解决办法:

1. Right click on the project and go to “Properties” //鼠标右键点击项目,然后选中Properties
2. Select “Java Build Path” on the left //选择java Build Path
3. Open “Source” tab // 打开源文件的tab栏
4. Click “Add Folder…” //点击添加文件夹
5. Check “gen” folder and click Ok and Ok again //选中gen目录 然后点确定  应该就可以了【保证source下是gen和src,缺少哪个就添加哪个,缺一不可多余的全部删除】

   6. Again right click on the project and in the “Andriod Tools” click on “Fix Project Properties”  //右键点击项目 选择     Andriod Tools 点击 Fix Project Properties

按照以上做法,虽然library项目不报错了,可是在其它的项目中引用不到library的类,并且library项目本身都无法引用到,如下:

解决办法:

右键项目,build path —–>config build path 在SourceTab栏,addFolder:这一回添加src

在看看项目组织:

没问题了吧。

12,获取当前设备屏幕宽度和高度

  1. Display display = getWindowManager().getDefaultDisplay();
  2. display.getWidth();
  1. <span style=“white-space:pre”>        </span>display.getHeight();

 

13,项目工程下的lint.xml什么作用?

代码性能改进工具,Lint会自动扫描现有工程的Java和xml文件,给出性能优化改进建议,最终将会在Android的工程目录下生成lint.xml文件。简单点说就是检查项目里不推荐的代码文件。

14,无论真机还是模拟器运行项目,总是闪退,后台报错Class找不到:

解决:找半天,clean好多次,都解决不了,一开始以为少了相关的库文件或路径不对,后来才发现,只要把R文件里的所有包下的文件全部remove掉,让系统自动重新生成,就可以拉。

15,ClassNotFoundException: Didn’t find class “org.osmdroid.views.MapView” on path: /data/app/net.yu-2.apk

这个错误是指apk打包时发现:org.osmdroid.views.MapView找不到,但是我们在代码里,引用此路径,就能找到MapView,后来终于想到:

这个jar包在Android private Libraries里

build config里应该勾选这个,否则打包时不会添加android Private Libraries里的库

16,基于XMPP的android连接openfile服务时出错:SASL authentication DIGEST-MD5 failed

出现这个问题是由于客户端连接openfile时SASL验证出错,网上找了些相关资料,说是关闭相关鉴权验证就可以了:

  1. config.setTLSEnabled(false);
  2. config.setCompressionEnabled(false);
  3. config.setSelfSignedCertificateEnabled(false);
  4. config.setSASLAuthenticationEnabled(false);
  5. config.setVerifyChainEnabled(false);

可 是设置后,还会出现这些错误,终于找到原因,是因为连接服务器时,username和password出错了,看log日志发现我的password传递 的为null,所以造成了SASL验证出错。确保你的username和password都有正确的值(和服务器的key对应)就可以了。

参考文章:

http://blog.sina.com.cn/s/blog_7e3fa7ec0101894b.html 基于XMPP协议的Android IM研究

http://blog.csdn.net/onelight1997/article/details/6301289 gloox 链接openfire服务器问题解决办法

http://www.oschina.net/question/872914_80498

17,使用HttpClient时:Target host must not be null, or set in parameters

出现这个问题,原因是url,连接地址不完整, 必须加上”http://”

  1. HttpPost post = new HttpPost(“http://gps.google.com/geo”);

 

18,真机调试时错误:INSTALL_FAILED_INSUFFICIENT_STORAGE

出现这个问题,原因是设备(真机或模拟器)的内容空间不足,APP无法安装,如过用的手机,删除一些没用的软件腾出一些空间来,如用的是模拟器,设置device的内存更大一些。

19,如何把工程项目下的文件归档?(use as Source Folder)

(我们有时候看项目下会有上图中的文件夹打开后都是一层包一层(树状)的并不像com.ka.tradk这样,原因在于当前的包不是Source Folder)

添加完后感觉特别混乱,还是有错误,就看本文第11个截图的解决办法,右键点击工程,选择 “Properties”,选择左边的 “Java Build Path”,打开 “Source” 标签面板,点击 “Add Folder…”,删除没用的,勾选 “gen和src” 文件夹,点击OK,点击YES,再点击OK。

20,在java中,如何四舍五入保留小数点x位?

方法一:

  1. float temp = 0.6922224f;
  2. BigDecimal bd = new BigDecimal(temp);
  3. bd =bd.round(new MathContext(2));

结果:

System.out.println(“bd:”+bd);               bd =  0.69

显然MathContext中的参数就是保留几位小数点,这种方法返回的是对应类型(float)的结果,如上bd

方法二:

  1. String parten = “#.#”;
  2. DecimalFormat decimal = new DecimalFormat(parten);
  3. String str= decimal.format(temp);
  4. interval = Float.valueOf(str);


结果:

System.out.println(interval);    interval = 0.7

显然这种方法关键的就是parten参数, #.##就是保留两位小数点并且四舍五入,这种方法返回的是字符串类型。

21,使用eclipse打包时:Export aborted because fatal lint errors were found

解决办法:

1,点中项目右键  Properties

2,左边Android列表打开 Android Lint Preference,如下图:

3,在上图右上角,点击文字超链接,Configure workspace settings,如下图:

4,将”Run full error check when exporting app and abort if fatal errors are found “前的勾去掉,点击Apply再点击OK,全部保存。

5,再次选中项目,鼠标右键,AndroidTools-> Clean Lint Markers。稍等片刻,等待APP清除并重新生成Lint.xml文件。

这个时候再打包,就不会再有错误了。

22,listview如何自定义或不显示分割线?

1,ListView中每个Item项之间都有分割线,设置android:footerDividersEnabled表示是否显示分割线,此属性默认为true。

  1. <ListView
  2.     android:id=“@+id/local_groups_list”
  3.     android:layout_width=“match_parent”
  4.     android:layout_height=“wrap_content”
  5.     android:footerDividersEnabled=“false” />

或是在代码中mListView.setFooterDividersEnabled(false);

2,改变ListView的分割线颜色和宽度,需要在布局中定义android:divider和android:dividerHeight属性。

  1. <ListView
  2.     android:id=“@+id/local_groups_list”
  3.     android:layout_width=“match_parent”
  4.     android:layout_height=“wrap_content”
  5.     android:divider=“@color/divider_color”
  6.     android:dividerHeight=“1px” />

setDivider方法就可以设置自己想要的分割线样式,可以是color也可以是Drawable

3,也可以设置listview不显示分割线,然后给每一个listview item 的底部添加一个imageview,来充作分割线,这也是一种方法。

23,android:inputType=”numberSigned”和代码EditText中setInputType以及setRawInputType区别

android中inputType属性在EditText输入值时启动的虚拟键盘的风格有着重要作用。这也大大的方便的操作。有时需要虚拟键盘只为字符或只为数字。所以inputType尤为重要。

android:inputType=”none”
android:inputType=”text”
android:inputType=”textCapCharacters”
android:inputType=”textCapWords”
android:inputType=”textCapSentences”
android:inputType=”textAutoCorrect”
android:inputType=”textAutoComplete”
android:inputType=”textMultiLine”
android:inputType=”textImeMultiLine”
android:inputType=”textNoSuggestions”
android:inputType=”textUri”
android:inputType=”textEmailAddress”
android:inputType=”textEmailSubject”
android:inputType=”textShortMessage”
android:inputType=”textLongMessage”
android:inputType=”textPersonName”
android:inputType=”textPostalAddress”
android:inputType=”textPassword”
android:inputType=”textVisiblePassword”
android:inputType=”textWebEditText”
android:inputType=”textFilter”
android:inputType=”textPhonetic”
//数值类型
android:inputType=”number”
android:inputType=”numberSigned”
android:inputType=”numberDecimal”
android:inputType=”phone”//拨号键盘
android:inputType=”datetime”
android:inputType=”date”//日期键盘
android:inputType=”time”//时间键盘

在代码中设置的方法:setInputType和setRawInputType的区别,前者是以TEXT类型的键盘,后者是单独Number类型的键盘:

fuelcity和fuelhighway都是EditText
  1. fuelCity.setInputType(InputType.TYPE_CLASS_NUMBER|InputType.TYPE_NUMBER_FLAG_DECIMAL);
  2. fuelHighway.setInputType(InputType.TYPE_CLASS_NUMBER|InputType.TYPE_NUMBER_FLAG_DECIMAL);
  1. fuelCity.setRawInputType(InputType.TYPE_CLASS_NUMBER|InputType.TYPE_NUMBER_FLAG_SIGNED);
  2. hway.setRawInputType(InputType.TYPE_CLASS_NUMBER|InputType.TYPE_NUMBER_FLAG_SIGNED);

注意,参数必须要有InputType.TYPE_CLASS_NUMBER,否则会显示全键盘。

24,从SD卡获取一个png,然后转化为Bitmap或是Imageview

  1. String path = Environment.getExternalStorageDirectory().toString()
  2.         + “/test.png”;
  3. Bitmap mSharedPic = BitmapFactory.decodeFile(path);

转化为Imageview

  1. ImageView iv = (ImageView) findViewById(R.id.image_test);
  1. iv.setImageBitmap(<span style=“font-family:Helvetica,Tahoma,Arial,sans-serif”>mSharedPic </span><span style=“font-family:Helvetica,Tahoma,Arial,sans-serif”>);</span>

 

25 Android string.xml通配符(%$)和转义字符的用法

StringFormat通配符

<string name=”welcome_messages”>Hello, %1$s! You have %2$d new messages.</string>

在这个例子中,这个格式化的字符串有2个参数

属性值举例说明
%n$ms:代表输出的是字符串,n代表是第几个参数,设置m的值可以在输出之前放置空格
%n$md:代表输出的是整数,n代表是第几个参数,设置m的值可以在输出之前放置空格,也可以设为0m,在输出之前放置m个0
%n$mf:代表输出的是浮点数,n代表是第几个参数,设置m的值可以控制小数位数,如m=2.2时,输出格式为00.00

在程序中按照下面的方法来根据参数来格式化字符串:

Resources res = getResources();

String text = String.format(res.getString(R.string.welcome_messages), username, mailCount);

  1. <string name=“info_address”>Address: %1$s(%2$s %3$.3f°,%4$s %5$.3f°,Altitude %6$md)</string>
  2. <string name=“info_address_english”>Address: %1$s(%2$s %3$.3f°,%4$s %5$.3f°,Altitude %6$.1ft)</string>
  3. <string name=“info_address_a”>Approximate address: %1$s(%2$s %3$.3f°,%4$s %5$.3f°,Altitude %6$.1fm)</string>
  4. <string name=“info_address_ab”>Approximate address: %1$s(%2$s %3$.3f°,%4$s %5$.3f°,Altitude %6$.1ft)</string>

XML转义字符
以下为XML标志符的数字和字符串转义符
”     (&#34; 或 &quot;)
‘     (&#39; 或 &apos;)
&     (&#38; 或 &amp;)
lt(<) (&#60; 或 &lt;)
gt(>) (&#62; 或 &gt;)

比如:在string.xml中定义如下一个字符串,
<string name=”first”>大家好,欢迎来到mryang社区。welcome to here!</string>
我想以
大家好,欢迎来到eoeandroid社区。
welcome to here!
两行的形式输出,如何做?加\n,看下面:
<string name=”hello”>大家好,欢迎来到mryang社区。\nwelcome to here!</string>

android中的空格编码 string.xml前后加空格的技巧
<string name=”space”>&#160;&#160;&#160;&#160;我来看空格</string>
&#160; 这个就代表着空格

1. 遇到如下错误的时候说明你需要在单引号签名加转义字符(\):
Description Resource Path Location Type error: Apostrophe not preceded by \ (in Search’ Titles) strings.xml
只要将定义的字符串中的单引号(‘), 修改为(\’)即可

2. 变量文本格式(%s)提示:
Multiple annotations found at this line:
– error: Multiple substitutions specified in non-positional format; did you mean to add the formatted=”false”
attribute?
– error: Unexpected end tag string
这是由于新的SDK采用了新版本的aapt(Android项目编译器), 这个版本的aapt编译起来会比老版本更加的严格, 在Android最新的开发文档中描述String的部分,已经说明了如何去设置 %s 等符号, 可以点击去看.
简单解决方法就是:把%s之类的变量格式替换成%1$s, %1表示第一个位置的变量, $s表示为字符串类型
例如:
<string name=”welcome_messages”>Your First Var is %1$s! You Second Var is %2$d.</string>

26,如何导入第三方library库?

导入的前提是lib已经被添加到了当前workspace里面,这样的话就可以使用相对路径了。

方法一:

直接在project.properties里添加:

  1. target=android-17
  2. android.library.reference.1=..\\LibSlidingMenu2

方法二:

手动导入:

导入完成后:

方法二的和一的区别在于路径引用上,如上图,1,2是方法一来引用的;3,4是方法二引用的。

27,R cannot be resolved to a variable

遇到这种情况可以看一下RES里是否有错误,如果有错误,必然导致R无法成功生成,所以先解决所有资源文件的错误。

1. 检查Android 的SDK是否丢失需要重新下载,检查build path
2. 确保class没有import Android.R;
3, 错误class引用的layout的xml文件没有错误
4. 检查AndroidManifest.xml文件,里边的package,layout配置文件,strings.xml等的字符串全部书写正确
5. layout的xml文件中引用的strings.xml中的字符串拼写完全正确
6. 在layout 的xml文件手写添加一个控件,看id能否在R.java中自动生成,如果不能,那很大可能就是这个layout 的xml文件有问题,查看格式是否使用正确,或者包含什么非法字符串,或者调用到了不正确的字符串,等等,可以使用排除法,挨个去掉控件,直到发现 error message消失或者id能在R.java中自动生成。
7. 删掉gen文件夹,使R.java重新自动生成一次,如果不能生成,继续检查layout的xml文件是否有如上不易发觉的问题
8. Clean project ,重新build,或者重新import project。
9. 重启eclipse。

28,当import一个新的android项目时,项目名称上出现一个红色的感叹号,程序不能运行

右键项目—BuildPath—Configure Build Path, 切换libraries标签页,你应该会看到Android Dependencies里红色的X号,也就是说某一个jar包现在不可用了,查看一下是否jar包路径有变化,修复了就没问题了。

还有在我们引用第三方jar包或是自己写的support支持库时,一定记得要在project.properties里添加: android.library=true  否则,其它项目引用此库时,是无法生产库名.jar包名的。

以下为引用:

你用myeclipse新建 web工程, 在工程目录下会生成一个 .classpath 配置文件, 里面是你工程里面引用的jar的配置。这个.classpath 对你的web工程没有什么影响
其实是给 myeclipse 识别的。 你说的这种情况是因为 .classpath 文件里面配置引用了某个jar,但是实际上你的 lib 里面并没有这个jar 所以才会有红色的提示。
你不用拿.classpath文件和你的jar一个个去找, 你现在打开MyEclipse 右键单击你的web工程,找到 Build Path > Configure Build Paht… > 然后上面有几个选项卡找到 Libraries。  这里看到的就是你工程里面引用的 所有的 jar , 看看是不是在某个jar图标上有个很小的黄色的感叹号?
如果有的话就没错了, 先选中这个jar, 点击右边的 Remove  > 点击OK 等待几秒, 现在web工程上面的红色XX是不是没有了,哈哈。 解释一下: 黄色的感叹号的jar,表示.classpath配置文件引用了jar, 但是实际上lib里面没有这个jar。

29,如何实现屏幕截图(Mapview)

直接附上实现代码,截取当前屏幕,并保存到手机内。

  1. public Bitmap takeScreenShot(){
  2.     View view = this.getWindow().getDecorView();
  3.     view.setDrawingCacheEnabled(true);
  4.     view.buildDrawingCache();
  5.     Bitmap bt = view.getDrawingCache();
  6.     Rect frame = new Rect();
  7.     view.getWindowVisibleDisplayFrame(frame);
  8.     int statusHeight = frame.top;
  9.     int width = this.getWindowManager().getDefaultDisplay().getWidth();
  10.     int height = this.getWindowManager().getDefaultDisplay().getHeight();
  11.     Bitmap create = Bitmap.createBitmap(bt, 0,statusHeight,width,height-statusHeight);
  12.     mMapView.destroyDrawingCache();
  13.     return create;
  14. }
  15. public void saveScreenShot(Bitmap bitmap,String filepath){
  16.     FileOutputStream fos = null;
  17.     try {
  18.         fos = new FileOutputStream(filepath);
  19.         if (null!=fos) {
  20.             bitmap.compress(CompressFormat.PNG, 90, fos);
  21.             fos.flush();
  22.             fos.close();
  23.             System.out.println(“succccesss”);
  24.         }
  25.     } catch (FileNotFoundException e) {
  26.         e.printStackTrace();
  27.     } catch (IOException e) {
  28.         // TODO Auto-generated catch block
  29.         e.printStackTrace();
  30.     }
  31. }

实现:

  1. Bitmap bitmap = takeScreenShot();
  2. saveScreenShot(bitmap, Constants.defaultScreenPath);

30,android-support-v4.jar混乱冲突

这是由于不同的library同时引用了android- support-v4.jar,但是他们不是同一个文件,SHA-1不相同,系统只允许libraries must be the same,所以我们删除那个不相同的jar包,把其余的使用同一个的jar拷贝到library里就可以了。

31,eclipse中git插件的cannot open git-upload-pack问题

我们在eclipse上使用插件egit向代码服务器push或pull代码时,有时候会发现出现cannot open git-upload-pack这个问题。一般引起这个问题的原因有两个:

一、网络问题,确定你可以访问自己所要操作的代码仓库地址!【这是最关键的,我就是折腾半天发现公司关闭了地址的外网访问】。

二、eclipse中git插件的配置问题。

打开eclipse中的 windows–>Preferences–>Team–>Git–>Configuration–>User Settings.然后点Add Entry新建一个键值对,输入http.sslVerify=false。如图所示:

32,Fragment出现异常:java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState

在使用Fragment保存参数的时候,可能是因为需要保存的参数比较大或者比较多,这种情况下页会引起异常。比如代码

  1. Bundle b = new Bundle();
  2. b.putParcelable(“bitmap”, bitmap2);
  3. imageRecognitionFragment.setArguments(b);

设置好参数,并且添加hide(),add(),方法之后,需要commit(),来实现两个Fragment跳转的时候,这种情形下参数需要进行系统保存,但是这个时候你已经实现了跳转,系统参数却没有保存。此时就会报这这个异常

分析原因:你并不需要系统保存的参数,只要你自己设置的参数能够传递过去,在另外一个Fragment里能够顺利接受就行了,现在android里 提供了另外一种形式的提交方式commitAllowingStateLoss(),从名字上就能看出,这种提交是允许状态值丢失的。到此问题得到完美解 决,值的传递是你自己控制的。
这里也说一下另外一个问题,bitmap 也可以通过Bundle传递的,使用putParacelable就可以了。

33,conversion to dalvik format failed with error 1

在我们Android Tools–Export Signed Application Package 进行签名打包时会遇到这个问题,不是特别严重的问题,最简单的是刷新一下自己的工程,clean一下、再次打包,如果还不行就重新打开eclipse试试。

project.properties里Target改变一个其他的版本,再变回来保存一下(相当于刷新的操作)这样也能起到清理的作用。

34,在版本更新时,新版本数据库增加了字段,安装直接替换apk运行后报错(数据库字段找不到),除非卸载旧版本再安装新的

主要是因为新增加了字段,在当前版本里查找字段时出错了,所以要切记一个问题,当更新版本时添加或删除了字段,数据库version一定要更换,也就是说新版本运行时要让系统知道数据库有更新,要remove db 然后再创建db,如下所示:

35,android:layout_weight用法

layout_weight 用于给一个线性布局中的诸多视图的重要度赋值。默认为零,意思是需要显示 多大的视图就占据多大的屏幕空 间。若赋一个高于零的值,则将父视 图中的可用空间分割,分割大小具体取决于每一个视图的layout_weight 值以及该值在当前屏幕布局的整体 layout_weight值和在其它视图屏幕布局的layout_weight值中所占的比率而定。

举个例子:比如说我们在 水平方向上有一个文本标签和两个文本编辑元素。 该文本标签并无指定layout_weight值,所以它将占据需要提供的最少空间。  如果两个文本编 辑元素每一个的layout_weight值都设置为1,则两者平分在父视图布局剩余的宽度(因为我们声明这两者的重要度相等)。如果两个文本编辑元素其 中第一个的layout_weight值设置为1,而第二个的设置为2,则剩余空间的三分之二分给第一个,三分之一分给第二个(数值越小,重要度越 高)。

36,xml文件中的转义字符

HTML中<, >,&等有特别含义,(前两个字符用于链接签,&用于转义),不能直接使用。使用这三个字符时,应使用他们的转义序列,如下所示:

&amp; 或 & &
&lt; 或 < < 小于号
&gt; 或 > > 大于号
&quot; 双引号
&nbsp; 空格
&copy; © 版权符
&reg ® 注册符

前者为字符转义序列,后者为数字转义序列。数字转为字符对应的ASCII码值。例如 & lt; font &gt;显示为,<font>,若直接写为则被认为是个链接签。

需要说明的是:

a. 转义序列各字符间不能有空格;
b. 转义序列必须以”;”结束;
c. 独立的&不被认为是转义开始;
d.区分大小写。

另一个需要转义的字符是引号,他的转义序列为”” “或”””

HTML使用的字符集是ISO &859 Larin-1字符集,该字符集中有许多标准键盘上无法输入的字符。对这些特别字符只能使用转义序列。
XML转义字符
不合法的XML字符必须被替换为相应的实体。

如果在XML文件中使用类似”<” 的字符, 那么解析器将会出现错误,因为解析器会认为这是个新元素的开始。所以不应该像下面那样书写代码:

<message>if salary < 1000 then</message>

为了避免出现这种情况,必须将字符”<” 转换成实体,像下面这样:

<message>if salary &lt; 1000 then</message>

下面是五个在XML文件中预定义好的实体:

&lt; < 小于号
&gt; > 大于号
&amp; &
&apos; 单引号
&quot; 双引号

实体必须以符号”&”开头,以符号”;”结尾。

注意: 只有”<” 字符和”&”字符对于XML来说是严格禁止使用的。剩下的都是合法的,为了减少出错,使用实体是个好习惯。

37,如何读取当前项目版本信息(version name和version code)?

  1. PackageManager packageManager = getPackageManager();
  2. PackageInfo packInfo = null;
  3. try {
  4.     packInfo = packageManager.getPackageInfo(getPackageName(), 0);
  5. catch (NameNotFoundException e) {
  6.     e.printStackTrace();
  7. }
  1. <span style=“white-space:pre”>            </span>int versionName = packInfo.versionName;
  2.             int versionCode = packInfo.versionCode;

 

38,如何判断当前是否有网络以及使用的网络环境(2G、3G或WIFI)?

  1. /**
  2.  * 判断当前是否有网络 有 返回 true 无 返回 false
  3.  * 
  4.  * @param context
  5.  * @return
  6.  */
  7. public static boolean isNetWorkAble(Context context) {
  8.     if (context == null) {
  9.         throw new NullPointerException(“context can`t be null!”);
  10.     }
  11.     ConnectivityManager connManager = (ConnectivityManager) context
  12.             .getSystemService(Context.CONNECTIVITY_SERVICE);
  13.     if (null != connManager) {
  14.         NetworkInfo[] networkinfo = connManager.getAllNetworkInfo();
  15.         if (null != networkinfo) {
  16.             for (int i = 0; i < networkinfo.length; i++) {
  17.                 if (networkinfo[i].getState() == NetworkInfo.State.CONNECTED) {
  18.                     return true;
  19.                 }
  20.             }
  21.         }
  22.     }
  23.     return false;
  24. }

判断网络环境:

39,This tag and its children can be replaced by one <TextView/> and a compound drawable

当我们在xml里布局的时候,有时会遇到这样的一段黄色警告,简而言之就是说,我们可以优化一些(TextView可以直接添加图片)

  1.    <LinearLayout
  2.        android:orientation=“horizontal”
  3.        android:layout_centerInParent=“true”
  4.     android:layout_height=“wrap_content”
  5.     android:layout_width=“wrap_content”>
  6.     <ImageView
  7.         android:id=“@+id/item_icon”
  8.         android:layout_width=“wrap_content”
  9.         android:layout_height=“wrap_content”/>
  10.     <TextView
  11.         android:id=“@+id/item_text”
  12.         android:layout_height=“wrap_content”
  13.         android:layout_width=“wrap_content”
  14.         android:text=“@string/app_name”/>
  15. </LinearLayout>

看 这个xml,发现原来可以直接给TextView加图片.. ,通过 setCompoundDrawable 方法, 或者直接在xml中使用android:drawableLeft.、android:drawableRight等属性指定!这样的话就省去了一个 ImageView组件,岂不是更有效率一些?

40,SQLite 简单 事物处理

最近在做应用程序的集团版本,初始化时需要批量的向SQLite中插入大量数据,单独的使用for+Insert方法导致应用响应缓慢,因为 SQLite插入数据的时候默认一条语句就是一个事务,有多少条数据就有多少次磁盘操作。应用有的账号有500+记录,需要500多次循 环,insert。
解决方法:
添加事务处理,把500+条插入作为一个事务

我们使用SQLite的事务进行控制:
db.beginTransaction();  //手动设置开始事务
try{
//批量处理操作
for(Collection c:colls){
insert(db, c);
}
db.setTransactionSuccessful(); //设置事务处理成功,不设置会自动回滚不提交
}catch(Exception e){
MyLog.printStackTraceString(e);
}finally{
db.endTransaction(); //处理完成
}

1.使用SQLiteDatabase的beginTransaction()方法可以开启一个事务,程序执行到endTransaction() 方法时会检查事务的标志是否为成功,如果程序执行到endTransaction()之前调用了setTransactionSuccessful() 方法设置事务的标志为成功则提交事务,如果没有调用setTransactionSuccessful() 方法则回滚事务。
2.下面两条SQL语句在同一个事务中执行:

  1. try {
  2.     database.beginTransaction();//开始事务
  3.     for (Tracker tracker : lists) {
  4.         Tracker t = findByTid(tracker.getTid()); //读取一条记录
  5.         if (t != null) {
  6.             tracker.setId(t.getId());//设置相应的属性
  7.             tracker.setSelected(t.isSelected());
  8.             tracker.setDeleted(t.isDeleted());
  9.         }
  10.         dao.createOrUpdate(tracker);//循环插入记录
  11.     }
  12.     database.setTransactionSuccessful();//保存提交
  13.     database.endTransaction();//结束事务
  14. catch (Exception e) {
  15. }

41,使用googleMap如何获取两点(经纬度之间的距离)

方法一:

  1. /**
  2.  * 通过Location类获取两点间距离 单位:m
  3.  * 
  4.  * @param slat起点经度
  5.  * @param slon起点纬度
  6.  * @param elat终点经度
  7.  * @param elon终点纬度
  8.  * @return
  9.  */
  10. public static int getDistance(double slat, double slon, double elat,
  11.         double elon) {
  12.     float[] result = new float[1];
  13.     Location.distanceBetween(slat, slon, elat, elon, result);
  14.     return (int) result[0];
  15. }

在没有类似android的Location的distanceBetween方法开采用如下代码获取:

  1. double distance(double lat1, double lon1, double lat2, double lon2) {
  2.         double theta = lon1 – lon2;
  3.         double dist = Math.sin(deg2rad(lat1)) * Math.sin(deg2rad(lat2))
  4.                     + Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2))
  5.                     * Math.cos(deg2rad(theta));
  6.         dist = Math.acos(dist);
  7.         dist = rad2deg(dist);
  8.         double miles = dist * 60 * 1.1515;
  9.         return miles;
  10.     }
  11.     //将角度转换为弧度   
  12.     static double deg2rad(double degree) {
  13.         return degree / 180 * Math.PI;
  14.     }
  15.     //将弧度转换为角度   
  16.     static double rad2deg(double radian) {
  17.         return radian * 180 / Math.PI;
  18.     }

42,Android 之Gson如何使用

Gson 是 Google 提供的用来在 Java 对象和 JSON 数据之间进行映射的 Java 类库。可以将一个 JSON 字符串转成一个 Java 对象,或者反过来。
jar和源码下载地址: http://code.google.com/p/google-gson/downloads/list

实体类:

  1. public class Student {
  2.     private int id;
  3.     private String name;
  4.     private Date birthDay;
  5.     public int getId() {
  6.         return id;
  7.     }
  8.     public void setId(int id) {
  9.         this.id = id;
  10.     }
  11.     public String getName() {
  12.         return name;
  13.     }
  14.     public void setName(String name) {
  15.         this.name = name;
  16.     }
  17.     public Date getBirthDay() {
  18.         return birthDay;
  19.     }
  20.     public void setBirthDay(Date birthDay) {
  21.         this.birthDay = birthDay;
  22.     }
  23.     @Override
  24.     public String toString() {
  25.         return “Student [birthDay=” + birthDay + “, id=” + id + “, name=”
  26.                 + name + “]”;
  27.     }
  28. }


测试类(Gson使用)

  1. import java.util.ArrayList;
  2. import java.util.Date;
  3. import java.util.List;
  4. import com.google.gson.Gson;
  5. import com.google.gson.reflect.TypeToken;
  6. public class GsonTest1 {
  7.     public static void main(String[] args) {
  8.         Gson gson = new Gson();
  9.         Student student1 = new Student();
  10.         student1.setId(1);
  11.         student1.setName(“kaka”);
  12.         student1.setBirthDay(new Date());
  13.         // //////////////////////////////////////////////////////////
  14.         System.out.println(“———-简单对象之间的转化————-“);
  15.         // 简单的bean转为json
  16.         String s1 = gson.toJson(student1);
  17.         System.out.println(“简单Bean转化为Json===” + s1);
  18.         // json转为简单Bean
  19.         Student student = gson.fromJson(s1, Student.class);
  20.         System.out.println(“Json转为简单Bean===” + student);
  21.         // 简单Bean转化为Json==={“id”:1,”name”:”kaka”,”birthDay”:”Jun 22, 2012 8:27:52 AM”}
  22.         // Json转为简单Bean===Student [birthDay=Fri Jun 22 08:27:52 CST 2012, id=1,name=kaka]
  23.         Student student2 = new Student();
  24.         student2.setId(2);
  25.         student2.setName(“coco”);
  26.         student2.setBirthDay(new Date());
  27.         Student student3 = new Student();
  28.         student3.setId(3);
  29.         student3.setName(“caca”);
  30.         student3.setBirthDay(new Date());
  31.         List<Student> list = new ArrayList<Student>();
  32.         list.add(student1);
  33.         list.add(student2);
  34.         list.add(student3);
  35.         System.out.println(“———-带泛型的List之间的转化————-“);
  36.         // 带泛型的list转化为json
  37.         String s2 = gson.toJson(list);
  38.         System.out.println(“带泛型的list转化为json==” + s2);
  39.         // json转为带泛型的list
  40.         List<Student> retList = gson.fromJson(s2,
  41.                 new TypeToken<List<Student>>() {
  42.                 }.getType());
  1.     for (Student stu : retList) {
  2.         System.out.println(stu);
  3.     }
  4.     // 结果:
  5.     // 带 泛型的list转化为json== [{“id”:1,”name”:”kaka”,”birthDay”:”Jun 22, 2012 8:28:52 AM”}, {“id”:2,”name”:”coco”,”birthDay”:”Jun 22, 2012 8:28:52 AM”}, {“id”:3,”name”:”柳波”,”birthDay”:”Jun 22, 2012 8:28:52 AM”}]
  6.     // Student [birthDay=Fri Jun 22 08:28:52 CST 2012, id=1, name=kaka]
  7.     // Student [birthDay=Fri Jun 22 08:28:52 CST 2012, id=2, name=coco]
  8.     // Student [birthDay=Fri Jun 22 08:28:52 CST 2012, id=3, name=caca]
  9. }

 

43,Hashmap如何遍历所有的key?

方法一:

  1. Map map = new HashMap();
  2. Iterator iter = map.entrySet().iterator();
  3. while (iter.hasNext()) {
  4.     //通过Entity获得当前item
  5.     Map.Entry entry = (Map.Entry) iter.next();
  6.     Object key = entry.getKey();
  7.     Object value = entry.getValue();
  8. }


方法二:

  1. HashMap<String, String> maps = new HashMap<String, String>();
  2.       Iterator it= maps.keySet().iterator();
  3.       while (it.hasNext())
  4.       {
  5.        Object key=it.next();
  6.        System.out.println(“key:”+key);
  7.        System.out.println(“value:”+maps.get(key));
  8.       }

44,Android中Parcelable注意事项

在实例化对象时,如果实现了Parcelable接口,一定注意两个方法中,get/set属性的顺序不要错了,否则会造成数据不一致。

45,Fragment异常:not attached to Activity

传送门:http://blog.csdn.net/walker02/article/details/7995407

46,Android自带Location和百度DistanceUtil计算两点间距离

  1. float[] results = new float[1];
  2. double lat = 144122796/3600000.0;
  3. double lon = 418747182/3600000.0;
  4. double plat =144121792/3600000.0;
  5. double plon =418749216/3600000.0;
  6. Location.distanceBetween(lat, lon, plat, plon, results);
  7. System.out.println(“Location:”+results[0]);
  8. GeoPoint start = new GeoPoint((int) (144122796 / 3.6), (int) (418747182 / 3.6));
  9. GeoPoint end = new GeoPoint((int) (144121792 / 3.6), (int) (418749216 / 3.6));
  10. double distance = DistanceUtil.getDistance(start, end);
  11. System.out.println(“baidu:”+distance);

输出:

01-21 14:33:33.060: I/System.out(6935): Location:57.310047
01-21 14:33:33.060: I/System.out(6935): baidu:56.9168298996976

可以看出百度和Android自带的算法计算出来的差距不是很大,其实出现不一样的结果,主要是算法过程中,椭球中的地球长半径数据不一致(WGS84和天朝的标准,你懂的),导致差异,具体可看如下算法公式。

47,国际国内通用两点间(经纬度)的距离算法:

  1. static double DEF_PI = 3.14159265359// PI
  2. static double DEF_2PI = 6.28318530712// 2*PI
  3. static double DEF_PI180 = 0.01745329252// PI/180.0
  4. static double DEF_R = 6370693.5// radius of earth
  5. /**
  6.  * 利用勾股定理计算,适用于两点距离很近的情况
  7.  * 
  8.  * @param lon1
  9.  * @param lat1
  10.  * @param lon2
  11.  * @param lat2
  12.  * @return
  13.  */
  14. public double GetShortDistance(double lon1, double lat1, double lon2,
  15.         double lat2) {
  16.     double ew1, ns1, ew2, ns2;
  17.     double dx, dy, dew;
  18.     double distance;
  19.     // 角度转换为弧度
  20.     ew1 = lon1 * DEF_PI180;
  21.     ns1 = lat1 * DEF_PI180;
  22.     ew2 = lon2 * DEF_PI180;
  23.     ns2 = lat2 * DEF_PI180;
  24.     // 经度差
  25.     dew = ew1 – ew2;
  26.     // 若跨东经和西经180 度,进行调整
  27.     if (dew > DEF_PI)
  28.         dew = DEF_2PI – dew;
  29.     else if (dew < -DEF_PI)
  30.         dew = DEF_2PI + dew;
  31.     dx = DEF_R * Math.cos(ns1) * dew; // 东西方向长度(在纬度圈上的投影长度)
  32.     dy = DEF_R * (ns1 – ns2); // 南北方向长度(在经度圈上的投影长度)
  33.     // 勾股定理求斜边长
  34.     distance = Math.sqrt(dx * dx + dy * dy);
  35.     return distance;
  36. }
  37. /**
  38.  * 按标准的球面大圆劣弧长度计算,适用于距离较远的情况
  39.  * 
  40.  * @param lon1
  41.  * @param lat1
  42.  * @param lon2
  43.  * @param lat2
  44.  * @return
  45.  */
  46. public double GetLongDistance(double lon1, double lat1, double lon2,
  47.         double lat2) {
  48.     double ew1, ns1, ew2, ns2;
  49.     double distance;
  50.     // 角度转换为弧度
  51.     ew1 = lon1 * DEF_PI180;
  52.     ns1 = lat1 * DEF_PI180;
  53.     ew2 = lon2 * DEF_PI180;
  54.     ns2 = lat2 * DEF_PI180;
  55.     // 求大圆劣弧与球心所夹的角(弧度)
  56.     distance = Math.sin(ns1) * Math.sin(ns2) + Math.cos(ns1)
  57.             * Math.cos(ns2) * Math.cos(ew1 – ew2);
  58.     // 调整到[-1..1]范围内,避免溢出
  59.     if (distance > 1.0)
  60.         distance = 1.0;
  61.     else if (distance < –1.0)
  62.         distance = –1.0;
  63.     // 求大圆劣弧长度
  64.     distance = DEF_R * Math.acos(distance);
  65.     return distance;
  66. }
  67. /** 示例 */
  68. double mLat1 = 39.90923// point1纬度
  69. double mLon1 = 116.357428// point1经度
  70. double mLat2 = 39.90923;// point2纬度
  71. double mLon2 = 116.397428;// point2经度
  72. double distance = GetShortDistance(mLon1, mLat1, mLon2, mLat2);

48,Unable to execute dex: Java heap space Java heap space

修改eclipse目录下面额eclipse.ini文件
把第一行添加
-vm
C:\Program Files\Java\jdk1.6.0_24\bin\javaw.exe (你jdk的目录)

修改
-Xms128m
-Xmx512m
修改
–launcher.XXMaxPermSize
512m

49,如何判断后台的service是否在运行?

  1. public boolean isServiceRunning() {
  2.     ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
  3.     ArrayList<ActivityManager.RunningServiceInfo> servicelist = (ArrayList<RunningServiceInfo>) manager
  4.             .getRunningServices(30);
  5.     if (servicelist.size() <= 0) {
  6.         return false;
  7.     }
  8.     for (int i = 0; i < servicelist.size(); i++) {
  9.         if (servicelist.get(i).service.getClassName().equals(
  10.                 “com.dbjtech.find.UploadService”)) {//我自己的服务
  11.             return true;
  12.         }
  13.     }
  14.     return false;
  15. }

 

50,android:process=”:remote”有啥用?

android:process=”:remote”,代表在应用程序里,当需要该service时,会自动创建新的进程。而如果是android:process=”remote”,没有“:”分号的,则创建全局进程,不同的应用程序共享该进程。

51,sdk manager更新失败,显示Download interrupted: read timed out

解决办法:

sdk manager左上角选tools,再选options,将下面的force https……勾选上,重启sdk manager再试一下,应该可以成功。

52,eclipse中shift+ctrl+(Format)偶尔失效

其实是和别的软件的快捷键产生了冲突,具体可以看看最近安装了什么软件,看一下其热键。

在”Window”->”Preferences”->”General”->”Keys”中可以看到所有快捷键,看看你所用的快捷键是否被修改了,要是修改了的话点击”Restore Defaults”即可,或是把format的热键改成别的。

【注意】搜狗输入法是最喜欢使用shift+ctrl+字母或数字作为快捷键的,建议打开输入法设置属性–按键-快捷按键,把相关没用的全部取消了。

53,eclipse里找不到AVDManager 或Android SDK Manager的图标(已安装ADT插件)

1,查看当前的ADT是否是最新版本的,不是的话建议升级为最新版-help-install new software ,add https://dl-ssl.google.com/android/eclipse/

2,ADT没问题的话,打开Window-Customize Perspective,切换到Command Groups Availability 勾选上Android相关的选项,这个标签页就是配置工具栏要显示的功能列表,shortcuts标签页是设置比如NEW或show view时所需要显示的功能。

54,再按一次退出程序的实现方法

  1. private long exittime;(全局)
  1. if (keyCode == KeyEvent.KEYCODE_BACK) {
  2.     if ((System.currentTimeMillis() – exittime) > 2000) {
  3.         Toast.makeText(this“再按一次退出程序”, Toast.LENGTH_SHORT).show();
  4.         exittime = System.currentTimeMillis();
  5.     } else {
  6.         finish();
  7.     }
  8.     return true;
  9. }


55,if (null == name)将null写在前面有什么说道?
在java里面,它们是一样的。但是为什么把name==null写成是null==name,具体点来说,是在C语言里面引申出来的。
在C语言里面,为了防止少敲一个等号,编程人员仍然能在编译的时候找到错误。因为if(name=null)是在编译的时候,不会出现错误,而if(null=name)是会编译出错。

故而,null==name,是在C语言的编程习惯引入进来的。当然了,在java里面,if(name=null)是会出现编译错误的,现在就不 用担心这个了。但是,良好的编程习惯,还是写成null==name的好。http://bbs.csdn.net/topics/360174215

56,Only the original thread that created a view hierarchy can touch its views.

android中相关的view和控件不是线程安全的,我们必须单独做处理。我直接在button的onclick事件里进行了for循环,循环里直接进行了:

mHandler.removeCallbacks(runnable);

mHandler.post(runnable);

所有更新UI相关的操作,如果在子线程里进行,需要使用handler机制,在handler内更新。

57,Only the original thread that created a view hierarchy can touch its views

android中相关的view和控件不是线程安全的,我们必须单独做处理。简而言之,在子线程里进行了UI更新的相关操作,所以要使用Handler机制。

58,手机号正则表达式”^1[3|4|5|8]\\d{9}$”

^ 首字母( 表示匹配一行的开始,既这个验证从^之后开始,第一位数就是1 )

 1  必须是1
[3-8] 第二个数字为3-8之间的(如果想匹配移动手机号,便可以从这里修改[3|4|5|8])
\\d表示数字(+\\d表示正整数)
{9}表示9个,就是9个数字(后面的9位每位都是从0-9之间的数字)
$ 结尾(匹配结束)
59,java.lang.IllegalStateException: Content has been consumed
这个问题是在使用HttpClient时遇到的,主要原因是多次调用了:
  1. reply = EntityUtils.toString(response.getEntity());

httpEntity.getContent()只能读取一次,多次读取的话就会出现这个Exception了。

60,Listview如何选中某一行item?(当前item自动滚动)
1,即可直接选择到指定的 item 并置顶

  1. listView.setSelection(index);
2,尝试获取每个item的高度,然后根据指定的个数,使用:
  1. listView.scrollTo(0, index * heightPerItem);

每个 item 高度的计算有很多种方法,最简单的就是看你的布局如何实现的,直接写入数值即可如果是不确定的高度,那就只有等实例化之后才能 getHeigth 也可以获取。

 高度的计算需要待 listView 加载完毕后才获取其实际的高度,否则会得到 0。还有就是用 measure 方法:
  1.  ListAdapter listAdapter = listView.getAdapter();
  2.     int totalHeight = 0;
  3.     for (int i = 0; i < listAdapter.getCount(); i++) {
  4.         View listItem = listAdapter.getView(i, null, listView);
  5.         listItem.measure(00);
  6.         totalHeight += listItem.getMeasuredHeight();
  7.     }
  8.     ViewGroup.LayoutParams params = listView.getLayoutParams();
  9.     params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() – 1));
  10.     ((MarginLayoutParams)params).setMargins(10101010);
  11.     listView.setLayoutParams(params);
  12. 还有子ListView的每个Item必须是LinearLayout,不能是其他的,因为其他的Layout(如RelativeLayout)没有重写onMeasure(),所以会在onMeasure()时抛出异常。

61,使用代码为textview设置drawableLeft

在xml中设置了 DrawableLeft、但我想在代码中实时改变drawable,有什么方法可以使用代码为textview设置drawableLeft呢?
方法一:
public void  setCompoundDrawables  (Drawable left, Drawable top, Drawable right, Drawable bottom);
  1. Drawable drawable= getResources().getDrawable(R.drawable.drawable);
  2. drawable.setBounds(00, drawable.getMinimumWidth(), drawable.getMinimumHeight());<span style=“font-family: Tahoma;”>//必须要setBounds,否则不会显示.</span>
  3. tv.setCompoundDrawables(drawable,null,null,null);

方法二:

public void setCompoundDrawablesWithIntrinsicBounds (Drawable left,Drawable top, Drawable right, Drawable bottom);
android:drawableLeft和layout:weight同时使用时如何居中?
android:drawableLeft设置的图片就是居左,但是注意,如果这个组件设置了layout:weight权重,那么图片无法和文字一起居中, 文字属性可以通过android:gravity设置居中,想要android:drawableLeft设置的图片和文字一样居中,只能通过另外的方法 来实现,因为drawableLeft的作用就是在组件左侧设置图片,如果你的组件宽度足够大,它照样一定会是在最左侧,否则居中的话,就不能是 drawLeft了。
62,Android强行关闭Activity(结束进程)的几个方法:
一、结束一个活动Activity
要主动的结束一个活动Activity,使用finish方法,而且这个方法最后会调用Activity的生命周期函数onDestroy方法,结束当 前的Activity,从任务栈中弹出当前的Activity,激活下一个Activity。当然其他的finish系列方法,我们不在这里做详细讨论, 有兴趣的同学可以自己查阅一下SDK 的文档。
二、强制结束当前的进程
强行结束当前进程有两个方法。
1、killProcess(int pid)              例子:android.os.Process.killProcess(android.os.Process.myPid());
这个方法使用是有条件的:
a、将被杀掉的进程 和 当前进程 处于同一个包或者应用程序中;
b、将被杀掉的进程 是由当前应用程序所创建的附加进程;
c、将被杀掉的进程 和 当前进程 共享了普通用户的UID。(这里的普通用户,是相对于Root权限的用户来说的)
2、System.exit(int code)             例子:System.exit(0);
该方法只能用于结束当前进程自身,在程序遇到异常,无法正常执行时,可以通过这个方法强制退出。
需要注意的是,这两个方法,会导致进程非正常退出,就是说,进程退出时不会去执行onPause、onStop和onDestroy方法,那么进程很有可能错过了保存数据的机会。因此,这两个方法最好使用在出现异常的时候!
三、结束另一个进程
要通过一个进程去结束另一个进程。在之前的SDK版本中,一直使用方法restartPackage(packageName)方法,但是在 Android的开发文档中介绍说,这个函数会导致一些问题( the previous behavior here is no longer available to applications because it allows them to break other applications by removing their alarms, stopping their services, etc.),所以建议大家使用一个新的方法:
void killBackgroundProcesses(String packageName)
由于这个方法没有返回值,所以我们也不知道我们的目标进程是否真的退出了。但是,我目前只发现了这个可以结束另一个进程的方法。
四、退出到主屏幕
这个方法,也是退出当前进程的一个方法。如果我们在进程中创建了很多的Activity,但是又不想关闭时去退出不在任务栈顶的Activity,那么就可以直接使用这个方法了。
63,通过adb命令获取Android手机的IP地址
 先执行命令”adb shell netcfg”
再执行命令 “adb shell ifconfig rmnet0”
64,通过adb命令安卓apk到devices
在cmd命令下,输入:
adb devices  (用于显示当前所有连接的设备)
adb install e:/test.apk (install后跟目标路径)
adb shell rm data/app/test.apk  (卸载)
在有多个设备(模拟器)时,需要制定设备号,adb devices 可以显示当前设备的序列号,在adb指令后加上参数-s<serialNumber> 比如 -s emulator-5554 ,就可以指定adb指令的目标
65,通过adb shell命令打开指定应用程序
      $ adb shell
$ am start -n {包(package)名}/{包名}.{活动(activity)名称}
  1. adb shell am start -a android.intent.action.MAIN -c android.intent.category.LAUNCHER -n breakan.test/breakan.test.TestActivity

或简单点:

  1. adb shell am start -n breakan.test/breakan.test.TestActivity

其中”breakan.test/breakan.test.TestActivity”中的”breakan.test”是程序的包名,”TestActivity”是程序Activity类的类名。

比如:
66,真机调试eclipse在file explorer中展不开data文件夹

这个需要真机已经进行root过了,然后在手机上装上R.E 管理器(或类似软件),将/data/data的权限修改为可读可写可执行,然后,就可以在eclipse中展开了。

67,如何把android textView字体大小固定写死,而不随系统设置字体大小的改变而改变?

sp是字体的单位,dp一般是宽,高等的单位,但是不同的机器有不同的密度,hdpi,mdpi,ldpi,xhdpi,在这些密度下,以sp、dp为单位,那么最终都会转换成px单位下的值,所以,用px为单位就是固定值。

68,EditText默认时不弹出软键盘的方法

方法一:

在 AndroidMainfest.xml中选择哪个activity,设置windowSoftInputMode属性为 adjustUnspecified|stateHidden

< activity android:name=”.Main”
android:label=”@string/app_name”
android:windowSoftInputMode=”adjustUnspecified|stateHidden”
android:configChanges=”orientation|keyboardHidden”>
< intent-filter>
< action android:name=”android.intent.action.MAIN” />
< category android:name=”android.intent.category.LAUNCHER” />
< /intent-filter>
< /activity>

方法二:

让 EditText失去焦点,使用EditText的clearFocus方法

例如:
EditText edit=(EditText)findViewById(R.id.edit);
edit.clearFocus();

方法三:

强制隐藏Android输入法窗口

EditText edit=(EditText)findViewById(R.id.edit);
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(edit.getWindowToken(),0);

优化SqlServer--数据压缩 - 刘磊的博客 - 博客园

mikel阅读(840)

来源: 优化SqlServer–数据压缩 – 刘磊的博客 – 博客园

数据压缩是对存储和性能优势的加强。减少数据库占用的磁盘空间量将减少整体数据文件存储空间,在一下几个方面增加吞吐量:

1.更好的I/O利用率,每个页面可以读写更多的数据。

2.更好的内存利用率,缓冲区可以缓存更多的数据。

3.减少页面的闭锁,每个页面可以包含更多数据。

由于数据压缩必须考虑I/O 和CPU之间的平衡,压缩和解压缩都需要CPU处理。因此数据压缩对于旧数据和不经常查询的数据更有意义。

这里我们主讨论两种压缩:一是行压缩;二是页面压缩。

行压缩:压缩可以改变格式的存储固定值数据类型–也就说包含一个字节的值的4字节列可以压缩为1字节,1字节的列不能再压缩,但是null和0值不占字节。

  语法: 创建 create table 表名()with (DATA_COMPERSSION=ROW)

添加 ALTER TABLE 表名 REBUILD with (DATA_COMPERSSION=ROW)

页面压缩:页面压缩在实现行压缩的前提下,还实现了两种压缩,一是前缀压缩(对于每个页面和列来说前缀值都是相同的,可用来减少存储的需求,通过引用来取代重复的前缀);二是字典压缩(搜索页面中的重复值,这被对CI的引用取代)。

语法: 创建 create table 表名()with (DATA_COMPERSSION=PAGE)

添加 ALTER TABLE 表名 REBUILD with (DATA_COMPERSSION=PAGE)

   估计节省空间:语法 sp_estimate_data_compression_savings

[@schema_name=]–架构名称

,   [@object_name=]–有索引的表或者索引视图的名称。

,   [@index_name=]–索引ID号

,   [@partition_number=]–对象分区号,null表示非分区

,   [@data_compression=] –压缩类型(none\row\page)

[;]

 监控数据压缩:windows性能监视的SQLServer:access method 对象中有两个计数器:

Page compression attempts/sec:计算每秒进行页面压缩尝试的次数;

Pages compressed/sec:计算每秒压缩的页面数。

最后还要注意数据压缩的注意事项:

        1.启用和禁用表或群集索引压缩会重构所有费群集索引。

2.不能在稀疏列中使用压缩。

3.超出行的LOB 不能压缩。

4.索引中的非叶子也只能使用行压缩进行压缩。

5.非群集索引不继承标的压缩设置。

6.再删除群集索引时,表将保持这些压缩设置。

7.除非特别指定,创建群集索引将继承表的压缩设置。

 总结: 我们已经了解了基本的使用方式和一些注意事项,通过压缩实现高性能的数据库系统。同时我们还要兼顾一些硬件成本,最后我们还要注意的是对于高可用性系统,改变压缩设置可能会产生额外的事务日志操作。

逆向怎么玩 - 动态调试jetBrains CLion实录 - foreach_break - 博客园

mikel阅读(1269)

来源: 逆向怎么玩 – 动态调试jetBrains CLion实录 – foreach_break – 博客园

声明

CLion程序版权为jetBrains所有、注册码授权为jetBrains及其付费用户所有,本篇只从兴趣出发,研究其程序运行原理。

  • 不会释出任何完整的源代码.
  • 网上查了下,已有注册机,所以想要key的同学不要找我:p

背景

在上篇:CLion注册码算法逆向分析实录

我们通过结合jdb、jd-gui等工具,静态分析被混淆过的CLion的clion.jar中的class信息,顺利拿到了CLion的注册码算法.

但是,如果能在动态调试中分析代码路径,拿注册码并推算法不是更愉快么?
本篇将从动态调试的角度展开逆向之旅,作为对上篇的一个补充。

本篇用到的关键技术和工具:

  • java -verbose
  • HotSpot™ Serviceability Agent
  • jetBrains intellij IDEA 14.3
  • jetBrains CLion 1.0.4
  • jd-gui 1.2
  • jinfo

动态调试的困难

因为没有源代码,而CLion的class经过混淆,且有很多运行时生成的class,所以无法直接通过简单地使用类似jd-gui之类的工具来得到java文件。

如果仅仅是名称和控制流混淆,其实还是比较简单的情况,不是太变态的情况下,jd-gui可以拿到java代码,如果混淆的很厉害,一般也有字节码可以看,所以需要我们对字节码或混淆代码的阅读感觉比较熟练即可。

如果是上面的相对简单的情况,我们可以有耐心地重建或者修补反编译而来的java代码,以达到调试的目的。

CLion的情况不同,它还有一些运行时生成的类,再加上混淆,使得我们很难仅仅通过反编译来完成动态调试的准备。


获取入口函数所在的类名

办法总比困难多,让我们开始准备动态调试吧!

通过上一篇博文的分析,我们已经熟悉了CLion程序启动的一些代码路径,首先要找到程序的入口函数main,并重建它。怎么找呢?

  • 方法1:通过启动脚本来找

可以通过查看$CLION_HOME/bin下的clion.sh来看启动参数:

133 MAIN_CLASS_NAME="$CL_MAIN_CLASS_NAME"
134 if [ -z "$MAIN_CLASS_NAME" ]; then
	  #注意这里
135   MAIN_CLASS_NAME="com.intellij.idea.Main"
136 fi
...
176 LD_LIBRARY_PATH="$IDE_BIN_HOME:$LD_LIBRARY_PATH" "$JDK/bin/java" \
177   $AGENT \
178   "-Xbootclasspath/a:$IDE_HOME/lib/boot.jar" \
179   -classpath "$CLASSPATH" \
180   $VM_OPTIONS "-Djb.vmOptionsFile=$VM_OPTIONS_FILES_USED" \
181   "-XX:ErrorFile=$HOME/java_error_in_CL_%p.log" \
182   -Djb.restart.code=88 -Didea.paths.selector=clion10 \
183   $IDE_PROPERTIES_PROPERTY \
184   $IDE_JVM_ARGS \
185   $REQUIRED_JVM_ARGS \
      #以及这里
186   $MAIN_CLASS_NAME \
187   "$@"
188 EC=$?
  • 方法2:通过jinfo来获取

也可以让CLion先跑起来,通过jinfo来获取,首先通过jpsps -ef | grep clion来确认CLion的pid

[haoran@localhost Tools]$ jps
27120 Jps
4001 Main
26953 Main
16911 Launcher

接着输入jinfo pid,这里是jinfo 26953

[haoran@localhost Tools]$ jinfo 26953
Attaching to process ID 26953, please wait...
Error attaching to process: sun.jvm.hotspot.runtime.VMVersionMismatchException: Supported versions are 25.45-b02. Target VM is 25.40-b25
sun.jvm.hotspot.debugger.DebuggerException: sun.jvm.hotspot.runtime.VMVersionMismatchException: Supported versions are 25.45-b02. Target VM is 25.40-b25
	at sun.jvm.hotspot.HotSpotAgent.setupVM(HotSpotAgent.java:435)
	at sun.jvm.hotspot.HotSpotAgent.go(HotSpotAgent.java:305)
	at sun.jvm.hotspot.HotSpotAgent.attach(HotSpotAgent.java:140)
	at sun.jvm.hotspot.tools.Tool.start(Tool.java:185)
	at sun.jvm.hotspot.tools.Tool.execute(Tool.java:118)
	at sun.jvm.hotspot.tools.JInfo.main(JInfo.java:138)

发现因为jre/jvm的版本不匹配,出现了异常,怎么解决呢?
clion.sh入手,看看它如何指定jvm

这里写图片描述

可以发现,$IDE_HOME意即CLion安装的路径比$JAVA_HOME搜索的顺序更靠前,我们调整这个顺序即可避免jre/jvm版本不匹配的问题。

调整后,再次利用jinfo pid来查看,得到如下信息:

这里写图片描述

之所以列举jre/jvm版本不匹配的异常问题,以及通过jinfo来获取程序入口函数所在类的方式,是为后续我们通过SA来dump运行时的class及修复java文件扫清障碍。


新建入口类

我们已经得到main函数所在的类名为com.intellij.idea.Main,但是通过分析,发现其不在clion.jar中,那么它在哪里?

我们通过在CLion启动参数中加入-verbose,并将结果重定向到文件中,来分析这个类所在的jar。

如下所示:

这里写图片描述

接下来,通过jd-gui来反编译bootstrap.jar/com/intellij/idea/Main.class,并将其java代码导入到我们新建的同名java文件中:

这里写图片描述


修复入口类

这样的java代码是无法通过编译的,而且因为很多缺失的类都是很重要的依赖,所以无法通过简单的屏蔽来让代码跑起来。

那我们开始修复这些缺失的类,怎么修复呢?

我们可以使用HotSpot™ Serviceability Agent (SA)提供的能力,获取运行时的class。当然,获取运行时的class不只这一种方式。

说干就干,classFilter:

这里写图片描述


编译好这个classFilter,按下面的步骤来运行:

  1. 运行CLion.
  2. 找到CLion的pid.
  3. 启动如下命令:

java -cp $JAVA_HOME/lib/sa-jdi.jar:. \
	 -Dsun.jvm.hotspot.tools.jcore.filter=$filterName \
	 -Dsun.jvm.hotspot.tools.jcore.outputDir=$dumpedClassOutputDir \
	 sun.jvm.hotspot.tools.jcore.ClassDump $clion_pid

# $filterName  :我们自定义的classFilter
# $dumpedClassOutputDir : 存放dump出的class文件的目录
# $clion_pid :CLion进程pid.

看下我们dump出的classes:

这里写图片描述

到这一步,已经成功了一大半,接下来,按照你喜欢的方式将这些classes加入classPath吧!


修复ClassPath

还在等什么,赶紧点run吧:

这里写图片描述

嗯,果不其然,很多类还是缺失,对于运行中生成的类,按上面的方法来找,对于已经在jar中的类,赶紧找找classPath还有什么吧。

还记得上面的jinfo吧,祭出:

这里写图片描述

将这些加入ClassPath中。


修复资源、运行时参数、及JVM的options

程序已经越来越接近跑起来的状态,还有一些细碎,奔跑吧骚年!

Q. 此刻有没有一种,买来风扇,涂上硅胶,扣定开关的感觉?
A. 要的就是这种能够DIY的工程师感觉嘛~^^

你会发现,后续的运行中,还会出现许多异常,没有关系,通过分析,就知道还有一些东西没有修复,包括:

  • 资源/Resources
  • 运行时参数
  • vm options

其中CLion的vm options我们依然通过jinfo方式获取:

-Xss2m -Xms256m -Xmx768m -XX:MaxPermSize=250m \
-XX:ReservedCodeCacheSize=96m -XX:+UseConcMarkSweepGC \

-XX:ErrorFile=/home/haoran/java_error_in_CL_%p.log \
-Djb.restart.code=88 -Didea.paths.selector=clion10 \
-Didea.platform.prefix=CLion \
-Didea.no.jre.check=true


让程序动起来!

做完了上面细碎的功夫,来看看我们的成果:

  • 华丽丽的Stack Frames!

这里写图片描述


  • 华丽丽的Locals!

这里写图片描述


  • 华丽丽的注册码算法!
    这里写图片描述

这里写图片描述


这里写图片描述


结语

什么?没有动态调试过程?

有意研究注册码算法的同学,请参考上篇博文:CLion注册码算法逆向分析实录.但是不要做坏事哦 :]

我觉得上面的几个华丽丽的东西已经足够你

  • step in/over/out
  • evaluate expressions
  • stack frame in/out

羞涩ing : 撰文不易,若觉得对你有帮助或者博你一笑的,点个推荐吧 :]

【版权所有@foreach_break】 【博客地址 http://www.cnblogs.com/foreach-break】 可以转载,但必须注明出处并保持博客超链接