/*
* 该类为主界面,通过侧滑,划出侧滑菜单,里面有制作人的信息,添加,查找,删除功能。 * 主界面为白色,每三个物品信息为一行的卡片式布局呈现给用户,通过点击图片查看具体信息 */ public class MainActivity extends AppCompatActivity { private DrawerLayout drawerLayout; private List<Goods> goodsList =new ArrayList<>(); private goodsAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Toolbar toolbar=(Toolbar)findViewById(R.id.toolbar); // setSupportActionBar(toolbar); drawerLayout=(DrawerLayout)findViewById(R.id.drawer_layout); NavigationView navigationView=(NavigationView)findViewById(view); initGoods(); RecyclerView recyclerView=(RecyclerView) findViewById(R.id.recycler_view); GridLayoutManager layoutManager=new GridLayoutManager(this,3); recyclerView.setLayoutManager(layoutManager); adapter=new goodsAdapter(goodsList); recyclerView.setAdapter(adapter); ActionBar actionBar=getSupportActionBar(); if (actionBar!=null){ actionBar.setDisplayHomeAsUpEnabled(true); } navigationView.setCheckedItem(R.id.nav_add); //默认选中 navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener(){ @Override public boolean onNavigationItemSelected( MenuItem item) { //侧滑菜单里的选项 switch (item.getItemId()) { case R.id.nav_add: Intent intent1=new Intent(MainActivity.this,AddActivity.class); startActivity(intent1); break; case R.id.nav_search: Intent intent=new Intent(MainActivity.this,SearchActivity.class); startActivity(intent); break; case R.id.nav_delete: Intent intent2=new Intent(MainActivity.this,deleteActivity.class); startActivity(intent2); break; case R.id.nav_manage: Toast.makeText(MainActivity.this,"目前还没有更多功能",Toast.LENGTH_SHORT).show(); break; default: break; } return true; } }); } public boolean onCreateOptionsMenu(Menu menu){ getMenuInflater().inflate(R.menu.view,menu); return true; } private void initGoods(){ List<Goods> goods= DataSupport.findAll(Goods.class); //读取全部数据 for (int i=0;goods.size()>i;i++){ //如果从数据库读取的数据小于总数据,则继续读取 Goods good=new Goods("","","","",true,""); good.setName(goods.get(i).getName()); good.setImageId(goods.get(i).getImageId()); goodsList.add(good); } } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()){ case R.id.refresh: initGoods(); Toast.makeText(this,"刷新成功",Toast.LENGTH_SHORT).show(); break; default: break; } return true; }
}
/*
* 该活动为登录界面,使用Litepal数据库存储,采用映射方法建表,用户账号密码存储在User1中
* 记住密码功能采用的是键值对存储
* isremember为记住密码的逻辑判断
*
*/
public class LoginActivity extends AppCompatActivity {
private EditText user;
private EditText password;
private Button login;
private Button register;
private CheckBox remember;
private SharedPreferences pref;
private SharedPreferences.Editor editor;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
user=(EditText)findViewById(R.id.user);
password=(EditText)findViewById(R.id.password);
login=(Button)findViewById(R.id.denglu);
register=(Button)findViewById(R.id.zhuce);
remember=(CheckBox)findViewById(R.id.remember);
LitePal.getDatabase(); //建表
pref= PreferenceManager.getDefaultSharedPreferences(this);
boolean isremember=pref.getBoolean("remember",false); //键值对存储
if (isremember){
String user1=pref.getString("user","");
String password1=pref.getString("password","");
user.setText(user1);
password.setText(password1);
remember.setChecked(true);
}
login.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String user1=user.getText().toString();
String password1=password.getText().toString();
List<User> users= DataSupport.where("user=?",user1).find(User.class); //登录判断
if(users.size()<1){
AlertDialog.Builder dialog=new AlertDialog.Builder(LoginActivity.this);
dialog.setMessage("此用户不存在");
dialog.setCancelable(false);
dialog.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
});
dialog.show();
}else{ //成功登陆
if(users.get(0).getPassword().equals(password1)){ //得到数据库中第一个和user1相对应的密码和输入的密码进行比较
editor=pref.edit();
if (remember.isChecked()){
editor.putBoolean("remember",true);
editor.putString("user",user1);
editor.putString("password",password1);
}
else {
editor.clear();
}
editor.apply();
Intent intent=new Intent(LoginActivity.this,MainActivity.class);
startActivity(intent);
}
else {
AlertDialog.Builder dialog=new AlertDialog.Builder(LoginActivity.this);
dialog.setMessage("密码错误");
dialog.setCancelable(false);
dialog.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
});
dialog.show();
}
}
}
});
register.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(LoginActivity.this,RegisterActivity.class);
startActivity(intent);
finish();
}
});
}
}
public class RegisterActivity extends AppCompatActivity {
private EditText user;
private EditText password;
private EditText password1;
private Button ok;
private Button cancel;
/*
* 该表为注册界面,用于向数据库里添加数据以及判断是否有重复的数据,如果有则不添加新的数据
* users为数据库符合条件的数值,user0为添加数据时创建的对象,user1为输入的账号
* password0为输入的密码,password00为重复的密码,用于进一步确认
*/
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_register);
user=(EditText)findViewById(R.id.user);
password=(EditText)findViewById(R.id.password);
password1=(EditText)findViewById(R.id.password1);
ok=(Button)findViewById(R.id.ok);
cancel=(Button)findViewById(R.id.cancel);
ok.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String user1=user.getText().toString();
String password0=password.getText().toString();
String password00=password1.getText().toString();
List<User> users= DataSupport.where("user=?",user1).find(User.class); //注册判断
if (users.size()>0){ //判断用户名是否重复
AlertDialog.Builder dialog=new AlertDialog.Builder(RegisterActivity.this);
dialog.setMessage("此用户名已存在");
dialog.setCancelable(false);
dialog.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
});
dialog.show();
}
else if (user1.equals("")){
AlertDialog.Builder dialog=new AlertDialog.Builder(RegisterActivity.this);
dialog.setMessage("账号不能为空");
dialog.setCancelable(false);
dialog.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
});
dialog.show();
}
else if (!user1.equals("")){
if (password0.equals("")){
AlertDialog.Builder dialog=new AlertDialog.Builder(RegisterActivity.this);
dialog.setMessage("密码不能为空");
dialog.setCancelable(false);
dialog.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
});
dialog.show();
}
else if (password0.equals(password00)&&(!password0.equals(""))) { //判断两次密码是否一次
Toast.makeText(RegisterActivity.this,"注册成功",Toast.LENGTH_SHORT).show();
User user0=new User(); //将账号密码存到数据库
user0.setUser(user1);
user0.setPassword(password0);
user0.save();
Intent intent=new Intent(RegisterActivity.this,LoginActivity.class);
startActivity(intent);
}
else {
AlertDialog.Builder dialog=new AlertDialog.Builder(RegisterActivity.this);
dialog.setMessage("两次密码不一致");
dialog.setCancelable(false);
dialog.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
});
dialog.show();
}
}
}
});
cancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(RegisterActivity.this,LoginActivity.class);
startActivity(intent);
}
});
}
}
增删改查大同小异,就不一一贴了。下面这个是增加数据的活动。
/*
* 该类为物品信息添加类,包括物品名字,件数,存放地点,存放时间,图片,以及闹钟提醒
* 通过调用系统相册来获取图片
*/
public class AddActivity extends AppCompatActivity {
private EditText name;
private EditText number;
private EditText site;
private EditText time;
private ImageView imageId;
private CheckBox remind;
private Button ok;
private Button cancel;
private Button add;
public static final int CHOOSE_PHOTO=1;
String image_path="";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_add);
name=(EditText)findViewById(R.id.name);
number=(EditText)findViewById(R.id.number);
site=(EditText)findViewById(R.id.site);
time=(EditText)findViewById(R.id.time);
remind=(CheckBox) findViewById(R.id.remind);
imageId=(ImageView)findViewById(R.id.imageId);
add=(Button)findViewById(R.id.add);
ok=(Button)findViewById(R.id.ok1);
cancel=(Button)findViewById(R.id.cancel1);
add.setOnClickListener(new View.OnClickListener() {
@Override //检查是否有权限来打开相册
public void onClick(View v) {
if (ContextCompat.checkSelfPermission(AddActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)!= PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(AddActivity.this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},CHOOSE_PHOTO);
}
else {
openAlbum();
}
}
});
ok.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) { //将输入的数据添加到数据库
final String name1=name.getText().toString();
String number1=number.getText().toString();
String site1=site.getText().toString();
String time1=time.getText().toString();
boolean remind1=false;
if (remind.isChecked()){
remind1=true;
}
else {
remind1=false;
}
Goods goods=new Goods(name1,number1,site1,time1,remind1,image_path);
goods.save();
Toast.makeText(AddActivity.this,"添加成功",Toast.LENGTH_SHORT).show();
Intent intent2=new Intent(AddActivity.this,MainActivity.class);
startActivity(intent2);
}
});
cancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(AddActivity.this,MainActivity.class);
startActivity(intent);
}
});
}
private void openAlbum(){ //打开相册函数
Intent intent=new Intent("android.intent.action.GET_CONTENT");
intent.setType("image/*");
startActivityForResult(intent,CHOOSE_PHOTO);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode){
case CHOOSE_PHOTO:
if (resultCode==RESULT_OK){
handleImage(data);
}
break;
default:
break;
}
}
@Override //调取相册时再进行判断权限
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch (requestCode){
case CHOOSE_PHOTO:
if (grantResults.length>0&&grantResults[0]==PackageManager.PERMISSION_GRANTED){
openAlbum();
}
else {
Toast.makeText(this,"you denied the permission",Toast.LENGTH_SHORT).show();
}
break;
default:
break;
}
}
private void handleImage(Intent data){ //传参过程 解析URi
String imagePath=null;
Uri uri=data.getData();
if (DocumentsContract.isDocumentUri(this,uri)) {
String docId = DocumentsContract.getDocumentId(uri);
if ("com.android.providers.media.documents".equals(uri.getAuthority())) {
String id = docId.split(":")[1];
String selection = MediaStore.Images.Media._ID + "=" + id;
imagePath = getImagePath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, selection);
} else if ("com.example.providers.downloads.documents".equals(uri.getAuthority())) {
Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), Long.valueOf(docId));
imagePath = getImagePath(contentUri, null);
}
}
else if ("content".equalsIgnoreCase(uri.getScheme())){
imagePath=getImagePath(uri,null);
}
else if ("file".equalsIgnoreCase(uri.getScheme())){
imagePath=uri.getPath();
}
displayImage(imagePath);
image_path=imagePath; //将得到的图片路径已字符串的形式保存下来
}
private String getImagePath(Uri uri, String selection){ //获得图片的路径
String path=null;
Cursor cursor=getContentResolver().query(uri,null,selection,null,null);
if (cursor!=null){
if (cursor.moveToFirst()){
path=cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
}
cursor.close();
}
return path;
}
private void displayImage(String imagePath){ //显示图片
if (imagePath!=null){
Bitmap bitmap= BitmapFactory.decodeFile(imagePath);
imageId.setImageBitmap(bitmap);
}
else {
Toast.makeText(this,"得到图像失败",Toast.LENGTH_SHORT).show();
}
}
}
这个和账号密码类差不多,就只贴这一个了。
import org.litepal.crud.DataSupport;
/*
* 该类为数据库User1中的Goods表对应的映射关系
* 物品信息的物品类
*/
public class Goods extends DataSupport {
private String name;
private String imageId;
private String number;
private String site;
private String time;
private boolean remind;
public Goods(String name, String number,String site,String time,boolean remind,String imageId){
this.name=name;
this.number=number;
this.site=site;
this.time=time;
this.remind=remind;
this.imageId=imageId;
}
public String getName(){
return name;
}
public void setName(String name){
this.name=name;
}
public String getImageId(){
return imageId;
}
public void setImageId(String imageId){
this.imageId=imageId;
}
public String getNumber(){
return number;
}
public void setNumber(String number){
this.number=number;
}
public String getSite(){
return site;
}
public void setSite(String site){
this.site=site;
}
public String getTime(){
return time;
}
public void setTime(String time){
this.time=time;
}
public boolean getRemind( ){
return remind;
}
public void setRemind(boolean remind){
this.remind=remind;
}
}
/*
* 该类为物品的显示类,当点击主界面的图片时,会跳到这个界面,从而使某个物品的详细信息显示给用户
*/
public class goodsActivity extends AppCompatActivity {
public static final String GOODS_NAME="good_name";
public static final String GOODS_IMAGE="good_image";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_goods);
Intent intent=getIntent();
String goodname=intent.getStringExtra(GOODS_NAME);
String goodImage=intent.getStringExtra(GOODS_IMAGE);
Toolbar toolbar=(Toolbar)findViewById(R.id.toolbar);
CollapsingToolbarLayout collapsingToolbarLayout=(CollapsingToolbarLayout)findViewById(R.id.collapsing_toolbar);
ImageView imageView=(ImageView)findViewById(R.id.good_image_view);
TextView textView=(TextView)findViewById(R.id.good_content_text);
ActionBar actionBar=getSupportActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);
collapsingToolbarLayout.setTitle(goodname);
Glide.with(this).load(goodImage).into(imageView);
String goodContent=generateFruitContent(goodname);
textView.setText(goodContent);
}
private String generateFruitContent(String goodname){
StringBuilder goodContent=new StringBuilder();
List<Goods> goods= DataSupport.where("name=?",goodname).find(Goods.class);
if (goods.size()>0){
goodContent.append("存放件数:"+goods.get(0).getNumber()+"\n");
goodContent.append("存放地点:"+goods.get(0).getSite()+"\n");
goodContent.append("存放时间:"+goods.get(0).getTime()+"\n");
boolean is=goods.get(0).getRemind();
if(is){
goodContent.append("是否提醒:"+"提醒"+"\n");
}
else {
goodContent.append("是否提醒:"+"不提醒");
}
}
return goodContent.toString();
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()){
case android.R.id.home:
finish();
break;
case R.id.alarm_button:
Intent intent=new Intent(goodsActivity.this,Alarm1Activity.class);
startActivity(intent);
break;
}
return super.onOptionsItemSelected(item);
}
public boolean onCreateOptionsMenu(Menu menu){
getMenuInflater().inflate(R.menu.view1,menu);
return true;
}
}
/*
* 该类为适配器,使用卡片布局使他呈正方形显示给用户,以增加界面可观性,使上半部分为图片,最后一行为文字的形式显示
*/
public class goodsAdapter extends RecyclerView.Adapter<goodsAdapter.ViewHolder>{
private Context context;
private List<Goods> goodList;
static class ViewHolder extends RecyclerView.ViewHolder{
CardView cardView;
ImageView imageView;
TextView textView;
public ViewHolder(View view){
super(view);
cardView=(CardView)view;
imageView=(ImageView)view.findViewById(R.id.good_image);
textView=(TextView)view.findViewById(R.id.good_name);
}
}
public goodsAdapter(List<Goods> goodList){
this.goodList =goodList;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (context==null){
context=parent.getContext();
}
View view= LayoutInflater.from(context).inflate(R.layout.good_item,parent,false);
final ViewHolder holder=new ViewHolder(view);
holder.cardView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int position=holder.getAdapterPosition();
Goods fruit= goodList.get(position);
Intent intent=new Intent(context,goodsActivity.class);
intent.putExtra(goodsActivity.GOODS_NAME,fruit.getName());
intent.putExtra(goodsActivity.GOODS_IMAGE,fruit.getImageId());
context.startActivity(intent);
}
});
return holder;
}
//适配器呈现结果
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
Goods fruit= goodList.get(position);
holder.textView.setText(fruit.getName());
Glide.with(context).load(fruit.getImageId()).into(holder.imageView);
}
@Override
public int getItemCount() {
return goodList.size();
}
}
最后是关于litepal关系映射。
<?xml version="1.0" encoding="utf-8" ?>
<litepal>
<dbname value="User1" ></dbname>
<version value="4"></version>
<list>
<mapping class="com.example.administrator.zhushou.User"></mapping>
<mapping class="com.example.administrator.zhushou.Goods"></mapping>
</list>
</litepal>
关于XML的视图就不放下来了。
最后是部分截图: