不断更新--Java技巧篇


1.Spring xml配置 添加的 命名空间的键值对 
2.hibernate映射文件点击对应实体生成相应的xml映射文件
3.Alt+shift +z 对代码块快速 try catchdo while 
4.快速模板配置 如: struts2的核心配置.....
5. 几个重要的开源软件, httpunit ,httpclient(对于QQ这种提交一个页面跳转好几个页面的怎么登陆) 
6. 比如 Apache Jakarta 上很著名的另外两个开源项目 Cactus 和 HTMLUnit 都使用了 HttpClient,

7.个人常用文件上传软件,如手机和电脑的互传.

8.  
//      File file = new File("E:/itext/b.pdf");
//      file.getParentFile().mkdirs();

9. html 转换为PDF 

10.jsoup 也有一个高级作用可以直接过滤所有的html标签,只留下txt文本
Elements elements2 = docum.select("#article_content");
String content  = elements2.text();

Elements elements2 = docum.select("#article_content");
String content  = elements2.outerHtml();  //包含  #article_content在内的div
String content  = elements2.html();  //#article_content里面的内容


10.

// 从classpath的根目录中查找a.txt文件
this.getClass().getClassLoader().getResourceAsStream("a.txt");

// 从classpath的根目录中查找a.txt文件
this.getClass().getResourceAsStream("/a.txt");

// 从当前类所在的包中查找a.txt文件
this.getClass().getResourceAsStream("a.txt");

11.动态加载Android布局

View view = LayoutInflater.from(MainActivity.this).inflate(R.layout.tab1,null); 
由于这个view 没有父布局,故 参数2null;

12. 多线程下载库,httpunit,压缩解压工具
13.图片轮播的小点

   ImageView imageView;
   ImageView imageviews = new ImageView[advPic.size];  //advPic(ImageView) 是轮播中的图片共4张 

   for(int i=0;i<4;i++){
        imageView = new ImageView(this);
        imageView.setLayoutParams(new LayoutParams(20,20));  //设置imageView的宽和高 
        imageView.setPadding(5,5,5,5); // 设置上下左右的间距 
        imageviews[i] = imageView;

        if(i==0){
            imageviews[i].setBackgourndResource(R.drawable.banner_focus); 
        }
        else{
            imageviews[i].setBackgourndResource(R.drawable.banner_blur);
        }


   }

14. 切换轮播是通过 Thread.sleep(3000);  休眠时间设置的 
15.this.adapter.notifyDataSetChanged();  //更新listView的

List<CollectListModel> mcList ;
private MyCollectAdapter adapter;

protected void onCreate(Bundle saveInstanceState){
    super.onCreate(saveInstanceState);

    setContentView(R.layout.activity_main);
    ListViewCollect mListview = (ListViewCollect)findViewById(R.id.list_del);
    mcList = new ArrayList<CollectListModel>();
    adapter = new MyColloectAdapter(this.mcList);
    mListview.setAdapter(adapter);

    setList();

}

public void setList(){
    for(int i=0;i<10;i++){
        CollectListModel m = new CollectListModel();
        mcList.add(m);
    }
    adapter.notifyDataSetChanged();  //更新listView
}






16.类似QQ谈话面板用的是 ListView Adapter使用的是BaseAdapter

 public View getView(int paramInt, View paramView, ViewGroup paramViewGroup)
  {
    LayoutInflater localLayoutInflater = LayoutInflater.from(this.context);
    if (((TextObject)this.lists.get(paramInt)).getFlag() == 0)   // public static final int reciveFlag = 0;
      this.layout = ((RelativeLayout)localLayoutInflater.inflate(R.layout.left, null));
    if (((TextObject)this.lists.get(paramInt)).getFlag() == 1)   //Const.java中  public static final int sendFlag = 1;
      this.layout = ((RelativeLayout)localLayoutInflater.inflate(R.layout.right, null));
    TextView localTextView1 = (TextView)this.layout.findViewById(2131296261);
    TextView localTextView2 = (TextView)this.layout.findViewById(2131296259);
    localTextView1.setText(((TextObject)this.lists.get(paramInt)).getText().replace("<br>", "\n"));
    localTextView2.setText(((TextObject)this.lists.get(paramInt)).getTime());
    return this.layout;
  }



布局 
接受者 left.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout android:layout_width="fill_parent" android:layout_height="fill_parent"
  xmlns:android="http://schemas.android.com/apk/res/android">
    <TextView android:gravity="center_horizontal" android:id="@id/time" android:layout_width="fill_parent" android:layout_height="fill_parent" />
    <ImageView android:id="@id/iv" android:padding="10.0dip" android:layout_width="70.0dip" android:layout_height="70.0dip" android:src="@drawable/robot" android:layout_below="@id/time" />
    <TextView android:id="@id/tv" android:background="@drawable/receive" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginRight="50.0dip" android:layout_toRightOf="@id/iv" android:layout_below="@id/time" />
</RelativeLayout>



发送者 right.xml
 <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout android:layout_width="fill_parent" android:layout_height="fill_parent"
  xmlns:android="http://schemas.android.com/apk/res/android">
    <TextView android:gravity="center_horizontal" android:id="@id/time" android:layout_width="fill_parent" android:layout_height="fill_parent" />
    <ImageView android:id="@id/iv" android:padding="10.0dip" android:layout_width="70.0dip" android:layout_height="70.0dip" android:src="@drawable/user" android:layout_below="@id/time" android:layout_alignParentRight="true" />
    <TextView android:id="@id/tv" android:background="@drawable/send" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="50.0dip" android:layout_toLeftOf="@id/iv" android:layout_below="@id/time" />
</RelativeLayout> 


17.Android 里面比较常用的 获取文件类
一般手机SD卡只有一个 ,现在多数有两个SD卡/mnt/sdcard  /mnt/sdcard2

        File sdCardDir = Environment.getExternalStorageDirectory();//   /mnt/sdcard
        Environment.getDataDirectory()
        Environment.getRootDirectory()
        Environment.getDownloadCacheDirectory()

18. 获取手机ROM容量和 手机SD卡的容量

        File sdCardDir = new File("/mnt/sdcard2");//   /mnt/sdcard
        StatFs statFs = new StatFs(sdCardDir.getPath());

        long blockCount = statFs.getBlockCount();
        long blockSize = statFs.getBlockSize();
        long availableBlocks = statFs.getAvailableBlocks();


总容量 String totalSize = Formatter.formatFileSize(getApplicationContext(), blockCount*blockSize);
可用容量String availableSize = Formatter.formatFileSize(getApplicationContext(), blockSize*availableBlocks);


//------------
        File path = Environment.getDataDirectory();
        StatFs statFs = new StatFs(path.getPath());

        long blockCount = statFs.getBlockCount();
        long blockSize = statFs.getBlockSize();
        long availableBlocks = statFs.getAvailableBlocks();

        String totalSize = Formatter.formatFileSize(getApplicationContext(), blockCount*blockSize);
        String availableSize = Formatter.formatFileSize(getApplicationContext(), blockSize*availableBlocks);

        return "手机Rom总容量:"+totalSize+"\n手机Rom可用容量:"+availableSize;




19.在使用 android:layout_weight="1.0" 尤其是LinearLayout  android:orientation="horizontal"水平方向时候
其里面的  控件 可以设置 android:layout_width="0.0dip"0 ,由 android:layout_weight="1.0"控制

  <EditText 
       android:id="@+id/send"
       android:background="@drawable/edittext_active" 
       android:layout_width="0.0dip" 
       android:layout_height="wrap_content"
       android:layout_weight="1.0"
        />      


20. 布局  android:layout_weight="1.0" 设置时候,发现,如果只有一方设置,另一方没有设置的情况下
在另一方占 一定位置,剩下的全部 留给被设置的 一方


21. 

图灵机器人



package com.example.robot.Utils;

import android.os.AsyncTask;
import com.example.robot.Interface.HttpGetUrlDataListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;

public class HttpGetRequest extends AsyncTask<String, Void, String>
{
  private String content;
  private HttpEntity entity;
  private HttpClient httpCilent;
  private HttpGet httpGet;
  private HttpGetUrlDataListener httpGetUrlDataListener;
  private HttpResponse httpResponse;
  private String url = "http://www.tuling123.com/openapi/api?key=c3dbedaa570141b3b0ef68c4e7fdf8ce&info=";

  public HttpGetRequest(String paramString, HttpGetUrlDataListener paramHttpGetUrlDataListener)
  {
    this.content = paramString;
    this.httpGetUrlDataListener = paramHttpGetUrlDataListener;
  }

  protected String doInBackground(String[] paramArrayOfString)
  {
    String str = null;
    try
    {
      this.httpCilent = new DefaultHttpClient();
      this.httpGet = new HttpGet(this.url + this.content);
      this.httpResponse = this.httpCilent.execute(this.httpGet);
      this.entity = this.httpResponse.getEntity();
      BufferedReader localBufferedReader = new BufferedReader(new InputStreamReader(this.entity.getContent()));
      StringBuffer localStringBuffer = new StringBuffer();
      str = localBufferedReader.readLine();
      if (str == null)
        return localStringBuffer.toString();
      label145: localStringBuffer.append(str);
    }
    catch (ClientProtocolException localClientProtocolException)
    {
      localClientProtocolException.printStackTrace();
      return str;
    }
    catch (IOException localIOException)
    {
      localIOException.printStackTrace();
      break label145:
    }
  }

  protected void onPostExecute(String paramString)
  {
    this.httpGetUrlDataListener.getUrlData(paramString);
    super.onPostExecute(paramString);
  }
}

22.
    <android.support.v4.view.ViewPager
        android:id="@+id/vPager"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
         />
    <LinearLayout                                 //里面是四个 欢迎的圆点
        android:id="@+id/ll"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="5.0dp"          //通过margin 使圆点向上移动了
        android:orientation="horizontal" >

23. 


解释 android:layout_gravity 和 android:gravity区别

LinearLayout有"两个"  


24.
例子1:
requestWindowFeature(Window.FEATRUE_NO_TITLE); //等价于满屏(没有图标和标题)
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.main);



例子2:
requestWindowFeature(Window.FEATURE_LEFT_ICON); //等价于满屏(没有图标和标题)
setContentView(R.layout.main);
getWindow().setFeatureDrawableResource(Window.FEATURE_LEFT_ICON,R.drawable.ic_launcher);  //设置 左边图标的 图片 

例子3:
requestWindowFeature(Window.FEATURE_RIGHT_ICON); 
setContentView(R.layout.main);
getWindow().setFeatureDrawableResource(Window.FEATURE_RIGHT_ICON,R.drawable.ic_launcher);  //设置 right 图标的 图片 



25.
Android好看的按钮制作,可以使用图片(默认,单击,聚焦,样式都不同),方法: 在res/drawable/下面 放置一个xml文件
名字随意
但是需要使用selector 标签


<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_enabled="true"
        android:drawable="@drawable/dark_dot" />
    <item
        android:drawable="@drawable/white_dot" />
</selector>



<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true"                  //点击状态
        android:drawable="@drawable/pressed" /> 
    <item android:state_focused="true"              //获得焦点状态
        android:drawable="@drawable/focused" />  
    <item android:drawable="@drawable/focused" /> //默认状态

</selector>


26.button.layout(l, t, r, b); 可以直接给某个空间布局位置


27. Pending  直到,即将发生的,待定的
PendingIntent



28.

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        // TODO Auto-generated method stub
        super.onActivityResult(requestCode, resultCode, data);
        switch (requestCode) {
        case 10086:

            Uri result = data.getData();
            String contactId = result.getLastPathSegment(); //得到uri中的最后一个占位符 如 localhost/dedecms/java/1

通过startActivityForResult获取 联系人的方法
public void getList(View view){
        //获取联系人列表
        Intent intent = new Intent();

        intent.setAction(Intent.ACTION_PICK);
        intent.setData(ContactsContract.Contacts.CONTENT_URI);

        startActivityForResult(intent, 10086); //10086 是请求码


    }   



29.
ArrayList和 数组的互转 

ArrayList<String> list = new ArrayList<String>();
String[] strs = new String[list.size];
list.toArray(strs);

String []strs = {"a","b","c"};
List list = Arrays.asList(strs);


30.BitmapFactory 工具类可以直接把R.drawable里面图片转换为bitmap
也可以把assets里面图片转为bitmap类型

31.
SMS发短信实例:

public void send(View view){

        String message = editText.getText().toString();
        //scAddress 服务中心的地址    null(默认为SMSC 3) destinationPort消息的目标端口号
        //sentIntent 短息发送成功或失败   后才 调用此Activity  ,ResultCode是  Activity.RESULT_OK表示成功,(RESULT_ERROR_GENERIC_FAILURE,RESULT_ERROR_RADIO_OFF,RESULT_ERROR_NULL_PDU)之一表示错误
        //deliveryIntent 短息接收成功  后才调用此Activity

        Intent send = new Intent();
        send.setClass(MainActivity.this, ShowActivity.class);
        PendingIntent sentIntent = PendingIntent.getActivity(MainActivity.this, 1, send, PendingIntent.FLAG_UPDATE_CURRENT);

        Intent receiver = new Intent();
        receiver.setClass(MainActivity.this, ShowActivity2.class);
        PendingIntent deliveryIntent = PendingIntent.getActivity(getApplicationContext(), 2, receiver, PendingIntent.FLAG_UPDATE_CURRENT);

        smsManager.sendTextMessage("10086", null, message, sentIntent, deliveryIntent);

    }
注意权限需要:
    <uses-permission android:name="android.permission.SEND_SMS"/>       
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
32.
无需权限,感觉Android5.0 改了很多,关闭应用,这个全局定时器也无效了;

public class MainActivity extends Activity  {

    //全局定时器
    AlarmManager alarmManager = null;
    PendingIntent pendingIntent = null;
//  PendingIntent 可以脱离应用程序而存在,系统级别的
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Intent intent = new Intent();
        intent.setClass(this, Result.class);

        alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
        pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

    }   

    public void start(View view ){
        //开启全局定时器
        alarmManager.setRepeating(AlarmManager.RTC, 0, 5000, pendingIntent);


    }

    public void end(View view ){
        alarmManager.cancel(pendingIntent);
    }


33.PackageManager manager = getPackageManager();
这个类很好,可以获取 手机已经安装的应用的图标等等信息
    String packageName = "com.gs.file";

    List<PackageInfo> pinfo = packageManager.getInstalledPackages(0);
    for(int i=0;i<pinfo.size();i++){
        PackageInfo p = pinfo.get(i);
        String label = packageManager.getApplicationLabel(p.applicationInfo).toString();  //应用程序的名字
        if(packageName.equals(label)){
            Intent intent = new Intent();
            intent = packageManager.getLaunchIntentForPackage(packageName);
            startActivity(intent);
        }

    }

    获取某个应用的Intent
    Intent intent = manager.getLaunchIntentForPackage(pName);



34.JavaScript解析Json

<script type="text/javascript">
        function getJson(){
            $.ajax({
                type:"post",
                url:"testJson",
                data:{"time":Math.random()},
                success:function(data){
                    var musers = eval("("+data+")");  //{"users":[{"name":"王立","password":1234},{"name":"张华天","password":124551}]} "users"是musers的一个属性,注意  和 [{"name":"王立","password":1234},{"name":"张华天","password":124551}]是不同的
                    var array = musers.users;
                    //alert(array);
                    for(var key in array){     // for(var i=0;i<array.length;i++)
                        alert(array[key].name);   // array[key]是每一个对象Object{"name":"王立","password":1234} 此时key表示index   ,如果使用for(var key in array) 遍历{"name":"王立","password":1234},则key表示对象里面的属性
                    }



                }
            });                     

        }

for(var key in obj){
    //注意 key表示 下标(如遍历数组)或 属性(如遍历对象)
}

35. 
Properties p = new Properties();
p.load(this.getClass().getClassLoader().getResourceAsStream("system.properties"));

36. 如果我们希望 某些按钮不显示,可以设置按钮的父容器 不显示 xml属性visiblable="",当用户触摸屏幕时候显示
重写 Activity的onTouchEvent();     

public boolean onTouchEvent(MotionEvent event){
    if(event.getAction() == MotionEvent.ACTION_DOWN){
        btnlayout.setVisibility(ViewGroup.VISIBLE);//ViewGroup.GOON;不可见
        reuturn true; //-------------> true Android的事件不再往下 传播  false,事件继续传播
    }
    return super.onTouchEvent(event);
}




37.

<%@ page import="java.util.Date,java.sql.*" pageEncoding="utf-8" %>

<html>
    <h1>Hello jsp 你好jsp</h1>

    <%!
        public String info(){
            String str = "I love you";
            return str;
        }

    %>
    <%=info()%>
</html>

jsp 里面可以直接写方法 <%! 方法体 %> 
但是 既然是方法,那么里面就不能直接使用 九大内置对象了,out.write();错误,需要自己创建使用


38.
google 操作流的 工具包 (简单而强悍,使用nio)
 CharStreams和ByteStreams
 com.google.common.collect里还有很多非常有用的工具

 BufferedReader buffered = new BufferedReader(reader);  
List<String> lines = new ArrayList<String>();  
for (;;) {  
  String line = buffered.readLine();  
  if (line == null) {  
    break;  
  }  
  lines.add(line);  
}  

使用Google :
1.List<String> lines = CharStreams.readLines(reader);  



2.从Readable读取所有内容到一个字符串: 
String content = CharStreams.toString(reader); 

3.用来把整个InputStream的内容全部一次性读到一个byte[]里面.
byte[] content = ByteStreams.toByteArray(inputStream)  



4.
如果你还是需要类似于流一样的操作-比如, 输入的行数太多, 不能一下子都读进来, 那么, 还有一个LineReader可以用. 用起来类似于: 
Java代码  收藏代码
LineReader lineReader = new LineReader(reader);  
for (String line = lineReader.readLine(); line != null; line = lineReader.readLine()) {  
  System.out.println(line);  
}  

5.
用来把所有内容从一个InputStream拷贝到另一个OutputStream. 
ByteStreams.copy(inputStream, outputStream);



39.

Guava 中文是石榴的意思,该项目是 Google 的一个开源项目,包含许多 Google 核心的 Java 常用库。

目前主要包含:

com.google.common.annotations
com.google.common.base
com.google.common.collect
com.google.common.io
com.google.common.net
com.google.common.primitives
com.google.common.util.concurrent



40. 几个强大的工具类库 

Google的 guava, commons dbutils: JDBC工具类库可以把结果集转换为List  Commons-Compress.jar 文件压缩或解压成tar,zip,bzip2等 
Commons-exec : 提供常用方法执行外部进程 
httpunit 
httpclient
commons-io (这里面文件的操作比较方便 )
commons-lang   为java.lang提供扩展 ,编程基础类
commons-Math  Apache 上 轻量级 数学和统计方法包 包含大多数常用数值算法
commons-net 提供FTP等功能,实现了很多 基于Intent协议  支持 ftp/ftps,nntp,smtp,pop3,telnet,tftp,finger,..
commons-proxy  封装了java对象代理的一些常用方法

commons-validator,jar 验证Email,日期等字符串是否合法
dom4j 
jaxen   xpath库 
jsoup
js  用于在java中执行javascript 
lucene 
mybatis (前身ibatis)
Mina apache Mina(apache 用于开发 高性能的网络应用程序  支持基于NIO ,技术的TCP/UDP 应用 ,串口通讯程序(只在最新预览版中提供))
poi  Microsoft office 
Quartz 
qrcode  二维码 
spring-jdbc Spring 对jdbc的封装 
spring-test  Spring对junit的封装 
Spring Security   安全认证框架 
Spring-module 验证框架 进行表单验证 

Html2Image 可以将html存为 GIF ,jpg,png  
java-zhconverter  java简体 繁体转换 
css Parser css 解析器 
commons-tools 时间工具类,数据库连接池工具类,ssh端口映射,文件类,多线程工具类,文件读写,文本关键字查找
hutool  也是一个工具类,比commons-tools 依赖更少 ,更多使用功能
HttpBuilder 是对httpClient的封装 
JCake  ------>字符串处理,日期处理,邮件处理,文件处理,任务调度处理,http请求处理,MD5/AES加密解密处理的一系列工具类

Java 反射封装库 Mirror 
通用工具类 commonUtils  涵盖 加密,验证,网络,字符串处理,配置,文件处理,异常等工具类 
java工具类 FinalGather 日期,字符串,文件,集合,拼音,json,加密,邮件等  
控制台输入彩色文字  Jansi  
Dao 工具 DaoSupport   对java dao的封装,适合数据库为mysql, 让DaoSupport来帮你管理dao 
JFinal-commons  是 JFinal2.0 框架的一个基础工具类,集成众多工具, 可以写验证码 
JnativeHook   为java程序员提供了全局的键盘和鼠标事件侦听功能 (使用了Jni技术 调用系统方法实现的)
验证工具包  mint-validate  轻量级,无第三方依赖, 支持注解

java客户库 Google auth library 开源验证客户端库 
EasyDBUtils  对DBUtils 的封装 ,简化了事务操作,只需在 业务层接口中需要管理事务 的方法上进行 @StartTransaction 注解即可 





部分说明:

mint-validate 是一个轻量的 验证工具包,不含源码的jar包 9.4k,含源码的jar包 15k,一共6个java文件,无第三方依赖。validate支持自定义验证规则,并用annotation配置验证规则。它的设计借鉴了javascript 验证工具 的动态性灵活性,并采用java的反射技术实现,所以validate有较强的动态性和灵活性。

一个简单实用例子(验证器的定义请参看博文):
package test;

import mint.validate.Valid;

public class User extends Verifiable{
    /*采用正则表达式验证(可配置多个正则表达式)*/
    @Valid(tipMsg="邮箱地址不正确", pattern={"^[\\w-]+(\\.[\\w-]+)*@[\\w-]+(\\.[\\w-]+)+$"})
    public String email;

    /*简单验证器验证*/
    @Valid(rule="notnull")
    public String username;

    /*采用验证器验证,并给验证器传递参数*/
    @Valid(rule={"LenLimit"}, params={"6", "32"})
    public String password;
}
实现验证:

User u = new User();

u.email = "895925636#qq.com";
u.password = "passw";

/*不写字段名默认验证所有字段,本方法返回一个boolean值,有一个规则验证不通过就返回false,适合在入库前用*/
u.validate("email", "password");

for(VerificationResult r : u.getValidateResult()){
    System.out.println(r);
}




41.
MIME: MIME类型就是设定某种扩展名的文件用一种应用程序 来打开 的方式类型,当该扩展名文件被访问的时候,浏览器 会自动使用指定应用程序来打开。多用于执行一些客户端自定义的文件名,以及一些媒体文件 打开方式 

ContentType:text/html;charset=utf-8 浏览器在获取到这种文件时候会自动 调用html解析器对文件进行相应处理 
ContentType:text/plain;charset=utf-8  将文件设置为纯文本形式 ,浏览器在获取到这种文件时并不会对其进行处理 

42.
StringEntity, ByteArrayEntity, InputStreamEntity, and FileEntity.

UrlEncodedFormEntity entity = new UrlEncodedFormEntity(formparams, Consts.UTF_8);形式比较单一,只能放入键值对(StringEntity厉害)
StringEntity entity = new StringEntity(jsonData.toString(),Consts.UTF_8);

File file = new File("somefile.txt");
FileEntity entity = new FileEntity(file,
ContentType.create("text/plain", "UTF-8"));
HttpPost httppost = new HttpPost("http://localhost/action.do");
httppost.setEntity(entity);




43.
布局的技巧

 <fragment 
        android:id="@+id/fragment1"
        android:name="com.gs.file.Fragment1"
        android:layout_height="fill_parent"
        android:layout_width="0dp"
        android:layout_weight="1"
        />

    <fragment 
        android:id="@+id/fragment2"
        android:name="com.gs.file.Fragment2"
        android:layout_height="fill_parent"
        android:layout_width="wrap_content"
        />
   这种方式
   android:layout_width="0dp"
   android:layout_weight="1"   对应  android:layout_width="wrap_content"
   表示在 第二个布局 wrap_content的情况下,其他区域都是 布局一的 

  注意所有布局 
    android:layout_width=""
    android:layout_height=""
        都不能省 

44.
            style="?attr/buttonBarStyle"
表示 从当前主题中 取出属性(此属性已经定义好了  值)

45.

<activity
            android:name="com.gs.blog.MainActivity"
            android:theme="@android:style/Theme.Wallpaper"
Android 自带很多Activity的主题,有对话框.........很多


46.
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getSupportMenuInflater().inflate(R.menu.example_list, menu);
        return true;
    }

