Fragment的用法
模擬微信界面,可滑動切換,也可以點擊下面圖標切換
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<Fragment> 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<Fragment> mFragments;
public MyFragmentAdapter(FragmentManager fm, List<Fragment> mFragments) {
super(fm);
this.mFragments = mFragments;
}
@Override
public Fragment getItem(int position) {
return mFragments.get(position);
}
@Override
public int getCount() {
return mFragments.size();
}
}
佈局文件,注意viewpager的寫法,要寫完整的包名
<LinearLayout xmlns:android="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">
<android.support.v4.view.ViewPager
android:id="@+id/viewpager"
android:layout_width="match_parent"
android:layout_weight="1"
android:layout_height="match_parent">
</android.support.v4.view.ViewPager>
<RadioGroup
android:id="@+id/radiogroup"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:orientation="horizontal"
android:background="@color/gray">
<RadioButton
android:id="@+id/radiobutton1"
style="@style/main_activity"
android:background="@drawable/msg_background"/>
<RadioButton
android:id="@+id/radiobutton2"
style="@style/main_activity"
android:background="@drawable/fri_background" />
<RadioButton
android:id="@+id/radiobutton3"
style="@style/main_activity"
android:background="@drawable/dyn_background" />
</RadioGroup>
</LinearLayout>
數據存儲
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;
}
}
<TextView
android:id="@+id/textview"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<EditText
android:id="@+id/edittext"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<Button
android:id="@+id/button_read"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="讀取數據"/>
<Button
android:id="@+id/button_write"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="寫入數據"/>
<Button
android:id="@+id/button_write_cache"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="寫入緩存數據"/>
<Button
android:id="@+id/button_read_cache"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="讀取緩存數據"/>
<Button
android:id="@+id/button_write_cache_dir"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="寫入緩存數據到cache文件夾"/>
<Button
android:id="@+id/button_write_sdcard"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="寫入本地磁盤"/>
注意讀寫權限的設置,在manifest裏面
<!--插拔式擴展卡讀寫權限-->
<uses-permission android:name="ANDROID.PERMISSION.MOUNT_UNMOUNT_FILESYSTEMS"></uses-permission>
<!--手機本身存儲的讀寫權限-->
<uses-permission android:name="ANDROID.PERMISSION.WRITE_EXTERNAL_STORAGE"></uses-permission>
數據庫 SQLite
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;
}
}
}
數據庫SQLite(重新認識)
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;
}
}
}
佈局文件,只是按鈕而已
<LinearLayout xmlns:android="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" >
<Button
android:id="@+id/create_db"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="創建數據庫"/>
<Button
android:id="@+id/add_data"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="添加數據"/>
<Button
android:id="@+id/update_data"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="更新數據"/>
<Button
android:id="@+id/delate_data"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="刪除數據"/>
<Button
android:id="@+id/select_data"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="查詢數據"/>
<Button
android:id="@+id/replace_data"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="替換數據"/>
</LinearLayout>