Android入门笔记02

常见布局

线性布局

  • 有一个布局方向,水平或者竖直
  • 在竖直布局下,左对齐、右对齐,水平居中生效
  • 在水平布局下,顶部对齐、底部对齐、竖直居中生效
  • 权重:按比例分配屏幕的剩余宽度或者高度
  • activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity" android:orientation="vertical">

    <LinearLayout
            android:layout_weight="1"
            android:orientation="horizontal"
            android:layout_width="match_parent"
            android:layout_height="0dp">

        <TextView
                android:text="TextView"
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:id="@+id/textView4"
                android:background="@android:color/holo_red_dark"
                android:layout_weight="1"/>
        <TextView
                android:text="TextView"

                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:id="@+id/textView7"
                android:background="@android:color/holo_orange_dark"
                android:layout_weight="1"/>
        <TextView
                android:text="TextView"
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:id="@+id/textView6"
                android:background="@android:color/holo_green_light"
                android:layout_weight="1"/>
        <TextView
                android:text="TextView"
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:id="@+id/textView5"
                android:background="@android:color/holo_purple"
                android:layout_weight="1"/>
    </LinearLayout>
    <LinearLayout
            android:layout_weight="1"
            android:orientation="vertical"
            android:layout_width="match_parent"
            android:layout_height="0dp">
        <TextView
                android:text="TextView"
                android:layout_width="match_parent"
                android:layout_height="0dp"
                android:layout_weight="1"
                android:background="@android:color/holo_blue_bright"
                android:id="@+id/textView"/>
        <TextView
                android:text="TextView"
                android:layout_weight="1"
                android:layout_width="match_parent"
                android:layout_height="0dp"
                android:background="@android:color/holo_blue_dark"
                android:id="@+id/textView8"/>
        <TextView
                android:text="TextView"
                android:layout_weight="1"
                android:layout_width="match_parent"
                android:layout_height="0dp"
                android:background="#78F"
                android:id="@+id/textView3"/>
        <TextView
                android:text="TextView"
                android:layout_weight="1"
                android:layout_width="match_parent"
                android:layout_height="0dp"
                android:background="@android:color/holo_green_dark"
                android:id="@+id/textView2"/>
    </LinearLayout>
</LinearLayout>

在这里插入图片描述

相对布局

  • 组件默认位置都是左上角,组件之间可以重叠
  • 可以相对于父元素上下左右对齐,相对于父元素,水平居中、竖直居中、水平竖直同时居中
  • 可以相对于其他组件上下左右对齐
  • 可以布局于其他组件的上方、下方、左边、右边
    activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout

        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity" android:orientation="vertical">
    
    <Button
            android:text="Center"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"C
            android:layout_centerInParent="true"
            android:id="@+id/bt_center"/>

    <Button
            android:text="UP"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_above="@+id/bt_center"
            android:layout_alignLeft="@+id/bt_center"
            android:layout_alignRight="@+id/bt_center"
            android:id="@+id/bt_above"/>

    <Button
            android:text="DOWN"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@+id/bt_center"
            android:layout_alignLeft="@+id/bt_center"
            android:layout_alignRight="@+id/bt_center"
            android:id="@+id/bt_3"/>

    <Button
            android:text="LEFT"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_toLeftOf="@id/bt_center"
            android:layout_alignTop="@id/bt_center"
            android:layout_alignBottom="@id/bt_center"
            android:layout_alignParentLeft="true"
            android:id="@+id/bt_4"/>
    <Button
            android:text="左上"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_toLeftOf="@id/bt_center"
            android:layout_above="@id/bt_center"
            android:layout_alignParentLeft="true"
            android:id="@+id/bt_6"/>
    <Button
            android:text="左下"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_toLeftOf="@id/bt_center"
            android:layout_below="@id/bt_center"
            android:layout_alignParentLeft="true"
            android:id="@+id/bt_7"/>

    <Button
            android:text="RIGHT"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_toRightOf="@id/bt_center"
            android:layout_alignTop="@id/bt_center"
            android:layout_alignBottom="@id/bt_center"
            android:layout_alignParentRight="true"
            android:id="@+id/bt_5"/>

    <Button
            android:text="右上"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_toRightOf="@id/bt_center"
            android:layout_above="@id/bt_center"
            android:layout_alignParentRight="true"
            android:id="@+id/bt_8"/>
    <Button
            android:text="右上"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_toRightOf="@id/bt_center"
            android:layout_below="@id/bt_center"
            android:layout_alignParentRight="true"
            android:id="@+id/bt_9"/>
