TabHost实现

TabHost实现

layout布局文件中的设置

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" 
android:orientation="vertical"
tools:context=".MainActivity" >
<Button
    android:id="@+id/button1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Button" />
 <TabHost
    android:id="@+id/tabhost"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >

        <TabWidget
            android:id="@android:id/tabs"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" >
        </TabWidget>

        <FrameLayout
            android:id="@android:id/tabcontent"
            android:layout_width="match_parent"
            android:layout_height="match_parent" >

            <!-- 第一个tab的布局 -->
            <LinearLayout
                android:id="@+id/tab1"
                android:layout_width="match_parent"
                android:layout_height="match_parent" >

                <TextView
                    android:id="@+id/textView1"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="林炳东" />

            </LinearLayout>

            <!-- 第二个tab的布局 -->
            <LinearLayout
                android:id="@+id/tab2"
                android:layout_width="match_parent"
                android:layout_height="match_parent" >

                <TextView
                    android:id="@+id/textView2"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="张小媛" />

            </LinearLayout>

            <!-- 第三个tab的布局 -->
            <LinearLayout
                android:id="@+id/tab3"
                android:layout_width="match_parent"
                android:layout_height="match_parent" >

                <TextView
                    android:id="@+id/textView3"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="马贝贝" />

            </LinearLayout>
        </FrameLayout>
    </LinearLayout>
</TabHost> 

</LinearLayout>

于此同时也要在Activiyt中设置

th= (TabHost) findViewById(R.id.tabHost);
  th.setup();//初始化TabHost容器  

   //在TabHost创建标签,然后设置:标题/图标/标签页布局 
  th.addTab(th.newTabSpec("tag1").setIndicator("主页",getResources().getDrawable(R.drawable.notification_template_icon_bg)).setContent(R.id.tab1));
  th.addTab(th.newTabSpec("tag2").setIndicator("历史",getResources().getDrawable(R.drawable.abc_ab_share_pack_mtrl_alpha)).setContent(R.id.tab2));
  th.addTab(th.newTabSpec("tag3").setIndicator("机器人",getResources().getDrawable(R.drawable.abc_ab_share_pack_mtrl_alpha)).setContent(R.id.tab3));
  th.addTab(th.newTabSpec("tag3").setIndicator("设置",getResources().getDrawable(R.drawable.abc_ab_share_pack_mtrl_alpha)).setContent(R.id.tab4));

从服务器得到所有图片信息,图片压缩代码

2015/7/26问题集

从服务器得到所有图片信息

servlet

package com.zsz.man;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.google.gson.Gson;
import com.zsz.develop.UserInfoBean;
import com.zsz.develop.UserinfoDao;
import com.zsz.main.ImageUtil;

/**
 * Servlet implementation class GetAllManServlet
 */
@WebServlet("/GetAllManServlet")
public class GetAllManServlet extends HttpServlet {
private static final long serialVersionUID = 1L;

/**
 * @see HttpServlet#HttpServlet()
 */
public GetAllManServlet() {
    super();
    // TODO Auto-generated constructor stub
}

/**
 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
 */
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // TODO Auto-generated method stub
}

/**
 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
 */
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {


    ServletContext context = getServletContext();
    String contentType = context.getInitParameter("contentType");
    String jsonAction = request.getParameter("action");
    int jsonImageSize =Integer.parseInt(request.getParameter("imageSize")); 
    String jsonName = request.getParameter("name");
    System.out.println("jsonName:"+jsonName);
    String outStr = "";
    Gson gson = new Gson();
    ManDao manDao=new ManDaoImpl();


    if (jsonAction.equals("getAll")) {
        List<ManBean> manList=manDao.getAllMan(jsonName);;
        // 將所有照片縮小
        for (int i = 0; i < manList.size(); i++) {
            ManBean manBean = manList.get(i);
            manBean.setImage(ImageUtil.shrink(manBean.getImage(), jsonImageSize));
        }
        outStr = gson.toJson(manList);
    }

    response.setContentType(contentType);
    PrintWriter out = response.getWriter();
    System.out.println(outStr);
    out.print(outStr);
    out.close();

    }

}

重点在这一段:

  • 判断功能选项
  • 取得实体类集合
  • 循环取出每张图片、并对他进行压缩
  • 把压缩后的数据传递给实体类,并转为json格式输出

    if (jsonAction.equals(“getAll”)) {

        List<ManBean> manList=manDao.getAllMan(jsonName);;
        // 將所有照片縮小
        for (int i = 0; i < manList.size(); i++) {
            ManBean manBean = manList.get(i);
            manBean.setImage(ImageUtil.shrink(manBean.getImage(), jsonImageSize));
        }
        outStr = gson.toJson(manList);
    }
    

    图片压缩代码