47.

    <Button
        android:id="@+id/right"
        android:layout_width="200dp"
        android:layout_height="200dp"
        android:gravity="center"    里面的文字是 上下左右居中的  
        android:onClick="openMenu"
        android:text="右边菜单" />


48.下拉试试... ,松开刷新... ,刷新中
49.退出提示, 确定要退出程序吗  取消 确定 ,返回按钮的监听
50.  按钮点击后 都 换了背景色 
ActionBar 上面 左边都有一个返回上一个Activity的按钮  <

51. 不需要使用ActionBar ,java代码设置满屏 有点小bug, 此种方式设置直接就是满屏
    <activity
            android:name="com.gs.xm.MainActivity"
            android:label="@string/app_name"
            android:theme="@android:style/Theme.NoTitleBar" >

    <application
        android:icon="@drawable/icon"
        android:label="@string/app_name"
        android:name="com.renren.android.BaseApplication"
        android:theme="@android:style/Theme.NoTitleBar" >   // 最直接的方法是在  <Application中设置,全部的Activity都是 满屏,就不怕ActionBar带来的 版本不一致问题了

52.

        AlertDialog.Builder builder = new Builder(DesktopActivity.this);
        builder.setMessage("您确定要退出吗?");
        builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {

            public void onClick(DialogInterface dialog, int which) {
                dialog.dismiss();
                finish();
                android.os.Process.killProcess(android.os.Process.myPid());
                System.exit(0);
            }
        });
        builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {

            public void onClick(DialogInterface dialog, int which) {
                dialog.cancel();
            }
        });
        builder.create().show();
    }

53. 设置ViewPager的下面图标的背景色 
如 4个,默认全部是白色,当前 index是 黑的,      


54.

FrameLayout 常用来 盛装 Fragment ,  tx.replace(R.layout.frame_layout,fragment1); 没有用到ViewPager中,我记错了


55.
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.wl.junittest"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="9" />

    <!-- 测试用例步骤2 -->
        <instrumentation android:targetPackage="com.wl.junittest"
            android:name="android.test.InstrumentationTestRunner"
            android:label="AndroidJunit"
            />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >

        <activity
            android:name="com.wl.junittest.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>

        </activity>

        <!-- 测试用例步骤1 -->
     <uses-library android:name="android.test.runner"/>  

    </application>

</manifest>


56.  回调函数的两种写法

方式1:
package com.gs.callback;

public class Work {

    public interface CallBack{
        public void list(String str);
    }


    public void doWork(String str,CallBack back){
        back.list(str);   // back 必须实例化 过才能调用其方法
    }

}


直接实现 
public class Main implements CallBack{

    @Test
    public void test(){

        Work work = new Work();
        work.doWork("输出字符串.......",this);

    }

    @Override
    public void list(String str) {
        System.out.println("===============>"+str);

    }

}

方式二:
匿名内部类
public class Work 回调函数的编写 一样

public class Main{

    @Test
    public void test(){

        Work work = new Work();
        work.doWork("输出字符串.......",new CallBack() {

            @Override
            public void list(String str) {
                System.out.println("=============>"+str);
            }
        });

    }

}


方式三:
public class Main implements CallBack{

    @Test
    public void test(){

        Work work = new Work();

        work.getInstance(new Main());  //实例化CallBack

        work.doWork("输出字符串");

    }

    @Override
    public void list(String str) {
        System.out.println("=================>"+str);

    }

}


public class Work {
    private CallBack callBack;
    public interface CallBack{
        public void list(String str);
    }


    public void doWork(String str){

        callBack.list(str);
    }

    public void getInstance(Main main){
        callBack = main ;
    }

}



57.

登陆用httpClient,拿到session,保存该sessionId。
上传用connection,setRequestProperty添加这个session。。


58.

小结:
1、同名Header可以有多个 ,Header[] getHeaders(String name)。
2、运行时使用的是第一个, Header getFirstHeader(String name)。
3、addHeader,如果同名header已存在,则追加至原同名header后面。
4、setHeader,如果同名header已存在,则覆盖一个同名header。


public static void main(String[] args) {

        HttpGet get = new HttpGet("http://www.baidu.com");
        get.addHeader("Cookie", "aa");
        get.addHeader("Cookie","bb");

        System.out.println("=========================");
        Header headers [] = get.getAllHeaders();

        for(Header header:headers){
            System.out.println(header.getName()+":"+header.getValue());
        }


    }
结果:
    =========================
Cookie:aa
Cookie:bb

其他方法:
 Header header_first = httpGet.getFirstHeader("Cookie");  
 System.out.println(header_first.getName()+"  "+header_first.getValue());


59. 
    3xx (重定向) 要完成请求,需要进一步操作。通常,这些状态码用来重定向{
        302 重定向 
        301(永久移动)请求的网页已永久移动到新位置
        302(临时移动)服务器目前从不同位置的网页响应请求
    }
    404 

    503 - 服务器超时
    2xx (成功) 表示成功处理了请求的状态码。  {
     200 HTTP/1.1 200 OK  (包含请求转发也会直接处理 )
     201(已创建)请求成功并且服务器创建了新的资源
     202(已接受)服务器已接受请求,但尚未处理。
     203(非授权信息)服务器已成功处理了请求,但返回的信息可能来自另一来源
     204(无内容)服务器成功处理了请求,但没有返回任何内容
     205(重置内容)服务器成功处理了请求,但没有返回任何内容   ::与 204 响应不同,此响应要求请求者重置文档视图(例如,清除表单内容以输入新内容)。 
     206(部分内容)服务器成功处理了部分 GET 请求

    }
60.

使用HttpClient处理重定向问题
神奇现象:
用get 的时,如果有重定向,会自动再去访问重定向的内容 。 
但用post访问url就不会自动 重定向的内容 。
用post访问url是地,我们经常会遇到返回301302 返回代码,他们代表的是重定向。有两种方法让程序继续访问

且 注意这个 重定向指的是 <script> window.location.href=""; </script>

服务器端的  return "redirect:result";(重定向)  或 return "list";(请求转发)  HttpClient都会自动处理 



public static void main(String[] args) throws Exception, IOException {

        HttpClient client = new DefaultHttpClient();
//方式1============ > start   
//      HttpGet get = new HttpGet("http://localhost:8080/Upload/list");
//      HttpResponse response = client.execute(get);   
//方式1============ > end   此种方式会自动处理 重定向信息   

        HttpPost post = new HttpPost("http://localhost:8080/Upload/list");
        HttpResponse response = client.execute(post);

        int responseCode = response.getStatusLine().getStatusCode();
        System.out.println("responseCode:"+responseCode);
        System.out.println(EntityUtils.toString(response.getEntity()));

        if(responseCode==301||responseCode==302){
            System.out.println("重定向了");
            Header headers[] = response.getHeaders("Location");
            String location = headers[0].getValue();
            System.out.println(location);


        }

    }


61. 使用HttpClient完成更高级的功能
有时候提交到大网站,发现参数特别多

方法:
1.先Get获取 到cookie
2.然后再次提交 设置cookie为 Response获取到的,并且修改部分字段setHeader();