</RelativeLayout>

在这里插入图片描述

帧布局

  • 组件默认位置都是左上角,组件之间可以重叠
  • 可以设置上下左右对齐,水平竖直居中,设置方式与线性布局一样

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout

        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity" android:orientation="vertical">
    <TextView android:layout_width="240dp" 
              android:layout_height="240dp"
              android:background="#FF0000"
              android:layout_gravity="center"
    />

    <TextView android:layout_width="200dp"
              android:layout_height="200dp"
              android:background="#00FF00"
              android:layout_gravity="center"
    />

    <TextView android:layout_width="160dp"
              android:layout_height="160dp"
              android:background="#0000FF"
              android:layout_gravity="center"
    />

    <TextView android:layout_width="120dp"
              android:layout_height="120dp"
              android:background="#FFFF00"
              android:layout_gravity="center"
    />

    <TextView android:layout_width="80dp"
              android:layout_height="80dp"
              android:background="#FF00FF"
              android:layout_gravity="center"
    />

    <TextView android:layout_width="40dp"
              android:layout_height="40dp"
              android:background="@android:color/white"
              android:layout_gravity="center"
    />
</FrameLayout>

在这里插入图片描述

表格布局

  • 每有一个TableRow子节点表示一行,该子节点的每一个子节点都表示一列
  • TableLayout的一级子节点默认宽都是匹配父元素
  • TableRow的子节点默认宽高都是包裹内容
<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
             android:layout_width="match_parent"
             android:layout_height="match_parent"
             android:stretchColumns="1"
>
    <TableRow
    >
        <TextView
                android:layout_column="1"
                android:text="open"
        />
        <TextView
                android:gravity="right"
                android:text="Ctrl-O"
        />
    </TableRow>
    <TableRow >
        <TextView
                android:layout_column="1"
                android:text="save"
        />
        <TextView
                android:gravity="right"
                android:text="Ctrl-S"
        />
    </TableRow>
    <TableRow
    >
        <TextView
                android:text="  "
        />
        <TextView
                android:text="save AS"
        />
        <TextView
                android:text="Ctrl-shift-S"
        />
    </TableRow>

    <TextView
            android:layout_height="1dp"
            android:background="#000000"
    />

    <TableRow

    >
        <TextView
                android:text="X"
        />
        <TextView
                android:layout_span="2"
                android:text="Import"
        />

    </TableRow>
    <TableRow

    >
        <TextView
                android:text="X"
        />
        <TextView
                android:text="Export"
        />
        <TextView
                android:gravity="right"
                android:text="Ctrl-E"
        />
    </TableRow>
    <TextView
            android:layout_height="1dp"
            android:background="#000000"
    />
    <TableRow

    >
        <TextView
                android:layout_column="1"
                android:layout_span="2"
                android:text="Quit"
        />

    </TableRow>

</TableLayout>

在这里插入图片描述


绝对布局少有用武之地,在屏幕分辩率固定的场合下使用

Logcat

等级

  • verbose:冗余,最低等级
  • debug:调试
  • info:正常等级的信息
  • warn:警告
  • error:错误
    在这里插入图片描述

Android的存储

内部存储空间

  • RAM内存:运行内存,相当于电脑的内存
  • ROM内存:存储内存,相当于电脑的硬盘

activity_main.xml

<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"
              tools:context=".MainActivity"
              android:orientation="vertical"
>

    <EditText
            android:id="@+id/et_name"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="请输入用户名"
    />
    <EditText
            android:id="@+id/et_pass"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:inputType="textPassword"
            android:hint="请输入密码"
    />
    <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
    >
        <CheckBox
                android:id="@+id/cb"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="记住用户名和密码"
                android:layout_centerVertical="true"
        />
        <Button
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="right"
                android:text="登录"
                android:layout_alignParentRight="true"
                android:onClick="login"
        />
    </RelativeLayout>
</LinearLayout>

MainActivity

package com.example.administrator.myapplication;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.Toast;

import java.io.*;

public class MainActivity extends AppCompatActivity {

    private EditText et_name;
    private EditText et_pass;

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

