创建与使用自定义菜单
1.使用的Activitity继承AppCompatActivity
2.在menu文件夹下面创建具体的布局,
例如:
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/menu_item_crime"
android:icon="@drawable/ic_menu_add"
android:title="新的数据"
app:showAsAction="ifRoom|withText"
/>
<item
android:id="@+id/menu_itme_showorhide"
android:title="显示所有内容"
app:showAsAction="ifRoom"/>
</menu>
效果:
3.如果想用系统的图标,可以右键drawable目录new->Image Asset,选择自己想要的图标来使用。
4.在fragment中,首先重写onCreateOptionsMenu()方法。
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);//只是为了遵循规范,什么都没做
inflater.inflate(R.menu.fragment_crime_list,menu);//传入菜单栏的布局
MenuItem subTitle=menu.findItem(R.id.menu_itme_showorhide);
if(SubTitleshow){
subTitle.setTitle("隐藏内容");
}
else {
subTitle.setTitle("显示内容");
}
}
相应的点击事件则是重写onOptionsItemSelected()方法。
public boolean onOptionsItemSelected(MenuItem item) {//用于相应点击菜单栏功能的响应事件
switch (item.getItemId()){
case R.id.menu_item_crime:
Crime crime=new Crime();
CrimeLab.get(getActivity()).addCrime(crime);
Intent intent=CrimePagerActivity.newIntent(getActivity(),crime.getmID());
startActivity(intent);
return true;
case R.id.menu_itme_showorhide:
SubTitleshow=!SubTitleshow;//这里用于更新菜单的两句
getActivity().invalidateOptionsMenu();
updateCrimeNumber();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
在旋转屏幕时,想要保存子标题装填值的时候
,
在onCreateView()方法中,加上
if(savedInstanceState!=null){
SubTitleshow=savedInstanceState.getBoolean(SAVE_SUBTITLE);//旋转问题2
}
然后再重写onSaveInstanceState()方法:
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putBoolean(SAVE_SUBTITLE,SubTitleshow);//旋转问题3
}
对于SQLite数据库的使用
我这里因为没有使用litepal来操作数据库,所以会比较麻烦。
上面这个就是工具类的组成了。
首先是CrimeDbSchema类,这是一个数据表字段。
public class CrimeDbSchema {
public static final class CrimeTable {
public static final String NAME = "crimes";
public static final class Cols {
public static final String UUID = "uuid";
public static final String TITLE = "title";
public static final String DATE = "date";
public static final String SOLVED = "solved";
public static final String SUSPECT="suspect";
}
}
然后就是CrimeBaseHelper类,继承自SQliteOpenHelper类,负责初始化数据库和更新数据库版本。
public class CrimeBaseHelper extends SQLiteOpenHelper {
private static final int VERSION = 1;
private static final String DATABASE_NAME = "crimeBase.db";
public CrimeBaseHelper(Context context) {
super(context, DATABASE_NAME, null, VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table " + CrimeTable.NAME + "(" +
" _id integer primary key autoincrement, " +
CrimeTable.Cols.UUID + ", " +
CrimeTable.Cols.TITLE + ", " +
CrimeTable.Cols.DATE + ", " +
CrimeTable.Cols.SOLVED +","+
CrimeTable.Cols.SUSPECT+
")"
);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
第三个是CrimeCursorWrapper类,作用是从数据库表的字段中将信息提取出来放到具体的javabean类当中。
public class CrimeCursorWrapper extends CursorWrapper {
public CrimeCursorWrapper(Cursor cursor) {
super(cursor);
}
public Crime getCrime() {
String uuidString = getString(getColumnIndex(CrimeTable.Cols.UUID));
String title = getString(getColumnIndex(CrimeTable.Cols.TITLE));
long date = getLong(getColumnIndex(CrimeTable.Cols.DATE));
int isSolved = getInt(getColumnIndex(CrimeTable.Cols.SOLVED));
String suspect=getString(getColumnIndex(CrimeTable.Cols.SUSPECT));
Crime crime = new Crime(UUID.fromString(uuidString));
crime.setmTitle(title);
crime.setDate(new Date(date));
crime.setmSolved(isSolved != 0);
crime.setmSuspect(suspect);
return crime;
}
}