62.


 @Test
    // 设置已获取的cookie,查看需要登录后才能查看的页面
    public void testGetinfoByLoginCookie() throws Exception, IOException {
        DefaultHttpClient httpclient = new DefaultHttpClient();
        CookieStore cookieStore = new BasicCookieStore();
        BasicClientCookie cookie1 = new BasicClientCookie("ThinkID","5s4tmqem08gh091v3egoa7sqf7");
        cookie1.setDomain(".lashou.com");
        BasicClientCookie cookie2 = new BasicClientCookie("city_b","2419");
        cookie2.setDomain("lashou.com");
        BasicClientCookie cookie3 = new BasicClientCookie("client_key","1425104707wd157b4b24ff70adcb875a");
        cookie3.setDomain("lashou.com");
        BasicClientCookie cookie4 = new BasicClientCookie("login_name2","testuser007");
        cookie4.setDomain("lashou.com");
        BasicClientCookie cookie5 = new BasicClientCookie("pwd2","4c88a4062736c26572d3ec382868fa2b");
        cookie5.setDomain("lashou.com");
        cookieStore.addCookie(cookie1);
        cookieStore.addCookie(cookie2);
        cookieStore.addCookie(cookie3);
        cookieStore.addCookie(cookie4);
        cookieStore.addCookie(cookie5);
        List<Cookie> cookies = new ArrayList<Cookie>();
        httpclient.setCookieStore(cookieStore);

        List<Cookie> cookieList = httpclient.getCookieStore().getCookies();
        for(int i=0;i<cookieList.size();i++){
            System.out.println("cookie"+i+":"+cookieList.get(i));
        }

        // 设置已登录的cookie
        String memberpage = "http://www.lashou.com/account/orders/";
        HttpGet httpget = new HttpGet(memberpage);
        HttpResponse response = httpclient.execute(httpget); // 必须是同一个HttpClient!
        HttpEntity entity = response.getEntity();
        entity = response.getEntity();
        String html = EntityUtils.toString(entity, "GBK");
        httpget.releaseConnection();

        System.out.println(html);
    }



63.
简单使用

package com.gs.test;

import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;

import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.HttpMethod;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.WebRequest;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
import com.gargoylesoftware.htmlunit.util.Cookie;
import com.gargoylesoftware.htmlunit.util.NameValuePair;


public class Test {

    public static void main(String[] args) throws Exception, IOException {
        WebClient wc = new WebClient(BrowserVersion.INTERNET_EXPLORER_11);
        wc.getOptions().setUseInsecureSSL(true);
        wc.getOptions().setCssEnabled(false);
        wc.getOptions().setJavaScriptEnabled(true);

        // 3 启动客户端重定向  
        wc.getOptions().setRedirectEnabled(true); 
        wc.getOptions().setThrowExceptionOnScriptError(false);
        wc.getOptions().setTimeout(10000);
        wc.getOptions().setDoNotTrackEnabled(false); //设置不跟踪 



        //----------------------------
        //设置Cookies  : 可以用于认证数据
        wc.getCookieManager().setCookiesEnabled(true); 
        Cookie cookie  = new Cookie("baidu.com","key","value");
        wc.getCookieManager().addCookie(cookie);
        //----------------------------


        WebRequest request  = new WebRequest(new URL("http://www.baidu.com"));
//      request.setHttpMethod(HttpMethod.GET);
        request.setHttpMethod(HttpMethod.POST);
        List<NameValuePair> list = new ArrayList<NameValuePair>();
        list.add(new NameValuePair("username", "wangli"));

        request.setRequestParameters(list);

        HtmlPage htmlPage = wc.getPage(request);
        System.out.println(htmlPage.asXml());


        //----------------------------
        //获取cookie 
        Set<Cookie> ResponseCookies = wc.getCookieManager().getCookies();
        for(Cookie c:ResponseCookies){
            System.out.println("获取的Cookie是------>"+c.getName()+":"+c.getValue());
        }
        //----------------------------


        /*
         * 
        WebResponse response = htmlPage.getWebResponse();
        response.cleanUp(); // 关闭响应流 
         */


    }
}


64.
bottom_bar.xml 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/bottom"
    android:layout_width="fill_parent"
    android:layout_height="55dp"
    android:layout_alignParentBottom="true"
    android:background="@drawable/bottom_bar"
    >
    <TextView 
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:textColor="#fff"
        android:text="使用include layout 可以使其显示在 主布局的底部"/>

</RelativeLayout>

MainActivity:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <FrameLayout
        android:id="@+id/id_content"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1" >
    </FrameLayout>

   <include layout="@layout/bottom_bar"/>

</LinearLayout>

65. 布局 
    <LinearLayout 
        android:layout_width="fill_parent"
        android:layout_height="55dp">
        <LinearLayout 
            android:id="@+id/tab_weixin"
            android:layout_width="0dp"
            android:layout_height="fill_parent"
            android:layout_weight="1"
            android:descendantFocusability="beforeDescendants"  //=====================
            android:gravity="center"
            android:orientation="vertical">

            <ImageButton 
                android:id="@+id/weixin"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:background="#0000"
                android:clickable="false"
                android:src="@drawable/tab_weixin_pressed"/>
            <TextView 
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="微信"/>

        </LinearLayout>




beforeDescendants:viewgroup会优先其子类控件而获取到焦点   
afterDescendants:viewgroup只有当其子类控件不需要获取焦点时才获取焦点   
blocksDescendants:viewgroup会覆盖子类控件而直接获得焦点   


66.
WebView 的使用 
// 监听 所有点击的链接,如果拦截到我们需要的,就跳转到相对应的页面。
private class MyWebViewClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
System.out.println("----------------------shouldOverrideUrlLoading 。。 url:" + url);


if (url != null && url.contains("/m/phoneRegiste.do")) {
Intent intent = new Intent(PublicWebView.this, RegisterByPhone.class);
PublicWebView.this.startActivity(intent);

finish();
return true;
}  


return super.shouldOverrideUrlLoading(view, url);
}



67.

 mWebView.setWebChromeClient(new WebChromeClient(){

            public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
                //偷懒直接接收JS中传过来的msg
                if(message.length() > 15){
                    mLoginBackJson = message;
                    Log.i(TAG, "mLoginBackJson = " + mLoginBackJson);
                    if(parseJson(mLoginBackJson)){//解析传回的json文件,成功的话,进行一次业务的访问
                        new MyTask().execute(ConfigUrl.ALL_CONTENT_VIEW);
                    }
                    //return true;
                }
                //保存一下cookie,后面httpclient使用
                CookieManager cookieManager = CookieManager.getInstance();
                CookieStr = cookieManager.getCookie(COOKIE_URL);

                return super.onJsAlert(view, url, message, result); 
            }
        });
    }


68.
WebView 处理ajax请求

You can use the JavascriptInterface to intercept the AJAX calls along with JQuery methods ajaxStart and ajaxComplete in following way:

// our JavascriptInterface
public class AjaxHandler {

    private static final String TAG = "AjaxHandler";
    private final Context context;

    public AjaxHandler(Context context) {
        this.context = context;
    }

    public void ajaxBegin() {
        Log.w(TAG, "AJAX Begin");
        Toast.makeText(context, "AJAX Begin", Toast.LENGTH_SHORT).show();
    }

    public void ajaxDone() {
        Log.w(TAG, "AJAX Done");
        Toast.makeText(context, "AJAX Done", Toast.LENGTH_SHORT).show();
    }
}
And here is how the AjaxHandler is used in Activity:

    public class MainActivity extends Activity {

    private static final String TAG = "MainActivity";

    private WebView webView;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

        // get web view
        webView = (WebView) findViewById(R.id.web); 

        // configure web view 
        final WebSettings webSettings = webView.getSettings();
        webSettings.setBuiltInZoomControls(true);
        webSettings.setJavaScriptEnabled(true);

        webView.loadUrl("http://foo.com");

        // add javascript interface
        webView.addJavascriptInterface(new AjaxHandler(this), "ajaxHandler");

        // override onPageFinished method of WebViewClient to handle AJAX calls 
        webView.setWebViewClient(new WebViewClient() {

                @Override
                public void onPageFinished(WebView view, String url) {
                    super.onPageFinished(view, url);

                    view.loadUrl("javascript:$(document).ajaxStart(function (event, request, settings) { " +
                            "ajaxHandler.ajaxBegin(); " + // Event called when an AJAX call begins
                            "});");
                    view.loadUrl("javascript:$(document).ajaxComplete(function (event, request, settings) { " +
                            "ajaxHandler.ajaxDone(); " + // Event called when an AJAX call ends
                            "});");

            });
    }
}


69.