调用方法:manBean.setImage(ImageUtil.shrink(manBean.getImage(), jsonImageSize));

package com.zsz.main;

import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;

import javax.imageio.ImageIO;

public class ImageUtil {

/**
 * 將圖形縮小後回傳,如果發生錯誤就直接回傳原圖, 例如:imageSize值<=1、無法取得圖的寬高、發生Exception
 * 
 * @param srcImageData
 *            來源圖形資料
 * @param scaleSize
 *            欲將圖形縮至多少尺寸以下,50代表將尺寸縮小至50x50以內
 * @return 縮小完畢的圖形資料
 */
public static byte[] shrink(byte[] srcImageData, int scaleSize) {
    ByteArrayInputStream bais = new ByteArrayInputStream(srcImageData);
    // 縮小比例,4代表除以4
    int sampleSize = 1;
    int imageWidth = 0;
    int imageHeight = 0;

    // 如果imageSize為0、負數(代表錯誤)或1(1代表與原圖一樣大小),就直接回傳原圖資料
    if (scaleSize <= 1) {
        return srcImageData;
    }

    try {
        BufferedImage srcBufferedImage = ImageIO.read(bais);
        // 如果無法識別圖檔格式(TYPE_CUSTOM)就回傳TYPE_INT_ARGB;否則回傳既有格式
        int type = srcBufferedImage.getType() == BufferedImage.TYPE_CUSTOM ? BufferedImage.TYPE_INT_RGB
                : srcBufferedImage.getType();
        imageWidth = srcBufferedImage.getWidth();
        imageHeight = srcBufferedImage.getHeight();
        if (imageWidth == 0 || imageHeight == 0) {
            return srcImageData;
        }
        // 只要圖檔較長的一邊超過指定長度(desireSize),就計算欲縮小的比例
        // 並將圖檔寬高都除以欲縮小比例
        int longer = Math.max(imageWidth, imageHeight);
        if (longer > scaleSize) {
            sampleSize = longer / scaleSize;
            imageWidth = srcBufferedImage.getWidth() / sampleSize;
            imageHeight = srcBufferedImage.getHeight() / sampleSize;
        }
        BufferedImage scaledBufferedImage = new BufferedImage(imageWidth,
                imageHeight, type);
        Graphics graphics = scaledBufferedImage.createGraphics();
        graphics.drawImage(srcBufferedImage, 0, 0, imageWidth, imageHeight,
                null);
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ImageIO.write(scaledBufferedImage, "jpg", baos);
        return baos.toByteArray();
    } catch (IOException e) {
        e.printStackTrace();
        return srcImageData;
    }
}
}

servlet与404错误,清空Tomcat缓存

2015/7/25

被两个非代码错误折腾了一天!!!奔溃

servlet与404错误

servlet在tomcat8之后无需自己配置信息。
404错误是因为servlet没有找到控制的页面显示!!

。。。。。。。。一上午!

清空Tomcat缓存

因为没有清空缓存,以至于一直显示错误的信息。明明已经没有代码在里面了。关闭eclipse也没用

点击eclipse菜单栏中的project-选择clean

2015/7/23-URI-Intent

通过URI和Intent启动各种功能

Uri

就Android平台而言,URI主要分三个部分:scheme, authority and path。其中authority又分为host和port。格式如下:
scheme://host:port/path
举个实际的例子:

现在大家应该知道data flag中那些属性的含义了吧,看下data flag

但是我们在程序中一般是不直接用URI来标识CP的,是的,正如我们通常见到的用定义的常量来标识。例如standard CP中的Contacts,我们就用Contacts.People.CONTENT_URI来标识Contacts CP中People这个表。那么要标识某个具体的人怎么办呢? 这就用到了ContentUris.withAppendedId() 和 Uri.withAppendedPath()。例如我们要表示content://contacts/people/20,那么我们就可以用如下语句:
Uri uri = ContentUris.withAppendedId(People.CONTENT_URI, 20); 或者
Uri uri = Uri.withAppendedPath(People.CONTENT_URI, “20”);

举些例子,如:

所有联系人的Uri: content://contacts/people

某个联系人的Uri: content://contacts/people/5

所有图片Uri: content://media/external

某个图片的Uri:content://media/external/images/media/4

下面是一些常用的Uri

显示网页:

  1. Uri uri = Uri.parse(“http://www.google.com“);
  2. Intent it = new Intent(Intent.ACTION_VIEW,uri);
  3. startActivity(it);

显示地图:

  1. Uri uri = Uri.parse(“geo:38.899533,-77.036476”);
    1. Intent it = new Intent(Intent.Action_VIEW,uri);
    2. startActivity(it);

路径规划:

  1. Uri uri = Uri.parse(“http://maps.google.com/maps?f=d&saddr=startLat%20startLng&daddr=endLat%20endLng&hl=en“);
  2. Intent it = new Intent(Intent.ACTION_VIEW,URI);
  3. startActivity(it);

拨打电话:
调用拨号程序

  1. Uri uri = Uri.parse(“tel:xxxxxx”);
  2. Intent it = new Intent(Intent.ACTION_DIAL, uri);
  3. startActivity(it);
  4. Uri uri = Uri.parse(“tel.xxxxxx”);
  5. Intent it =new Intent(Intent.ACTION_CALL,uri);
  6. 要使用这个必须在配置文件中加入

发送SMS/MMS
调用发送短信的程序

  1. Intent it = new Intent(Intent.ACTION_VIEW);
  2. it.putExtra(“sms_body”, “The SMS text”);
  3. it.setType(“vnd.android-dir/mms-sms”);
  4. startActivity(it);

发送短信

  1. Uri uri = Uri.parse(“smsto:0800000123”);
  2. Intent it = new Intent(Intent.ACTION_SENDTO, uri);
  3. it.putExtra(“sms_body”, “The SMS text”);
  4. startActivity(it);

发送彩信

  1. Uri uri = Uri.parse(“content://media/external/images/media/23”);
  2. Intent it = new Intent(Intent.ACTION_SEND);
  3. it.putExtra(“sms_body”, “some text”);
  4. it.putExtra(Intent.EXTRA_STREAM, uri);
  5. it.setType(“image/png”);
  6. startActivity(it);


发送Email

1.

  1. Uri uri = Uri.parse(“mailto:xxx@abc.com”);
  2. Intent it = new Intent(Intent.ACTION_SENDTO, uri);
  3. startActivity(it);
  4. Intent it = new Intent(Intent.ACTION_SEND);
  5. it.putExtra(Intent.EXTRA_EMAIL, “me@abc.com”);
  6. it.putExtra(Intent.EXTRA_TEXT, “The email body text”);
  7. it.setType(“text/plain”);
  8. startActivity(Intent.createChooser(it, “Choose Email Client”));
  9. Intent it=new Intent(Intent.ACTION_SEND);
  10. String[] tos={“me@abc.com”};
  11. String[] ccs={“you@abc.com”};
  12. it.putExtra(Intent.EXTRA_EMAIL, tos);
  13. it.putExtra(Intent.EXTRA_CC, ccs);
  14. it.putExtra(Intent.EXTRA_TEXT, “The email body text”);
  15. it.putExtra(Intent.EXTRA_SUBJECT, “The email subject text”);
  16. it.setType(“message/rfc822”);
  17. startActivity(Intent.createChooser(it, “Choose Email Client”));

添加附件

  1. Intent it = new Intent(Intent.ACTION_SEND);
  2. it.putExtra(Intent.EXTRA_SUBJECT, “The email subject text”);
  3. it.putExtra(Intent.EXTRA_STREAM, “[url=]file:///sdcard/mysong.mp3[/url]”);
  4. sendIntent.setType(“audio/mp3”);
  5. startActivity(Intent.createChooser(it, “Choose Email Client”));

播放多媒体

  1. Intent it = new Intent(Intent.ACTION_VIEW);
  2. Uri uri = Uri.parse(“[url=]file:///sdcard/song.mp3[/url]”);
  3. it.setDataAndType(uri, “audio/mp3”);
  4. startActivity(it);
  5. Uri uri = Uri.withAppendedPath(MediaStore.Audio.Media.INTERNAL_CONTENT_URI, “1”);
  6. Intent it = new Intent(Intent.ACTION_VIEW, uri);
  7. startActivity(it);

Uninstall 程序

  1. Uri uri = Uri.fromParts(“package”, strPackageName, null);
  2. Intent it = new Intent(Intent.ACTION_DELETE, uri);
  3. startActivity(it);

//调用相册

public static final String MIME_TYPE_IMAGE_JPEG = “image/*”;
public static final int ACTIVITY_GET_IMAGE = 0;
Intent getImage = new Intent(Intent.ACTION_GET_CONTENT);
getImage.addCategory(Intent.CATEGORY_OPENABLE);
getImage.setType(MIME_TYPE_IMAGE_JPEG);
startActivityForResult(getImage, ACTIVITY_GET_IMAGE);

//调用系统相机应用程序,并存储拍下来的照片

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
time = Calendar.getInstance().getTimeInMillis();
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(Environment
.getExternalStorageDirectory().getAbsolutePath()+”/tucue”, time + “.jpg”)));
startActivityForResult(intent, ACTIVITY_GET_CAMERA_IMAGE);

uninstall apk

未测试

Uri uninstallUri = Uri.fromParts(“package”, “xxx”, null);
returnIt = new Intent(Intent.ACTION_DELETE, uninstallUri);
*/
Uri packageURI = Uri.parse(“package:”+wistatmap);
Intent uninstallIntent = new Intent(Intent.ACTION_DELETE, packageURI);
startActivity(uninstallIntent);

install apk
Uri installUri = Uri.fromParts(“package”, “xxx”, null);
returnIt = new Intent(Intent.ACTION_PACKAGE_ADDED, installUri);
play audio
Uri playUri = Uri.parse(“[url=]file:///sdcard/download/everything.mp3[/url]”);
returnIt = new Intent(Intent.ACTION_VIEW, playUri);

//发送附件

Intent it = new Intent(Intent.ACTION_SEND);
it.putExtra(Intent.EXTRA_SUBJECT, “The email subject text”);
it.putExtra(Intent.EXTRA_STREAM, “[url=]file:///sdcard/eoe.mp3[/url]”);
sendIntent.setType(“audio/mp3”);
startActivity(Intent.createChooser(it, “Choose Email Client”));

//搜索应用

Uri uri = Uri.parse(“market://search?q=pname:pkg_name”);
Intent it = new Intent(Intent.ACTION_VIEW, uri);
startActivity(it);
//where pkg_name is the full package path for an application

进入联系人页面

Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setData(People.CONTENT_URI);
startActivity(intent);

查看指定联系人

Uri personUri = ContentUris.withAppendedId(People.CONTENT_URI, info.id);//info.id联系人ID
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setData(personUri);
startActivity(intent);

注销,TaskStack,affinity

7.23日问题集

Android注销流程

当我们点击注销按钮之后,一般都会重新返回登陆界面,这时候我们再按返回键是没有用的。这时候其实我们是将Android 的TaskStack清空。

这里要设置Intent的FLAG,在执行完成Activity跳转的时候会清空TaskStack,并且将创建一个新的TaskStack

注销

Intent logoutIntent = new Intent(ctx, LoginActivity.class);
                logoutIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
                startActivity(logoutIntent);

什么是Activity Stack?

  Activity承担了大量的显示和交互工作,从某种角度上将,我们看见的应用程序就是许多个Activity的组合。为了让这许多 Activity协同工作而不至于产生混乱,Android平台设计了一种堆栈机制用于管理Activity,其遵循先进后出的原则,系统总是显示位于栈 顶的Activity,从逻辑上将,位于栈顶的Activity也就是最后打开的Activity,这也是符合逻辑的。

  在操作应用程序时,每次启动新的Activity,都会将此压入Activity Stack,当用户执行返回操作时,移除Activity Stack顶上的Activity,这样就实现了返回上一个Activty的功能。直到用户一直返回到Home Screen,这时候可以理解为移除了Activity Stack所有的Activity,这个Activity Stack不再存在,应用程序也结束了运行。

什么是Task?

  Task是指将相关的Activity组合到一起,以Activity Stack的方式进行管理。从用户体验上讲,一个“应用程序”就是一个Task,但是从根本上讲,一个Task是可以有一个或多个Android Application组成的。例如:你想在发送短信时,拍一张照并作为彩信发出去,这时你首先停留在短信应用程序的的Acitivity上,然后跳转到 Camera应用程序的Activity上,当完成拍照功能后,再返回到短信应用程序的Activity。这实际上是两个Android Application协同合作后完成的工作,但为了更好的用户体验,Android平台加入了Task这么一种机制,让用户没有感觉到应用的中断,让用 户感觉在一“应用程序”里就完成了想完成的工作。

Activity的affinity(亲和力)

task对于Activity来说就好像它的身份证一样,可以告诉所在的task,自己属于这个task中的一员;拥有相同affinity的多个Activity理论同属于一个task,task自身的affinity决定于根Activity的affinity值。affinity在什么场合应用呢?1.根据affinity重新为Activity选择宿主task(与allowTaskReparenting属性配合工作);2.启动一个Activity过程中Intent使用了FLAG_ACTIVITY_NEW_TASK标记,根据affinity查找或创建一个新的具有对应affinity的task。我们会在后面进行详细讲解。

默认情况下,一个应用内的所有Activity都具有相同的affinity,都是从Application(参考的taskAffinity属性)继承而来,而Application默认的affinity是中的包名,我们可以为设置taskAffinity属性值,这样可以应用到下的所有,也可以单独为某个Activity设置taskAffinity。

Intent几种常见的flags:

FLAG_ACTIVITY_CLEAR_TASK

FLAG_ACTIVITY_CLEAR_TASK :如果在调用Context.startActivity时传递这个标记,将会导致任何用来放置该activity的已经存在的task里面的已经存在的activity先清空,然后该activity再在该task中启动,也就是说,这个新启动的activity变为了这个空tas的根activity.所有老的activity都结束掉。该标志必须和FLAG_ACTIVITY_NEW_TASK一起使用。

.FLAG_ACTIVITY_CLEAR_TOP

当Intent对象包含这个标记时,如果在栈中发现存在Activity实例,则清空这个实例之上的Activity,使其处于栈顶。例如:我们的FirstActivity跳转到SecondActivity,SecondActivity跳转到ThirdActivity,而ThirdActivity又跳到SecondActivity,那么ThirdActivity实例将被弹出栈,使SecondActivity处于栈顶,显示到幕前,栈内只剩下FirstActivity和SecondActivity。这个SecondActivity既可以在onNewIntent()中接收到传来的Intent,也可以把自己销毁之后重新启动来接受这个Intent。在使用默认的“standard”启动模式下,如果没有在Intent使用到FLAG_ACTIVITY_SINGLE_TOP标记,那么它将关闭后重建,如果使用了这个FLAG_ACTIVITY_SINGLE_TOP标记,则会使用已存在的实例;对于其他启动模式,无需再使用FLAG_ACTIVITY_SINGLE_TOP,它都将使用已存在的实例,Intent会被传递到这个实例的onNewIntent()中。

FLAG_ACTIVITY_SINGLE_TOP

当task中存在目标Activity实例并且位于栈的顶端时,不再创建一个新的,直接利用这个实例。我们在上边的例子中也有讲到。

FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET

如果一个Intent中包含此属性,则它转向的那个Activity以及在那个Activity其上的所有Activity都会在task重置时被清除出task。当我们将一个后台的task重新回到前台时,系统会在特定情况下为这个动作附带一个FLAG_ACTIVITY_RESET_TASK_IF_NEEDED标记,意味着必要时重置task,这时FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET就会生效。经过测试发现,对于一个处于后台的应用,如果在主选单点击应用,这个动作中含有FLAG_ACTIVITY_RESET_TASK_IF_NEEDED标记,长按Home键,然后点击最近记录,这个动作不含FLAG_ACTIVITY_RESET_TASK_IF_NEEDED标记,所以前者会清除,后者不会

FLAG_ACTIVITY_RESET_TASK_IF_NEEDED

这个标记在以下情况下会生效:1.启动Activity时创建新的task来放置Activity实例;2.已存在的task被放置于前台。系统会根据affinity对指定的task进行重置操作,task会压入某些Activity实例或移除某些Activity实例。我们结合上面的CLEAR_WHEN_TASK_RESET可以加深理解。

putExtra(),Intent的构造函数,startActivityForResult的用法,onActivityResult

2015/7/22问题集

intent.putExtra()传值

putExtra(“A”,B)中,AB为键值对,第一个参数为键名,第二个参数为键对应的值。顺便提一下,如果想取出Intent对象中的这些值,需要在你的另一个Activity中用getXXXXXExtra方法,注意需要使用对应类型的方法,参数为键名

第一个Activity,通过intent.putExtra(“key”,”value”);传给另一个Activity

btnIntent.setOnClickListener(new OnClickListener() {
       @Override
       public void onClick(View view) {
           Intent intent=new Intent(MainActivity.this,ToIntentActicity.class);
           //将要传递的值附加到Intent对象
           intent.putExtra("Main","66666");
           startActivity(intent);
       }
   });

另一个页面接收数据

tv= (TextView) findViewById(R.id.tv);
  //取得启动该Activity的Intent对象
  Intent intent=getIntent();
   /*取出Intent中附加的数据*/
  String str=intent.getStringExtra("Main");
  tv.setText("从其他Intent传过来的值"+str);

Intent.putExtra()传递Object对象或者ArrayList

Intent传递基本类型相信大家都十分熟悉,如何传递Object对象或者ArrayList对象呢?

可以通过:

(1)public Intent putExtra (String name, Serializable value)

(2)public Intent putExtra (String name, Parcelable value)

public Intent putParcelableArrayListExtra(String name, ArrayList<? extends Parcelable> value)

一、通过实现Serializable接口传递

实体类继承Serializable。然后

通过Intent来进行传输,具体方法是:public Intent putExtra (String name, Serializable value)

Intent ToManChartIntent=new Intent();

         ToManChartIntent.putExtra("toManChartIntent",mans);
         getContext().startActivity(ToManChartIntent);

二、通过实现Parcelable接口传递

同上,Person类实现Parcelable接口即可:

传递Object用:public Intent putExtra (String name, Parcelable value)
传递ArrayList用:public Intent putParcelableArrayListExtra(String name, ArrayList<? extends Parcelable> value)

Intent的构造函数

公共构造函数:

  • 1、Intent() 空构造函数

  • 2、Intent(Intent o) 拷贝构造函数

  • 3、Intent(String action) 指定action类型的构造函数

  • 4、Intent(String action, Uri uri) 指定Action类型和Uri的构造函数,URI主要是结合程序之间的数据共享ContentProvider

  • 5、Intent(Context packageContext, Class<?> cls) 传入组件的构造函数,也就是上文提到的

  • 6、Intent(String action, Uri uri, Context packageContext, Class<?> cls) 前两种结合体

Intent有六种构造函数,3、4、5是最常用的,并不是其他没用!

startActivityForResult的用法:

  • 1、startActivity( )
    仅仅是跳转到目标页面,若是想跳回当前页面,则必须再使用一次startActivity( )。

  • 2、startActivityForResult( )
    可以一次性完成这项任务,当程序执行到这段代码的时候,假若从T1Activity跳转到下一个Text2Activity,而当这个Text2Activity调用了finish()方法以后,程序会自动跳转回T1Activity,并调用前一个T1Activity中的onActivityResult( )方法。

如果想在Activity中得到新打开Activity 关闭后返回的数据,需要使用系统提供的startActivityForResult(Intent intent, int requestCode)方法打开新的Activity,新的Activity 关闭后会向前面的Activity传回数据,为了得到传回的数据,必须在前面的Activity中重写onActivityResult(int requestCode, int resultCode, Intent data)方法。

//这里采用startActivityForResult来做跳转,此处的0为一个依据,可以写其他的值,但一定要>=0

startActivityForResult(intent, 0);

onActivityResult传值的使用

多个activity之间的传值 其实就是onActivityResult,然后别忘了还有一个action的问题 就是在主xml中添加自己的action以便于识别,最后次activity别忘了finansh。

针对startActivityForResult实例代码

package com.ljq.activitys;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

public class MainActivity extends Activity {
private final static String TAG="MainActivity";

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    Button btnOpen=(Button)this.findViewById(R.id.btnOpen);
    btnOpen.setOnClickListener(new View.OnClickListener(){
        public void onClick(View v) {
            //得到新打开Activity关闭后返回的数据
            //第二个参数为请求码,可以根据业务需求自己编号
            startActivityForResult(new Intent(MainActivity.this, OtherActivity.class), 1);
        }
    });
}

/**
 * 为了得到传回的数据,必须在前面的Activity中(指MainActivity类)重写onActivityResult方法
 * 
 * requestCode 请求码,即调用startActivityForResult()传递过去的值
 * resultCode 结果码,结果码用于标识返回数据来自哪个新Activity
 */
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    String result = data.getExtras().getString("result");//得到新Activity 关闭后返回的数据
    Log.i(TAG, result);
}
}

当新Activity关闭后,新Activity返回的数据通过Intent进行传递,android平台会调用前面Activity 的onActivityResult()方法,把存放了返回数据的Intent作为第三个输入参数传入,在onActivityResult()方法中使用第三个输入参数可以取出新Activity返回的数据。

二、使用startActivityForResult(Intent intent, int requestCode)方法打开新的Activity,新Activity关闭前需要向前面的Activity返回数据需要使用系统提供的setResult(int resultCode, Intent data)方法实现:

package com.ljq.activitys;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class OtherActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.other);

    Button btnClose=(Button)findViewById(R.id.btnClose);
    btnClose.setOnClickListener(new View.OnClickListener(){
        public void onClick(View v) {
            //数据是使用Intent返回
            Intent intent = new Intent();
            //把返回数据存入Intent
            intent.putExtra("result", "My name is linjiqin");
            //设置返回数据
            OtherActivity.this.setResult(RESULT_OK, intent);
            //关闭Activity
            OtherActivity.this.finish();
        }
    });

}

}

setResult()方法的第一个参数值可以根据业务需要自己定义,上面代码中使用到的RESULT_OK是系统Activity类定义的一个常量,值为-1,代码片断如下:
public class android.app.Activity extends ……{
public static final int RESULT_CANCELED = 0;
public static final int RESULT_OK = -1;
public static final int RESULT_FIRST_USER = 1;
}

请求码的作用

使用startActivityForResult(Intent intent, int requestCode)方法打开新的Activity,我们需要为startActivityForResult()方法传入一个请求码(第二个参数)。请求码的值是根据业务需要由自已设定,用于标识请求来源。例如:一个Activity有两个按钮,点击这两个按钮都会打开同一个Activity,不管是那个按钮打开新Activity,当这个新Activity关闭后,系统都会调用前面Activity的onActivityResult(int requestCode, int resultCode, Intent data)方法。在onActivityResult()方法如果需要知道新Activity是由那个按钮打开的,并且要做出相应的业务处理,这时可以这样做:

 @Override  public void onCreate(Bundle savedInstanceState) {
        ....
    button1.setOnClickListener(new View.OnClickListener(){
        public void onClick(View v) {
            startActivityForResult (new Intent(MainActivity.this, NewActivity.class), 1);

       }

    });
    button2.setOnClickListener(new View.OnClickListener(){
        public void onClick(View v) {
             startActivityForResult (new Intent(MainActivity.this, NewActivity.class), 2);

        }

    });


   @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) {
           switch(requestCode){
               case 1:
               //来自按钮1的请求,作相应业务处理
               case 2:
               //来自按钮2的请求,作相应业务处理
            }
      }
}

结果码的作用

在一个Activity中,可能会使用startActivityForResult()方法打开多个不同的Activity处理不同的业务,当这些新Activity关闭后,系统都会调用前面Activity的onActivityResult(int requestCode, int resultCode, Intent data)方法。为了知道返回的数据来自于哪个新Activity,在onActivityResult()方法中可以这样做(ResultActivity和NewActivity为要打开的新Activity):
public class ResultActivity extends Activity {
…..
ResultActivity.this.setResult(1, intent);
ResultActivity.this.finish();
}
public class NewActivity extends Activity {
……
NewActivity.this.setResult(2, intent);
NewActivity.this.finish();
}
public class MainActivity extends Activity { // 在该Activity会打开ResultActivity和NewActivity
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch(resultCode){
case 1:
// ResultActivity的返回数据
case 2:
// NewActivity的返回数据
}
}
}

URIs, URLs, and URNs之间的关系区别,Android拍照功能

2015/7/21问题集

URIs, URLs, and URNs之间的关系区别

  • URI:是uniform resource identifier,统一资源标识符,用来唯一的标识一个资源。
  • URL:是uniform resource locator,统一资源定位器,它是一种具体的URI,即URL可以用来标识一个资源,而且还指明了如何locate这个资源。
  • URN:uniform resource name,统一资源命名,是通过名字来标识资源,比如mailto:java-net@java.sun.com。

也就是说,URI是以一种抽象的,高层次概念定义统一资源标识,而URL和URN则是具体的资源标识的方式。URL和URN都是一种URI。

Android拍照功能

package com.zsz.develop.picturedemo;

    import java.io.BufferedOutputStream;
    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.util.Calendar;
    import java.util.Locale;

    import android.app.Activity;
    import android.content.Intent;
    import android.graphics.Bitmap;
    import android.os.Bundle;
    import android.os.Environment;
    import android.provider.MediaStore;
    import android.text.format.DateFormat;
    import android.util.Log;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.ImageView;
    import android.widget.Toast;

public class MainActivity extends Activity {
/** Called when the activity is first created. */
private Button button;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    button = (Button) findViewById(R.id.btnPicture);
    button.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

            startActivityForResult(intent, 1);
        }
    });
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // TODO Auto-generated method stub
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == Activity.RESULT_OK) {
        String sdStatus = Environment.getExternalStorageState();
        if (!sdStatus.equals(Environment.MEDIA_MOUNTED)) { // 检测sd是否可用
            Log.i("TestFile",
                    "SD card is not avaiable/writeable right now.");
            return;
        }
        String name = new DateFormat().format("yyyyMMdd_hhmmss",Calendar.getInstance(Locale.CHINA)) + ".jpg";
        Toast.makeText(this, name, Toast.LENGTH_LONG).show();
        Bundle bundle = data.getExtras();
        Bitmap bitmap = (Bitmap) bundle.get("data");// 获取相机返回的数据,并转换为Bitmap图片格式

        FileOutputStream b = null;
        //???????????????????????????????为什么不能直接保存在系统相册位置呢????????????
        File file = new File("/sdcard/myImage/");
        file.mkdirs();// 创建文件夹
        String fileName = "/sdcard/myImage/"+name;

        try {
            b = new FileOutputStream(fileName);
            bitmap.compress(Bitmap.CompressFormat.JPEG, 100, b);// 把数据写入文件
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } finally {
            try {
                b.flush();
                b.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        ((ImageView) findViewById(R.id.imageView)).setImageBitmap(bitmap);// 将图片显示在ImageView里
    }
}
}

