模拟微信界面,可滑动切换,也可以点击下面图标切换
public class MainActivity extends FragmentActivity {
private MyFirstFragment myFirstFragment;
private MySecondFragment mySecondFragment;
private MyThirdFragment myThirdFragment;
private FragmentManager mFragmentmanager;
private RadioGroup mRadioGroup;
private ViewPager mViewPager;
private FragmentPagerAdapter mAdapter;
private List mFragments;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mFragmentmanager = getSupportFragmentManager();
mFragments = new ArrayList<>();
myFirstFragment = new MyFirstFragment();
mySecondFragment = new MySecondFragment();
myThirdFragment = new MyThirdFragment();
mFragments.add(myFirstFragment);
mFragments.add(mySecondFragment);
mFragments.add(myThirdFragment);
mViewPager = (ViewPager) findViewById(R.id.viewpager);
mRadioGroup = (RadioGroup) findViewById(R.id.radiogroup);
mAdapter = new MyFragmentAdapter(mFragmentmanager,mFragments);
mViewPager.setAdapter(mAdapter);
mRadioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup radioGroup, int checkedId) {
switch (checkedId){
case R.id.radiobutton1:
mViewPager.setCurrentItem(0);
break;
case R.id.radiobutton2:
mViewPager.setCurrentItem(1);
break;
case R.id.radiobutton3:
mViewPager.setCurrentItem(2);
break;
}
}
});
mRadioGroup.check(R.id.radiobutton1);
}
需要写一个adapter,注意继承FragmentPagerAdapter,复写相关方法,
public class MyFragmentAdapter extends FragmentPagerAdapter {
private List mFragments;
public MyFragmentAdapter(FragmentManager fm, List mFragments) {
super(fm);
this.mFragments = mFragments;
}
@Override
public Fragment getItem(int position) {
return mFragments.get(position);
}
@Override
public int getCount() {
return mFragments.size();
}
}
布局文件,注意viewpager的写法,要写完整的包名
"http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
"@+id/viewpager"
android:layout_width="match_parent"
android:layout_weight="1"
android:layout_height="match_parent">
"@+id/radiogroup"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:orientation="horizontal"
android:background="@color/gray">
"@+id/radiobutton1"
style="@style/main_activity"
android:background="@drawable/msg_background"/>
"@+id/radiobutton2"
style="@style/main_activity"
android:background="@drawable/fri_background" />
"@+id/radiobutton3"
style="@style/main_activity"
android:background="@drawable/dyn_background" />
java课程中讲过三种存储方式:
1、文本存储
2、MySql 数据库存储
3、网络存储—Server Lite
Android中有五种存储方式:
1、xml存储
2、文件存储,包括缓存和本地文件
3、数据库—SQLite(最新版本是SQLite3)
4、网络存储
5、ContentProvider 最常见的是手机联系人的存储
存储分为内部存储和外部存储
public class MainActivity extends Activity implements View.OnClickListener{
private TextView mTextview;
private EditText mEditText;
private Button mButtonRead;
private Button mButtonWrite;
private Button mButtonWriteCache;
private Button mButtonReadCache;
private Button mButtonWriteCacheDir;
private Button mButtonWriteSdcard;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextview = (TextView) findViewById(R.id.textview);
mEditText = (EditText) findViewById(R.id.edittext);
mButtonRead = (Button) findViewById(R.id.button_read);
mButtonWrite = (Button) findViewById(R.id.button_write);
mButtonWriteCache = (Button) findViewById(R.id.button_write_cache);
mButtonReadCache = (Button) findViewById(R.id.button_read_cache);
mButtonWriteCacheDir = (Button) findViewById(R.id.button_write_cache_dir);
mButtonWriteSdcard = (Button) findViewById(R.id.button_write_sdcard);
mButtonRead.setOnClickListener(this);
mButtonWrite.setOnClickListener(this);
mButtonWriteCache.setOnClickListener(this);
mButtonReadCache.setOnClickListener(this);
mButtonWriteCacheDir.setOnClickListener(this);
mButtonWriteSdcard.setOnClickListener(this);
}
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.button_read:
SharedPreferences preferences = getSharedPreferences("preferences_test", MODE_PRIVATE);
// SharedPreferences preferences = getPreferences(MODE_PRIVATE);
String content = preferences.getString("edittext_input","默认值");
mTextview.setText(content);
break;
case R.id.button_write:
SharedPreferences preferences2 = getSharedPreferences("preferences_test",MODE_PRIVATE);
SharedPreferences.Editor editor = preferences2.edit();
editor.putString("edittext_input",mEditText.getText().toString());
editor.commit();
break;
case R.id.button_write_cache:
try {
FileOutputStream outputStream = openFileOutput("HelloCache",MODE_PRIVATE);
PrintWriter writer = new PrintWriter(new OutputStreamWriter(outputStream));
writer.write("你好,缓存");
writer.flush();
writer.close();
outputStream.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
case R.id.button_read_cache:
try {
FileInputStream is = openFileInput("HelloCache");
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String line = br.readLine();
while (line!=null){
Log.d("readcache",""+line);
line = br.readLine();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
break;
case R.id.button_write_cache_dir:
File file = new File(getCacheDir(),"helloworld.txt");
if (!file.exists()){
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
FileOutputStream outputStream = null;
try {
outputStream = new FileOutputStream(file);
PrintWriter writer = new PrintWriter(new OutputStreamWriter(outputStream));
writer.write("你好,新的缓存");
writer.flush();
writer.close();
outputStream.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
break;
case R.id.button_write_sdcard:
Toast toast = Toast.makeText(getApplicationContext(),"写入本地磁盘cache",Toast.LENGTH_SHORT);
File file1 = new File(Environment.getExternalStorageDirectory(),"helloworld.txt");
if (!file1.exists()){
try {
file1.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
FileOutputStream outputStream1 = null;
try {
outputStream = new FileOutputStream(file1);
// PrintWriter writer = new PrintWriter(new OutputStreamWriter(outputStream));
// writer.write("你好,本地磁盘");
// writer.flush();
// writer.close();
outputStream.write("你好,本地磁盘".getBytes());
outputStream.flush();
outputStream.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
break;
default:
break;
}
}
"@+id/textview"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
"@+id/edittext"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
注意读写权限的设置,在manifest里面
"ANDROID.PERMISSION.MOUNT_UNMOUNT_FILESYSTEMS">
"ANDROID.PERMISSION.WRITE_EXTERNAL_STORAGE">
SQLite库可以解析大部分标准SQL语言。但它也省去了一些特性并且加入了一些自己的新特性。
需要写一个类继承SQLiteOpenHelper,复写相应方法,写构造器,注意参数的设定
public class TestSqliteOpenHelper extends SQLiteOpenHelper {
public TestSqliteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
}
public TestSqliteOpenHelper(Context context,String name){
this(context,name, null,1);
}
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
sqLiteDatabase.execSQL("create table if not exists user(id integer primary key autoincrement,name varchar(20),password varchar(20))");
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
}
}
public class MainActivity extends Activity implements View.OnClickListener{
private Button mButtonCreateDB;
private Button mButtonInsert;
private SQLiteDatabase db;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TestSqliteOpenHelper helper = new TestSqliteOpenHelper(getApplicationContext(),"my_first_db");
db = helper.getWritableDatabase();
mButtonCreateDB = (Button) findViewById(R.id.button_create_db);
mButtonInsert = (Button) findViewById(R.id.button_insert);
mButtonCreateDB.setOnClickListener(this);
mButtonInsert.setOnClickListener(this);
}
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.button_create_db:
break;
case R.id.button_insert:
ContentValues values = new ContentValues();
values.put("name","zhangsan");
values.put("password","123456");
db.insert("user",null,values);
break;
}
}
}
2016-08-02
数据库的创建,并且创建了两个表book 和Category,并且在onUpgrade方法中完成数据库的升级。
package com.example.databasetest;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
import android.widget.Toast;
public class MyDatabaseHelper extends SQLiteOpenHelper {
private static final String CREATE_BOOK = "create table book(" //创建一个book表
+"id integer primary key autoincrement,"
+"author text,"
+"price real,"
+"pages integer,"
+"name text)";
private static final String CREATE_CATEGORY = "create table Category(" + //创建一个category表
"id integer primary key autoincrement," +
"category_name text," +
"category_code integer)";
private Context mContext;
public MyDatabaseHelper(Context context, String name,
CursorFactory factory, int version) {
super(context, name, factory, version);
mContext = context;
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_BOOK);
db.execSQL(CREATE_CATEGORY);
Toast.makeText(mContext, "创建数据库成功", Toast.LENGTH_SHORT).show();
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("drop table if exists book"); //删除表book
db.execSQL("drop table if exists Category");//删除表category
onCreate(db); //然后再创建数据库,在activity的onCreate方法中,设置数据库version为2,实现了数据库的升级
}
}
在activity中进行数据库的操作,包括创建数据库,数据的增删改查,使用事务替换数据。
package com.example.databasetest;
import android.support.v7.app.ActionBarActivity;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class MainActivity extends ActionBarActivity implements OnClickListener{
private Button mButtonCreate;
private Button mButtonAdd;
private Button mButtonUpdate;
private Button mButtonDelete;
private Button mButtonSelect;
private Button mButtonReplace;
private MyDatabaseHelper dbHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
dbHelper = new MyDatabaseHelper(this, "BookStore.db", null, 2);//版本升级为2
mButtonCreate = (Button) findViewById(R.id.create_db);
mButtonAdd = (Button) findViewById(R.id.add_data);
mButtonUpdate = (Button) findViewById(R.id.update_data);
mButtonDelete = (Button) findViewById(R.id.delate_data);
mButtonSelect = (Button) findViewById(R.id.select_data);
mButtonReplace = (Button) findViewById(R.id.replace_data);
mButtonCreate.setOnClickListener(this);
mButtonAdd.setOnClickListener(this);
mButtonUpdate.setOnClickListener(this);
mButtonDelete.setOnClickListener(this);
mButtonSelect.setOnClickListener(this);
mButtonReplace.setOnClickListener(this);
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.create_db:
dbHelper.getWritableDatabase();//以读写方式打开数据库,一旦数据库的磁盘空间满了,数据库就只能读而不能写,
break;
case R.id.add_data:
SQLiteDatabase db = dbHelper.getWritableDatabase();
ContentValues values = new ContentValues();
//开始组装第一条数据
values.put("name", "第一行代码");
values.put("author", "guo");
values.put("pages", 456);
values.put("price", 16.2);
db.insert("book", null, values);//插入第一条数据
values.clear();
//开始组装第二条数据
values.put("name", "java编程思想");
values.put("author", "li");
values.put("pages", 566);
values.put("price", 19.2);
db.insert("book", null, values);//插入第二条数据
break;
case R.id.update_data:
SQLiteDatabase db2 = dbHelper.getWritableDatabase();
ContentValues values2 = new ContentValues();
values2.put("price", 29.99);
db2.update("book", values2, "name = ?", new String[] {"第一行代码"}); //将《第一行代码》的价格改为29.99
break;
case R.id.delate_data:
SQLiteDatabase db3 = dbHelper.getWritableDatabase();
db3.delete("book", "pages > ?", new String[]{"500"}); //删除页码超过500页的书
break;
case R.id.select_data:
SQLiteDatabase db4 = dbHelper.getWritableDatabase();
//查询book表中的所有数据
Cursor cursor = db4.query("book", null, null, null, null, null, null);
if (cursor.moveToFirst()) {
do {
//遍历Cursor对象,取出数据并打印
String name = cursor.getString(cursor.getColumnIndex("name"));
String author = cursor.getString(cursor.getColumnIndex("author"));
int pages = cursor.getInt(cursor.getColumnIndex("pages"));
double price = cursor.getDouble(cursor.getColumnIndex("price"));
Log.d("MainActivity", "book name is "+name);
Log.d("MainActivity", "book author is "+author);
Log.d("MainActivity", "book pages is "+pages);
Log.d("MainActivity", "book price is "+price);
} while (cursor.moveToNext());
}
break;
case R.id.replace_data://使用事务替换数据
SQLiteDatabase db5 = dbHelper.getWritableDatabase();
db5.beginTransaction();//开启事务
try{
db5.delete("book", null, null);
if (true) {
// throw new NullPointerException();
}
ContentValues values3 = new ContentValues();
values3.put("name", "权利的游戏");
values3.put("author", "Martin");
values3.put("pages", 720);
values3.put("price", 20.85);
db5.insert("Book", null, values3);
db5.setTransactionSuccessful();//事务执行成功
}catch (Exception e) {
e.printStackTrace();
}finally{
db5.endTransaction();//结束事务
}
break;
default:
break;
}
}
}
布局文件,只是按钮而已
"http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.databasetest.MainActivity" >
"@+id/create_db"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="创建数据库"/>
"@+id/add_data"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="添加数据"/>
"@+id/update_data"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="更新数据"/>
"@+id/delate_data"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="删除数据"/>
"@+id/select_data"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="查询数据"/>
"@+id/replace_data"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="替换数据"/>