把 httpClient的Cookie共享给 WebView 
DefaultHttpClient httpclient=....;
String toUrl="https://cap.cityu.edu.hk/studentlan/details.aspx.....";

List<Cookie> cookies = httpclient.getCookieStore().getCookies();

if (! cookies.isEmpty()){
    CookieSyncManager.createInstance(this);
    CookieManager cookieManager = CookieManager.getInstance();
        //sync all the cookies in the httpclient with the webview by generating cookie string
    for (Cookie cookie : cookies){
        String cookieString = cookie.getName() + "=" + cookie.getValue() + "; domain=" + cookie.getDomain();
        cookieManager.setCookie(toUrl, cookieString);
        CookieSyncManager.getInstance().sync();
    }
}   

把WebView的Cookie共享给HttpClient 

70.
首先android5.0 实现了WebView与 框架的自动cookie同步,无需额外操作



Set-Cookie Header 
    Set-Cookie响应头的格式如下所示:

        Set-Cookie: =[; =]...
                    [; expires=][; domain=]
                    [; path=][; secure][; httponly]
//  cookieManager.setCookie(url,cookie);

cookieManager.setCookie(cookie.getDomain(),  cookie.getName() + "=" + cookie.getValue() + "; domain=" + cookie.getDomain() + "; path=" + cookie.getPath());
CookieSyncManager.getInstance().sync();                 



71.
键盘事件 
switch (event.getAction()) { 
    case MotionEvent.ACTION_DOWN: 
    //按钮按下逻辑 
    breakcase MotionEvent.ACTION_UP: 
    //按钮弹起逻辑 
    break; 
} 



Fragment 里面没有此方法 
//  如果希望浏览的网页后退而不是退出浏览器,需要WebView覆盖URL加载,让它自动生成历史访问记录,那样就可以通过前进或后退访问已访问过的站点。
     @Override
        public boolean onKeyDown(int keyCode, KeyEvent event) {
            // TODO Auto-generated method stub
            if(keyCode==KeyEvent.KEYCODE_BACK)
            {
                if(webView.canGoBack())
                {
                    webView.goBack();//返回上一页面
                    return true;
                }
                else
                {
                    System.exit(0);//退出程序
                }
            }
            return super.onKeyDown(keyCode, event);
        }
72.
百度登陆url
https://passport.baidu.com/v2/?login&fr=old
登陆成功url
https://passport.baidu.com/center?_t=1442818676

73.
混合模式
更高级的做法是 
先通过流获取到整个网页,然后 loadUrl(); 通过java的replace("","");替换 需要登陆的字符串 


74.
Session捕获 技巧(通用版 )
Session什么时候失效?

  1. 服务器会把长时间没有活动的Session从服务器内存中清除,此时Session便失效。Tomcat中Session的默认失效时间为20分钟。

  2. 调用Session的invalidate方法。

public class Tab1 extends Fragment{
    private WebView webView;
    private String loginOKurl = "https://passport.baidu.com/center?_t=1442818676";
    private String cookieJsession;

    //JavaScript对象
     class WebObject {

        Context mcontext ;
        public WebObject(Context context){
            this.mcontext = context;  //这个Context 不是必须的,仅仅是我们Toast等控件需要用这个对象
        }

        @JavascriptInterface
        public void showSession(){
            //在android API Level 17及以上的版本中,就会出现js调用不了android的代码,这是版本兼容的问题

            CookieManager cookieManager = CookieManager.getInstance();
            cookieManager.setAcceptCookie(true);
            cookieJsession = cookieManager.getCookie(loginOKurl);  //登录成功url 
            Toast.makeText(getActivity(),"cookie是:"+cookieJsession, Toast.LENGTH_LONG).show();

        }

        @JavascriptInterface
        public void skip(){
            Intent intent = new Intent();
            intent.setClass(mcontext, SessionShareActivity.class);
            mcontext.startActivity(intent);

        }
     }



    class MyWebViewClient extends WebViewClient{

        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
//          view.loadUrl(url);
            WebObject webObject = new WebObject(getActivity());
            webObject.showSession();  //获取到Session后
            Intent intent = new Intent();
            intent.putExtra("Jsession", cookieJsession);
            intent.setClass(getActivity(), SessionShareActivity.class);
            startActivity(intent);
            return true;
        }

        //当load有ssl层的https页面时,如https://money.183.com.cn/,如果这个网站的安全证书在Android无法得到认证,WebView就会变成一个空白页
        //处理ssl请求(https,需要证书的请求)
        @Override
        public void onReceivedSslError(WebView view, SslErrorHandler handler,
                SslError error) {
            //handler.cancel(); 默认的处理方式,WebView变成空白页
             handler.proceed(); //接受证书
            //handleMessage(Message msg); 其他处理

        }


    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.tab1, container,false);
        webView = (WebView) view.findViewById(R.id.webView);
        webView.setWebViewClient(new MyWebViewClient());
        webView.getSettings().setJavaScriptEnabled(true);  //注意一定要设置这个哦,否则不会执行js

        //设置WebView的缩放功能点
       webView.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY);  
       webView.setHorizontalScrollBarEnabled(false);  //没有水平滚动条  
       webView.getSettings().setSupportZoom(true);  
       webView.getSettings().setBuiltInZoomControls(true); //缩放控制条  
       webView.setInitialScale(70);  
       webView.setHorizontalScrollbarOverlay(true);  


//         

//      String data = "<center><h1>欢迎登陆南工</h1><a href='http://61.163.231.194:8080/Lab2.0/'>实验系统</a></center>";
//      webView.loadDataWithBaseURL(null, data, "text/html", "utf-8", null);//      webView.loadData(data, "text/html", "UTF-8"); //这种方式是Android的bug 

        return view;


    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        webView.addJavascriptInterface(new WebObject(getActivity()), "ss");
//      webView.loadUrl("file:///android_asset/www/index.html");
        webView.loadUrl("https://passport.baidu.com/v2/?login&fr=old");
        super.onActivityCreated(savedInstanceState);
    }



}

75.

   ScrollView中只能放一个控件,一般都放LinearLayout,orientation属性值为vertica


76.

经常需要用ListView或者其它显示大量Items的控件实时跟踪或者查看信息,并且希望最新的条目可以自动滚动到可视范围内。通过设置控件transcriptMode属性可以将Android平台的控件(支持ScrollBar)自动滑动到最底部。 
源代码: 
ListView 默认是会滚动的,故 无需设置 

<ListView  android:id="@android:id/list"              
                  android:layout_width="fill_parent"               
                  android:layout_height="fill_parent"               
                  android:stackFromBottom="true"              
                  android:transcriptMode="alwaysScroll"               />

77.


一般来说在工作线程中执行耗时任务,当任务完成时,会返回UI线程,一般是更新UI。这时有两种方法可以达到目的。
一种是handler.sendMessage。发一个消息,再根据消息,执行相关任务代码。
另一种是handler.post(r)。r是要执行的任务代码。意思就是说r的代码实际是在UI线程执行的。可以写更新UI的代码。(工作线程是不能更新UI的)




78.

布局高级技术 

1.
View layout = getLayoutInflater().inflate(R.layout.menu_layout,null);
int width = getWindowManager().getDefaultDisplay().getWidth();
int height  = getWindowManager().getDefaultDisplay().getHeight();
PopupWindow popwindow = new PopupWindow(layout,width,height);
popwindow.showAtLocation(layout,Gravity.BOTTOM,0,0);  //显示 

popwindow.dismiss();//关闭选项菜单 


79.

ormlite没有hibernate智能,更新表字段 不会更新数据库字段,数据库的更新只会根据版本号改变才会重新调用那个方法

80.
根据class 属性得到节点 
HtmlElement resultData =  page.getBody();
List<HtmlElement> columns = resultData.getElementsByAttribute("tr", "class", "content");

//保存网页
//rootPage.save(new File("src"));

webClient.setAjaxController(new NicelyResynchronizingAjaxController());;//很重要,设置支持AJAX          