字节流如何转换为字符流,去除文件中的空格和回车,LayoutInflater加载布局,新建http连接

2015/7/20 问题集

字节流如何转换为字符流

FileInputStream fis = new FileInputStream("c:/abc.txt");// 字节流
 InputStreamReader isr = new InputStreamReader(fis);// 字符流
 BufferedReader br = new BufferedReader(isr);// 缓冲流
 String str = null;
 if ((str = br.readLine()) != null) {
  System.out.println(str);
 }
 br.close();
 isr.close();
 fis.close();
}

去除文件中的空格和回车

  content_str=etSend.getText().toString();
//去除空格
    String drop=content_str.replace(" ","");
//    去除回车
    String droph=drop.replace("\n","");

LayoutInflater加载布局

findViewById加载控件,LayoutInflater加载布局

LayoutInflater layoutInflater=LayoutInflater.from(context);

     layout= (RelativeLayout) layoutInflater.inflate(R.layout.left_item,null);

新建http连接

protected String doInBackground(String... strings) {

 try {
     client=new DefaultHttpClient();
     httpGet=new HttpGet(url);
    httpResponse= client.execute(httpGet);
    entity= httpResponse.getEntity();
     InputStream is=entity.getContent();
     InputStreamReader isr=new InputStreamReader(is);
     BufferedReader br=new BufferedReader(isr);
     String line;
     StringBuffer sb=new StringBuffer();
     while ((line=br.readLine())!=null){
         sb.append(line);
     }
     return sb.toString();
 } catch (IOException e) {
     e.printStackTrace();
 }

adapter

Adapter

Adapter的概念

Adapter是连接后端数据和前端显示的适配器接口,是数据和UI(View)之间一个重要的纽带。在常见的View(List View,Grid View)等地方都需要用到Adapter。如下图直观的表达了Data、Adapter、View三者的关系:

常用Adapter

  • BaseAdapter是一个抽象类,继承它需要实现较多的方法,所以也就具有较高的灵活性;
  • ArrayAdapter支持泛型操作,最为简单,只能展示一行字。
  • SimpleAdapter有最好的扩充性,可以自定义出各种效果。
  • SimpleCursorAdapter可以适用于简单的纯文字型ListView,它需要Cursor的字段和UI的id对应起来。如需要实现更复杂的UI也可以重写其他方法。可以认为是SimpleAdapter对数据库的简单结合,可以方便地把数据库的内容以列表的形式展示出来。

ArrayAdapter的操作

ArrayAdapter的操作很简单,构建一个ArrayAdapter()实例。其中要传入三个参数。

依次为this,布局文件(注意这里的布局文件描述的是列表的每一行的布局,android.R.layout.simple_list_item_1是系统定义好的布局文件只显示一行文字,数据源(一个List集合)。

最后绑定显示。

package com.zsz.develop.adaptertest;

import android.app.ListActivity;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Adapter;
import android.widget.ArrayAdapter;
import android.widget.ListView;

import java.util.ArrayList;


public class MainActivity extends ActionBarActivity {

private ListView lv;
private ArrayList<String> mArrayList = new ArrayList<String>();
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    ArrayAdapter<String> adapter=new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,getData());
    lv= (ListView) findViewById(R.id.lv);
    lv.setAdapter(adapter);

}
private ArrayList<String> getData(){

    mArrayList.add("测试一");
    mArrayList.add("测试二");
    mArrayList.add("测试三");
    mArrayList.add("测试死");
    return mArrayList;

}



}