        et_name = (EditText) findViewById(R.id.et_name);
        et_pass = (EditText) findViewById(R.id.et_pass);

        readAccount();

    }

    public void readAccount(){
        File file = new File("data/data/com.example.administrator.myapplication/info.txt");
        if(file.exists()){
            try {
                FileInputStream fis = new FileInputStream(file);
                //把字节流转换成字符流
                BufferedReader br = new BufferedReader(new InputStreamReader(fis));
                //读取txt文件里的用户名和密码
                String text = br.readLine();
                String[] s = text.split("##");

                et_name.setText(s[0]);
                et_pass.setText(s[1]);
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

    public void login(View v){

        String name = et_name.getText().toString();
        String pass = et_pass.getText().toString();

        CheckBox cb = (CheckBox) findViewById(R.id.cb);
        //判断选框是否被勾选
        if(cb.isChecked()){
            //data/data/com.example.administrator.myapplication:这就是内部存储空间的路径
            File file = new File("data/data/com.example.administrator.myapplication/info.txt");
            FileOutputStream fos;
            try {
                fos = new FileOutputStream(file);
                fos.write((name + "##" + pass).getBytes());
                fos.close();
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

        //创建并显示吐司对话框
        Toast.makeText(this, "登录成功", Toast.LENGTH_SHORT).show();
    }
}

在这里插入图片描述

在这里插入图片描述
//用API获取内部存储文件路径//
MainActivity.java

package com.itheima.rwinrom;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStreamReader;

import org.apache.http.entity.InputStreamEntity;

import com.itheima.apirwinrom.R;

import android.os.Bundle;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends Activity {

    private EditText et_name;
	private EditText et_pass;

	@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        et_name = (EditText) findViewById(R.id.et_name);
    	et_pass = (EditText) findViewById(R.id.et_pass);
    	
        readAccount();
        
    }

    public void readAccount(){
//    	File file = new File(getFilesDir(), "info.txt");
    	File file = new File(getCacheDir(), "info.txt");
    	if(file.exists()){
	    	try {
				FileInputStream fis = new FileInputStream(file);
				//把字节流转换成字符流
				BufferedReader br = new BufferedReader(new InputStreamReader(fis));
				//读取txt文件里的用户名和密码
				String text = br.readLine();
				String[] s = text.split("##");
				
		    	et_name.setText(s[0]);
		    	et_pass.setText(s[1]);
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
    	}
    }

    public void login(View v){
    	
    	String name = et_name.getText().toString();
    	String pass = et_pass.getText().toString();
    	
    	CheckBox cb = (CheckBox) findViewById(R.id.cb);
    	//判断选框是否被勾选
    	if(cb.isChecked()){
    		//返回一个File对象,其路径是data/data/com.example.administrator.myapplication/files
//    		File file = new File(getFilesDir(), "info.txt");
    		
    		//返回值也是一个File对象,其路径是data/data/com.example.administrator.myapplication/cache
    		File file = new File(getCacheDir(), "info.txt");
    		FileOutputStream fos;
			try {
				fos = new FileOutputStream(file);
				fos.write((name + "##" + pass).getBytes());
				fos.close();
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
    	}
    	
    	//创建并显示吐司对话框
    	Toast.makeText(this, "登录成功", 0).show();
    }
    
}

外部存储空间

  • SD卡:相当于电脑的移动硬盘

    • 2.2之前,sd卡路径:sdcard
    • 4.3之前,sd卡路径:mnt/sdcard
    • 4.3开始,sd卡路径:storage/sdcard
  • 所有存储设备,都会被划分成若干个区块,每个区块有固定的大小

  • 存储设备的总大小 = 区块大小 * 区块数量

在外部存储空间中读取文件

package com.itheima.rwinrom;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStreamReader;

import org.apache.http.entity.InputStreamEntity;

import com.itheima.rwinsd.R;

import android.os.Bundle;
import android.os.Environment;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends Activity {

    private EditText et_name;
	private EditText et_pass;

	@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        et_name = (EditText) findViewById(R.id.et_name);
    	et_pass = (EditText) findViewById(R.id.et_pass);
    	
        readAccount();
        
    }

    public void readAccount(){
    	if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
	    	File file = new File("sdcard/info.txt");
	    	if(file.exists()){
		    	try {
					FileInputStream fis = new FileInputStream(file);
					//把字节流转换成字符流
					BufferedReader br = new BufferedReader(new InputStreamReader(fis));
					//读取txt文件里的用户名和密码
					String text = br.readLine();
					String[] s = text.split("##");
					
			    	et_name.setText(s[0]);
			    	et_pass.setText(s[1]);
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
	    	}
    	}
    }

    public void login(View v){
    	
    	String name = et_name.getText().toString();
    	String pass = et_pass.getText().toString();
    	
    	CheckBox cb = (CheckBox) findViewById(R.id.cb);
    	//判断选框是否被勾选
    	if(cb.isChecked()){
    		//MEDIA_UNKNOWN:不能识别sd卡
    		//MEDIA_REMOVED:没有sd卡
    		//MEDIA_UNMOUNTED:sd卡存在但是没有挂载
    		//MEDIA_CHECKING:sd卡正在准备
    		//MEDIA_MOUNTED:sd卡已经挂载,可用
    		if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
    		
	    		//返回一个File对象,其路径是sd卡的真实路径 
	    		File file = new File(Environment.getExternalStorageDirectory(), "info.txt");
	//    		File file = new File("sdcard/info.txt");
	    		FileOutputStream fos;
				try {
					fos = new FileOutputStream(file);
					fos.write((name + "##" + pass).getBytes());
					fos.close();
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
    		}
    		else{
    			Toast.makeText(this, "sd卡不可用哟亲么么哒", 0).show();
    		}
    	}
    	
    	//创建并显示吐司对话框
    	Toast.makeText(this, "登录成功", 0).show();
    }
    
}

获取SD卡剩余容量
MainActivity.java

package com.itheima.getsdavail;

import java.io.File;

import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.os.StatFs;
import android.app.Activity;
import android.text.format.Formatter;
import android.view.Menu;
import android.widget.TextView;

public class MainActivity extends Activity {

	@SuppressWarnings("deprecation")
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		File path = Environment.getExternalStorageDirectory();
        StatFs stat = new StatFs(path.getPath());
        long blockSize;
        long totalBlocks;
        long availableBlocks;
        
        //获取当前系统版本的等级
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2){
        	 blockSize = stat.getBlockSizeLong();
             totalBlocks = stat.getBlockCountLong();
             availableBlocks = stat.getAvailableBlocksLong();
        }
        else{
        	blockSize = stat.getBlockSize();
            totalBlocks = stat.getBlockCount();
            availableBlocks = stat.getAvailableBlocks();
        }
        
        TextView tv = (TextView) findViewById(R.id.tv);
        tv.setText(formatSize(availableBlocks * blockSize));
	}

	private String formatSize(long size) {
        return Formatter.formatFileSize(this, size);
    }

}


文件访问权限

  • 指的是谁能访问这个文件
  • 在Android中,每一个应用,都是一个独立的用户
  • 使用10个字母表示
  • drwxrwxrwx
  • 第一个字母:
    • d:表示文件夹
    • -:表示文件
  • 第一组rwx:表示的是文件拥有者(owner)对文件的权限
    • r:read,读
    • w:write
    • x:execute
  • 第二组rwx:表示的是跟文件拥有者属于同一用户组的用户(grouper)对文件的权限
  • 第三组rwx:表示的其他用户(other)对文件的权限

代码示例
MainActivity.java

package com.itheima.permission;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;

import android.os.Bundle;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.view.Menu;
import android.view.View;

@SuppressLint("WorldReadableFiles")
public class MainActivity extends Activity {

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

	public void click1(View v){
		//路径已经默认为data/data/com.itheima.permission/files
		try {
			FileOutputStream fos = openFileOutput("info1.txt", MODE_PRIVATE);
			fos.write("哈哈哈".getBytes());
			fos.close();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	public void click2(View v){
		//路径已经默认为data/data/com.itheima.permission/files
		try {
			@SuppressWarnings("deprecation")
			FileOutputStream fos = openFileOutput("info2.txt", MODE_WORLD_READABLE | MODE_WORLD_WRITEABLE);
			fos.write("ohohoho".getBytes());
			fos.close();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	public void click3(View v){
		//路径已经默认为data/data/com.itheima.permission/files
		try {
			@SuppressWarnings("deprecation")
			FileOutputStream fos = openFileOutput("info3.txt", MODE_WORLD_READABLE | MODE_WORLD_WRITEABLE);
			fos.write("德玛西亚".getBytes());
			fos.close();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}


SharedPreference

  • 非常适合用来保存零散的简单的数据
package com.itheima.rwinrom;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStreamReader;

import org.apache.http.entity.InputStreamEntity;

import com.itheima.sharedpreference.R;

import android.os.Bundle;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.view.Menu;
import android.view.View;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends Activity {

    private EditText et_name;
	private EditText et_pass;

	@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        et_name = (EditText) findViewById(R.id.et_name);
    	et_pass = (EditText) findViewById(R.id.et_pass);
    	
        readAccount();
        
    }

    public void readAccount(){
	    SharedPreferences sp = getSharedPreferences("info", MODE_PRIVATE);
	    String name = sp.getString("name", "");
	    String pass = sp.getString("pass", "");
	    		
		et_name.setText(name);
		et_pass.setText(pass);
    }

    public void login(View v){
    	
    	String name = et_name.getText().toString();
    	String pass = et_pass.getText().toString();
    	
    	CheckBox cb = (CheckBox) findViewById(R.id.cb);
    	//判断选框是否被勾选
    	if(cb.isChecked()){
    		//使用sharedPreference来保存用户名和密码
    		//路径在data/data/com.itheima.sharedpreference/share_
    		SharedPreferences sp = getSharedPreferences("info", MODE_PRIVATE);
    		//拿到sp的编辑器
    		Editor ed = sp.edit();
    		ed.putString("name", name);
    		ed.putString("pass", pass);
    		//提交
    		ed.commit();
    	}
    	
    	//创建并显示吐司对话框
    	Toast.makeText(this, "登录成功", 0).show();
    }
    
}


生成XML文件

备份短信,说白了就是将短信放到一个xml文件中
MainActivity.java

package com.itheima.createxml;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.List;

import com.itheima.createxml.domain.Message;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;

public class MainActivity extends Activity {

	List<Message> smsList;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		//虚拟10条短信
		smsList = new ArrayList<Message>();
		for(int i = 0; i < 10; i++){
			Message sms = new Message("小志好棒" + i, System.currentTimeMillis() + "", "138"+i+i, "1");
			smsList.add(sms);
		}
	}

	public void click(View v){
		//在内存中把xml备份短信的格式拼接出来
		StringBuffer sb = new StringBuffer();
		sb.append("<?xml version='1.0' encoding='utf-8' standalone='yes' ?>");
		sb.append("<messages>");
		for (Message sms : smsList) {
			sb.append("<sms>");
			
			sb.append("<body>");
			sb.append(sms.getBody());
			sb.append("</body>");
			
			sb.append("<date>");
			sb.append(sms.getDate());
			sb.append("</date>");
			
			sb.append("<type>");
			sb.append(sms.getType());
			sb.append("</type>");
			
			sb.append("<address>");
			sb.append(sms.getAddress());
			sb.append("</address>");
			
			sb.append("</sms>");
		}
		sb.append("</messages>");
		
		File file = new File("sdcard/sms.xml");
		try {
			FileOutputStream fos = new FileOutputStream(file);
			fos.write(sb.toString().getBytes());
			fos.close();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}

Message.java

package com.itheima.createxml.domain;

public class Message {

	private String body;
	private String date;
	private String address;
	private String type;
	public String getBody() {
		return body;
	}
	public void setBody(String body) {
		this.body = body;
	}
	public String getDate() {
		return date;
	}
	public void setDate(String date) {
		this.date = date;
	}
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
	public String getType() {
		return type;
	}
	public void setType(String type) {
		this.type = type;
	}
	public Message(String body, String date, String address, String type) {
		super();
		this.body = body;
		this.date = date;
		this.address = address;
		this.type = type;
	}
	
	
}

用序列化器生成xml文件

MainActivity.java

package com.itheima.xmlserializer;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.xmlpull.v1.XmlSerializer;

import com.itheima.createxml.domain.Message;

import android.os.Bundle;
import android.app.Activity;
import android.util.Xml;
import android.view.Menu;
import android.view.View;

public class MainActivity extends Activity {

	List<Message> smsList;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		// 虚拟10条短信
		smsList = new ArrayList<Message>();
		for (int i = 0; i < 10; i++) {
			Message sms = new Message("小志好棒" + i, System.currentTimeMillis()
					+ "", "138" + i + i, "1");
			smsList.add(sms);
		}
	}

	public void click(View v){
		//使用xml序列化器生成xml文件
		//1.拿到序列化器对象
		XmlSerializer xs = Xml.newSerializer();
		//2.初始化
		File file = new File("sdcard/sms2.xml");
		try {
			FileOutputStream fos = new FileOutputStream(file);
			//enconding:指定用什么编码生成xml文件
			xs.setOutput(fos, "utf-8");
			
			//3.开始生成xml文件
			//enconding:指定头结点中的enconding属性的值
			xs.startDocument("utf-8", true);
			
			xs.startTag(null, "message");
			
			for (Message sms : smsList) {
				xs.startTag(null, "sms");
				
				xs.startTag(null, "body");
				xs.text(sms.getBody() + "<body>");
				xs.endTag(null, "body");
				
				xs.startTag(null, "date");
				xs.text(sms.getDate());
				xs.endTag(null, "date");
				
				xs.startTag(null, "type");
				xs.text(sms.getType());
				xs.endTag(null, "type");
				
				xs.startTag(null, "address");
				xs.text(sms.getAddress());
				xs.endTag(null, "address");
				
				xs.endTag(null, "sms");
			}
			
			xs.endTag(null, "message");
			
			//告诉序列化器,文件生成完毕
			xs.endDocument();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} 
	}

}

pull解析xml文件

weather.xml

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<weather>
	<city>
		<name>上海</name>
		<temp></temp>
		<pm>80</pm>
	</city>
	<city>
		<name>北京</name>
		<temp>-5°</temp>
		<pm>800</pm>
	</city>
	<city>
		<name>西安</name>
		<temp>12°</temp>
		<pm>60</pm>
	</city>
</weather>

City.java

package com.itheima.pullparser.domain;

public class City {

	private String name;
	private String temp;
	private String pm;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getTemp() {
		return temp;
	}
	public void setTemp(String temp) {
		this.temp = temp;
	}
	public String getPm() {
		return pm;
	}
	public void setPm(String pm) {
		this.pm = pm;
	}
	@Override
	public String toString() {
		return "City [name=" + name + ", temp=" + temp + ", pm=" + pm + "]";
	}
	
	
}

MainActivity.java

package com.itheima.pullparser;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;

import com.itheima.pullparser.domain.City;

import android.os.Bundle;
import android.app.Activity;
import android.util.Xml;
import android.view.Menu;
import android.view.View;

public class MainActivity extends Activity {

	List<City> cityList;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
	}

	public void click(View v){
		//获取到src文件夹下的资源文件
		InputStream is = getClassLoader().getResourceAsStream("weather.xml");
		
		//拿到pull解析器对象
		XmlPullParser xp = Xml.newPullParser();
		//初始化
		try {
			xp.setInput(is, "gbk");
			
			//获取当前节点的事件类型,通过事件类型的判断,我们可以知道当前节点是什么节点,从而确定我们应该做什么操作
			int type = xp.getEventType();
			City city = null;
			while(type != XmlPullParser.END_DOCUMENT){
				//根据节点的类型,要做不同的操作
				switch (type) {
				case XmlPullParser.START_TAG:
					//					获取当前节点的名字
					if("weather".equals(xp.getName())){
						//创建city集合对象,用于存放city的javabean
						cityList = new ArrayList<City>();
					}
					else if("city".equals(xp.getName())){
						//创建city的javabean对象
						city = new City();
					}
					else if("name".equals(xp.getName())){
						//				获取当前节点的下一个节点的文本
						String name = xp.nextText();
						city.setName(name);
					}
					else if("temp".equals(xp.getName())){
						//				获取当前节点的下一个节点的文本
						String temp = xp.nextText();
						city.setTemp(temp);
					}
					else if("pm".equals(xp.getName())){
						//				获取当前节点的下一个节点的文本
						String pm = xp.nextText();
						city.setPm(pm);
					}
					break;
				case XmlPullParser.END_TAG:
					if("city".equals(xp.getName())){
						//把city的javabean放入集合中
						cityList.add(city);
					}
					break;

				}
				
				//把指针移动到下一个节点,并返回该节点的事件类型
				type = xp.next();
			}
			
			for (City c : cityList) {
				System.out.println(c.toString());
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值