模拟按钮 执行JavaScript 设置可以使用jQuery          
StringBuilder js = new StringBuilder();
js.append("$('#u').value='").append(WeiboAccount.USERNAME).append("';");
js.append("$('#p').value='").append(WeiboAccount.PASSWORD).append("';");
js.append("document.write('Success')");
HtmlPage htmlPage = (HtmlPage) page;
ScriptResult scriptResult = htmlPage.executeJavaScript(js.toString());

HtmlPage downLoadPage = (HtmlPage) scriptResult.getNewPage();  

//点击Excel图标,开始下载  
        ScriptResult downLoadResult = downLoadPage.executeJavaScript("javascript:exportData('/ddp’,'BULKEXCEL');");  
        //下载Excel文件  
        InputStream is = downLoadResult.getNewPage().getWebResponse().getContentAsStream();  

        OutputStream fos = new FileOutputStream("d://test.xls");  
        byte[] buffer=new byte[1024*30];  
        int len=-1;  
        while((len=is.read(buffer))>0){  
            fos.write(buffer, 0, len);  
        }  
        fos.close();  
        fos.close();  
        System.out.println("Success!");  


81.

Httpunit 执行表单点击 

    WebClient webClient = new WebClient();
    HtmlPage page = webClient.getPage(url);
    HtmlForm form = page.getForms().get(2);
    HtmlSubmitInput button = form.getInputByValue(">");
    HtmlPage page2 = button.click();

    String originalHtml = page2.refresh().getWebResponse().getContentAsString();

Httpunit 执行Ajax请求 


82.alternative adj.  替代的; 另类的; 备选的; 其他的; n.  可供选择的事物;



//this would cause all ajax calls to be synchronous.
webClient.setAjaxController(new NicelyResynchronizingAjaxController());;//很重要,设置支持AJAX

//  Alternatively, did you try in your solution to call to "webClient.waitForBackgroundJavaScript(10000)" after tou got the page?
//Something like this:

HtmlPage page2 = button.click();
webClient.waitForBackgroundJavaScript(10000)
String originalHtml = page2.asXml();
return originalHtml;


例子1:


ScriptResult scriptResult = page.executeJavaScript("$('#cur a[txt=2]').click();");
HtmlPage htmlPage = (HtmlPage) scriptResult.getNewPage();
System.out.println(htmlPage.asText());

例子2:

版本1:
public class YoutubeBot {
private static final String YOUTUBE = "http://www.youtube.com";

public static void main(String[] args) throws FailingHttpStatusCodeException, MalformedURLException, IOException {
    WebClient webClient = new WebClient();
    webClient.setThrowExceptionOnScriptError(false);

    // This is equivalent to typing youtube.com to the adress bar of browser
    HtmlPage currentPage = webClient.getPage("http://www.youtube.com/results?search_type=videos&search_query=official+music+video&search_sort=video_date_uploaded&suggested_categories=10%2C24&uni=3");

    // Get form where submit button is located
    HtmlForm searchForm = (HtmlForm) currentPage.getElementById("masthead-search");

    // Get the input field.
    HtmlTextInput searchInput = (HtmlTextInput) currentPage.getElementById("masthead-search-term");
    // Insert the search term.
    searchInput.setText("java");

    // Workaround: create a 'fake' button and add it to the form.
    HtmlButton submitButton = (HtmlButton) currentPage.createElement("button");
    submitButton.setAttribute("type", "submit");
    searchForm.appendChild(submitButton);

    //Workaround: use the reference to the button to submit the form. 
    HtmlPage newPage = submitButton.click();

    //Find all links on page with given class
    final List<HtmlAnchor> listLinks = (List<HtmlAnchor>) currentPage.getByXPath("//a[@class='ux-thumb-wrap result-item-thumb']");      

    //Print all links to console
    for (int i=0; i<listLinks.size(); i++)
        System.out.println(YOUTUBE + listLinks.get(i).getAttribute("href"));

    }
}




    HtmlAnchor 控件用于控制 <a> 元素。在 HTML 中,<a> 元素用于创建超链接。超链接可链接到书签或其他网页

版本2:
public class YoutubeBot {
   private static final String YOUTUBE = "http://www.youtube.com";

   @SuppressWarnings("unchecked")
   public static void main(String[] args) throws FailingHttpStatusCodeException, MalformedURLException, IOException {
      WebClient webClient = new WebClient();
      webClient.setThrowExceptionOnScriptError(false);

      // This is equivalent to typing youtube.com to the adress bar of browser
      HtmlPage currentPage = webClient.getPage(YOUTUBE);

      // Get form where submit button is located
      HtmlForm searchForm = (HtmlForm) currentPage.getElementById("masthead-search");

      // Get the input field
      HtmlTextInput searchInput = (HtmlTextInput) currentPage.getElementById("masthead-search-term");

      // Insert the search term
      searchInput.setText("java");

      // Workaround: create a 'fake' button and add it to the form
      HtmlButton submitButton = (HtmlButton) currentPage.createElement("button");
      submitButton.setAttribute("type", "submit");
      searchForm.appendChild(submitButton);

      // Workaround: use the reference to the button to submit the form.
      currentPage = submitButton.click();

      // Get the div containing the filters
      HtmlElement filterDiv = currentPage.getElementById("search-lego-refinements");

      // Select the first link from the filter block (Upload date)
      HtmlAnchor sortByDateLink = ((List<HtmlAnchor>) filterDiv.getByXPath("//ul/li/a")).get(0);

      // Click the 'Upload date' link
      currentPage = sortByDateLink.click();

      System.out.println(currentPage.asText());
   }
}

//使用代理  
//      WebClient webClient=new WebClient(BrowserVersion.FIREFOX_10,"http://myproxyserver",8000);  
        WebClient webClient2=new WebClient(BrowserVersion.INTERNET_EXPLORER_10);  

注意:
       // 模拟浏览器打开一个目标网址  
        final HtmlPage page = webClient.getPage(url);  
//      该方法在getPage()方法之后调用才能生效  
        webClient.waitForBackgroundJavaScript(1000*3);  
        webClient.setJavaScriptTimeout(0);  

                <input class="logging" type="button" tabindex="5" value="登 录" accesskey="l">
        HtmlButtonInput btn  = loginForm.getInputByValue("登 录");//注意 登录中间有括号的情况  (注意这里写成HtmlSubmitInput就会报转换异常了)
        HtmlPasswordInput  password = loginForm.getInputByName("password");//不能写成 HtmlTextInput  
        这里类型 都是根据  <input type="submit" type="text" type="password"



一些技巧:
    (1) 等待js执行完毕 

        * 
            //try 20 times to wait .5 second each for filling the page.
            for (int i = 0; i < 20; i++) {
                if (condition_to_happen_after_js_execution) {
                    break;
                }
                synchronized (page) {
                    page.wait(500);
                }
            }

             */
    (2) 
    ScriptResult scriptResult = page.executeJavaScript("$('#cur a[txt=2]').click();");
    HtmlPage htmlPage = (HtmlPage) scriptResult.getNewPage();
    System.out.println(htmlPage.asText());  

    (3) 通过class元素得到 DOM对象 
        /*
             * 
            List<HtmlElement> columns = resultData.getElementsByAttribute("tr", "class", "content");
//          List<HtmlElement> ahref = resultData.getElementsByAttribute("a", "txt", "2");
            List<HtmlElement> ahref = resultData.getElementsByAttribute("a", "class", "j_th_tit");
//          HtmlPage page2 = ahref.get(0).click();
            for(HtmlElement element:ahref){
                System.out.println(element.asText());
            }

             */
    (4).
    HtmlPage currentPage = webClient.getPage("http://www.google.com/");
    HtmlImage imgElement = (HtmlImage)currentPage.getHtmlElementById("logo");
    System.out.println(imgElement.getAttribute("src"));
    (5).
    HttpUnit登录功能 

    HtmlInput username = page.getHtmlElementById("username");      //注意是 page.getHtmlElementById() 不是 page.getElementById();哦 
    HtmlInput password = page.getHtmlElementById("password");
    HtmlInput btn = page.getFirstByXPath(".//*[@id='vForm']/div[3]/ul/li[6]/div[2]/input");

    username.setAttribute("value", "wangli");
    password.setAttribute("value", "1234");

    HtmlPage result = btn.click();
    (6).        


例子:采集Demo 


public class Demo {