java与Mysql类型对应

TTDB2N

ListView设置,相对位置,inflater 用法

7.18日问题集

ListView 可滚动与间隔设置

1.可滚动设置:transcriptMode
2.间隔设置:divider

<ListView
    android:layout_width="fill_parent"
    android:layout_height="0dp"
    android:layout_weight="1"
    android:transcriptMode="alwaysScroll"
    android:divider="@null"
    ></ListView>

图片设置内边距padding

图片对其方式:layout_alignParentRight

<ImageView
     android:layout_alignParentRight="true"
    android:layout_width="70dp"
    android:layout_height="70dp"
    android:padding="10dp"
    android:id="@+id/iv"
    android:src="@drawable/robot"
    />

设置相对位置

如设置textview的右边:layout_toRightOf
设置与有边框的距离:android:layout_marginRight=”50dp”
设置在谁的下面:android:layout_below=”@+id/time”

<TextView
    android:layout_below="@+id/time"
    android:layout_marginRight="50dp"
    android:layout_toRightOf="@+id/iv"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/tv"
    android:background="@drawable/aio_friend_bg_nor_11"
    android:gravity="center"
    />

android inflater 用法

在实际开发中LayoutInflater这个类还是非常有用的,它的作用类似于findViewById()。不同点是LayoutInflater是用来找res/layout/下的xml布局文件,并且实例化;而findViewById()是找xml布局文件下的具体widget控件(如Button、TextView等)。 具体作用: 1、对于一个没有被载入或者想要动态载入的界面,都需要使用LayoutInflater.inflate()来载入;

2、对于一个已经载入的界面,就可以使用Activiyt.findViewById()方法来获得其中的界面元素。

LayoutInflater 是一个抽象类,在文档中如下声明:

publicabstractclass LayoutInflater extends Object

获得 LayoutInflater 实例的三种方式

1.LayoutInflater inflater = getLayoutInflater(); //调用Activity的getLayoutInflater()

2.LayoutInflater localinflater =(LayoutInflater)context.getSystemService

(Context.LAYOUT_INFLATER_SERVICE);
  1. LayoutInflater inflater = LayoutInflater.from(context);

.9图片

adapter.notifyDataSetChanged();Adapter设置更改