    public static void main(String[] args) {
        LogFactory.getFactory().setAttribute("org.apache.commons.logging.Log","org.apache.commons.logging.impl.NoOpLog");  
        java.util.logging.Logger.getLogger("net.sourceforge.htmlunit").setLevel(java.util.logging.Level.OFF);  

        try {
            WebClient webClient = new WebClient(BrowserVersion.CHROME);
            webClient.getOptions().setThrowExceptionOnScriptError(false);//当JS执行出错的时候是否抛出异常
            webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);  

            webClient.getOptions().setTimeout(30000);//设置“浏览器”的请求超时时间
            webClient.getOptions().setJavaScriptEnabled(true);
            webClient.getOptions().setCssEnabled(false);
            webClient.getCookieManager().setCookiesEnabled(true);
            webClient.waitForBackgroundJavaScript(30000);//设置JS后台等待执行时间

            //          this would cause all ajax calls to be synchronous.
            webClient.setAjaxController(new NicelyResynchronizingAjaxController());;//很重要,设置支持AJAX

            //去哪网
//          String url = "http://flight.qunar.com/site/oneway_list.htm?searchDepartureAirport=%E4%B8%8A%E6%B5%B7&searchArrivalAirport=%E9%87%8D%E5%BA%86&searchDepartureTime=2015-09-26&searchArrivalTime=2015-09-28&nextNDays=0&startSearch=true&ex_track=ap_20100201";
            String url = "http://xinjinqiao.tprtc.com/admin/main/flrpro.do#";
//          String url = "http://tieba.baidu.com/f?ie=utf-8&kw=java&fr=search";
            HtmlPage page = webClient.getPage(url);

            List hrefs = page.getByXPath("//span[@id=\"cur\"]/a");

//          HtmlAnchor pre = (HtmlAnchor) hrefs.get(0);   //上一页
//          HtmlAnchor next = (HtmlAnchor) hrefs.get(1);  //下一页

            int currentPage  = 1;
            print(page,currentPage);

        } catch (Exception e) {
            // TODO: handle exception
        }


    }


    public static void print(HtmlPage page,int flag){
        try {
            System.out.println("----------->第"+flag+"页");
            System.out.println(page.asText());

            HtmlAnchor href = page.getAnchorByText("下一页");
            page = href.click();   // 不断更改引用 

            if(flag == 2 ){
                return ;
            }
            flag ++;  //这个 和if判断一定要在自己调用自己之前执行哦

            print(page,flag); //调用自己



        } catch (Exception e) {
            e.printStackTrace();
        }
    }


}

HTMLUnit 和 HttpUnit 别弄混了 

经典语句:

HtmlAnchor submit = page.getFirstByXPath("//form[@id='user-login']/a[1]");  
HtmlInput login_name = (HtmlInput) page.getByXPath("//*[@id='loginName']").get(0);
HtmlInput login_pass = (HtmlInput) page.getByXPath("//*[@id='loginPass']").get(0);
HtmlInput loginInput = page.getHtmlElementById("loginName");
HtmlInput passwordInput = page.getHtmlElementById("loginPass"); 

例子:================================
            HtmlForm loginForm = htmlPage.getForms().get(0);

            HtmlTextInput  username = loginForm.getInputByName("username");
            HtmlPasswordInput  password = loginForm.getInputByName("password");
            HtmlSubmitInput btn  = loginForm.getInputByValue("登 录");//注意 登录中间有括号的情况

//          username.setValueAttribute("Working_Harder");
//          password.setValueAttribute("burning1223");
            username.setValueAttribute("wangli");
            password.setValueAttribute("wangli");

            HtmlPage result = btn.click();

            System.out.println(result.asText());
其他参数 HTMLUnit会替我们处理 



成功登陆百度云 的例子:

public class Baidu {

    public static void main(String[] args) {

//      LogFactory.getFactory().setAttribute("org.apache.commons.logging.Log","org.apache.commons.logging.impl.NoOpLog");  
//        java.util.logging.Logger.getLogger("net.sourceforge.htmlunit").setLevel(java.util.logging.Level.OFF);  
//        
        try {

            WebClient wc = new WebClient(BrowserVersion.FIREFOX_38);
            wc.getOptions().setJavaScriptEnabled(true);
            wc.getOptions().setCssEnabled(false);

            wc.getOptions().setThrowExceptionOnScriptError(false);
            wc.getOptions().setThrowExceptionOnFailingStatusCode(false);  
            wc.getCookieManager().setCookiesEnabled(true);
            wc.waitForBackgroundJavaScript(3000);//设置JS后台等待执行时间

            String url = "http://pan.baidu.com/";
            HtmlPage htmlPage = wc.getPage(url);
            wc.waitForBackgroundJavaScript(1000);  //这个放在 wc.getPage(url);后面


            HtmlForm loginForm = htmlPage.getForms().get(0);

            HtmlTextInput  username = loginForm.getInputByName("userName");
            HtmlPasswordInput  password = loginForm.getInputByName("password");
            HtmlSubmitInput btn  = loginForm.getInputByValue("登录");//注意 登录中间有括号的情况

            username.setValueAttribute("burning你的心3");
            password.setValueAttribute("454070wap.1223");

            HtmlPage result = btn.click();

            System.out.println(result.asText());



        } catch (Exception e) {
            e.printStackTrace();
        }

    }



}



83.

SpannableString spanStr = new SpannableString("欢迎使用我的博客下载器");
//各种span 类型         
ForegroundColorSpan span  = new ForegroundColorSpan(Color.BLUE);
//说明:  参数1,3 表示对 下标1~3(不包括3)应用样式 ,Spannable.SPAN_EXCLUSIVE_INCLUSIVE这个参数 指定,如果对已经应用了样式的 字符串,再输入(插入)Str,
//  原 字符串 的前面或后面是否应用样式 ------->

spanStr.setSpan(span, 1, 3, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
editText.setText(spanStr);

84.

    SpannableString spanStr = new SpannableString("欢迎使用我的博客下载器");

        ForegroundColorSpan span  = new ForegroundColorSpan(Color.BLUE); //字体颜色
        UnderlineSpan underlineSpan = new UnderlineSpan(); //下划线 
        StrikethroughSpan strikethroughSpan = new StrikethroughSpan();//删除线
        StyleSpan styleSpan = new StyleSpan(Typeface.BOLD_ITALIC); // StyleSpan(粗体和斜体 )
        BackgroundColorSpan backgroundColorSpan = new BackgroundColorSpan(Color.YELLOW); //背景色
        AbsoluteSizeSpan sizeSpan = new AbsoluteSizeSpan(16); //字体大小

        Drawable drawable = getResources().getDrawable(R.drawable.ic_launcher);
        drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());  //means to provide you with the default height or width of that drawable.
        ImageSpan imageSpan = new ImageSpan(drawable, ImageSpan.ALIGN_BASELINE);


        spanStr.setSpan(imageSpan, 1, 3, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
        editText.setText(spanStr);


85.

Android中visibility属性VISIBLE、INVISIBLE、GONE的区别

可见(visible)

XML文件:android:visibility="visible"

Java代码:view.setVisibility(View.VISIBLE);



不可见(invisible)

XML文件:android:visibility="invisible"

Java代码:view.setVisibility(View.INVISIBLE);



隐藏(GONE)

XML文件:android:visibility="gone"

Java代码:view.setVisibility(View.GONE);



VISIBLE:设置控件可见
INVISIBLE:设置控件不可见
GONE:设置控件隐藏



而INVISIBLE和GONE的主要区别是:

当控件visibility属性为INVISIBLE时,界面保留了view控件所占有的空间;

而控件属性为GONE时,界面则不保留view控件所占有的空间。     


86.
File file = File.createTempFile("capture",".jpg",new File("/sdcard"));
fos = new FileOutputStream(file);
bitmap.compress(Bitmap.CompressFormat.PNG,90,fos);
fos.flush();

87.
SlideMenu (android-support-v4.jar自带 )侧滑菜单,引用lib则需要 删除自带工程的  

88.  彻底删除mysql  
C:\program\
C:\Documents and Settings\All users\MySQL\MySQL Server 5.1\data\mysql


89. 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值