项目介绍
动画加载
导入依赖
implementation'com.airbnb.android:lottie:3.4.1'
注册登录功能
ViewPager实现注册登录功能(开源)
滑动和点击实现注册登录界面的切换,用两个fragment,实现注册登录片段,通过SharedPreferences实现注册数据的保存,和登录密码的验证,以LoginActivity为载体,用getActivity()获得当前的Activity。
在SignupFragment中使用editor保存用户注册的数据,在LoginTabFragment中用getUserinfo方法获得SharedPreferences存储的数据。
主界面功能实现
历史记录展示,recyclerview的适配器中,onCreateViewHolder用于加载相应视图,onBindViewHolder用于得到相关数据,以及对记事点击的监听,处理每一个item的点击事件,即记事的修改功能,MyViewHolder类用于装载一个记录。
用轻量级数据库SQLite,新建一个表,在CRUD文件中实现数据的增删改查,相关数据库操作,用mode关键词区分用户是需要修改还是新增一个记事,
startActivityForResult方法,用于得到用户输入的信息,在编辑已有记录的时候,需传入一个id值,用于在数据库中找到该条记录,对数据进行修改。
删除所有记录按钮,弹出一个确认删除窗口,若确认则删除所有记录。
OnActivityResult,处理Activity传回来的相关数据
主页面后端处理逻辑:
package com.example.myapplication6;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.viewpager.widget.ViewPager;
import android.annotation.SuppressLint;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
FloatingActionButton btn;
private ViewPager viewPager;
Button clo;
Button user;
FloatingActionButton dtn;
private NoteDatabase dbHelper;
private Context context=this;
private recycleAdapter adapter;
private RecyclerView rv;
private List<Note> noteList=new ArrayList<>();
@SuppressLint("MissingInflatedId")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn=findViewById(R.id.fab);
rv=findViewById(R.id.rv_1);
dtn=findViewById(R.id.delete);
clo=findViewById(R.id.cloth);
user=findViewById(R.id.sitimg);
adapter=new recycleAdapter(MainActivity.this,noteList);
rv.setAdapter(adapter);
refreshrecycleView();
rv.setLayoutManager(new LinearLayoutManager(MainActivity.this,LinearLayoutManager.VERTICAL,false));
//添加记录
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent=new Intent(MainActivity.this,EditActivity.class);
intent.putExtra("mode",4);
startActivityForResult(intent,0);
}
});
//生活指标展示
clo.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent=new Intent(MainActivity.this, WebvisitActivity.class);
startActivity(intent);
}
});
//个人中心
user.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent=new Intent(MainActivity.this, User.class);
startActivity(intent);
}
});
//删除所有记录
dtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
/*将确认界面加载到对话框中*/
View viewLogin = LayoutInflater.from(MainActivity.this).inflate(R.layout.layout_dialog, null);
AlertDialog.Builder builderLogin = new AlertDialog.Builder(MainActivity.this);
builderLogin.setView(viewLogin);
/*为确认删除对话框设置相关属性*/
builderLogin.setMessage("")
.setCancelable(false)
.setPositiveButton("确定",null)
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
dialogInterface.dismiss();
}
});
/*使用AlertDialog.Builder的create( )方法来创建AlertDialog实例,并显示该对话框*/
AlertDialog alertDialog = builderLogin.create();
alertDialog.show();
alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
CRUD op=new CRUD(context);
op.open();
op.Deleteall();
op.close();
refreshrecycleView();
alertDialog.dismiss();
}
});
}
});
}
//接收startActivityForResult的结果
protected void onActivityResult(int requestCode,int resultCode,Intent data) {
int returnMode;
long note_Id;
returnMode=data.getExtras().getInt("mode",-1);
note_Id=data.getExtras().getLong("id",0);
int tag=data.getExtras().getInt("tag",1);
//修改笔记
if(returnMode==1){
String content=data.getStringExtra("content");
String time=data.getStringExtra("time");
Note note=new Note(content,time,tag);
note.setId(note_Id);
CRUD op=new CRUD(context);
op.open();
op.updateNote(note);
op.close();
}
//新建笔记
else if(requestCode==0){
String content=data.getStringExtra("content");
String time=data.getStringExtra("time");
Note note=new Note(content,time,tag);
CRUD op=new CRUD(context);
op.open();
op.addNote(note);
op.close();
}
//其他情况不做处理
else{}
refreshrecycleView();
super.onActivityResult(requestCode, resultCode, data);
}
//刷新一次
public void refreshrecycleView(){
CRUD op=new CRUD(context);
op.open();
if (noteList.size()>0) {
noteList.clear();
}
noteList.addAll(op.getAllNote());
op.close();
adapter.notifyDataSetChanged();
}
}
笔记编辑页面后端逻辑:
package com.example.myapplication6;
import android.annotation.SuppressLint;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import java.text.SimpleDateFormat;
import java.util.Date;
public class EditActivity extends AppCompatActivity {
EditText editText;
private Button bt;
private String old_content="";
private String old_time="";
private int old_Tag=1;
private long id=0;
private int openMode=0;
public Intent intent=new Intent();
@SuppressLint("MissingInflatedId")
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.edit_layout);
editText=findViewById(R.id.edit);
bt=findViewById(R.id.button);
//点击每条记录拿到内容显示编辑界面
Intent getIntent=getIntent();
int openMode=getIntent.getIntExtra("mode",0);
id=getIntent.getLongExtra("id",0);
//点击的是一个已经写好的笔记
if(openMode==3){
old_content = getIntent.getStringExtra("content");
old_time=getIntent.getStringExtra("time");
old_Tag=getIntent.getIntExtra("tag",1);
editText.setText(old_content);
//设置光标的位置,在文本最后
editText.setSelection(old_content.length());
}
bt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
autoSetMessage();
setResult(RESULT_OK,intent);
//结束该进程活动
finish();
}
public void autoSetMessage(){
//新建一个笔记
if(openMode==4){
if(editText.getText().toString().length()==0){
intent.putExtra("mode",-1);//没有输入内容
}
else{
intent.putExtra("mode",0);//新建一个笔记
intent.putExtra("content",editText.getText().toString());
intent.putExtra("time",dateToStr());
}
}
//打开已有笔记
else{
if(editText.getText().toString().equals(old_content)){
intent.putExtra("mode",-1);//没有改变笔记内容
}
else{
intent.putExtra("mode",1);//修改笔记内容
intent.putExtra("content",editText.getText().toString());
intent.putExtra("time",dateToStr());
intent.putExtra("id",id);
}
}
}
});
}
//将时间记录转变成想要的格式
public String dateToStr(){
Date date =new Date();
SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return simpleDateFormat.format(date);
}
}
网络访问实现
通过webview设置网页显示的位置,在webActivity中定义WebSettings,加载网页链接,返回网页数据.
网络访问后端逻辑:
package com.example.myapplication6;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Button;
import androidx.appcompat.app.AppCompatActivity;
public class WebvisitActivity extends AppCompatActivity {
Button bt;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.webview);
bt=findViewById(R.id.back);
WebView web=findViewById(R.id.web);
/*开启DOM存储API权限,并允许执行JS*/
WebSettings webSettings=web.getSettings();
webSettings.setDomStorageEnabled(true);
webSettings.setJavaScriptEnabled(true);
/*打开网页时不调用系统浏览器,而是在本WebView中显示*/
web.setWebViewClient(new WebViewClient());
web.loadUrl("https://m.baidu.com/sf?county_id=101250101&dspName=iphone&ext=%7B%22bar_sort%22%3A%22chuanyi%2Cchuyou%2Cxiche%2Cganmao%2C%22%2C%22sf_tab_name%22%3A%22chuanyi%22%7D&from_sf=1&fromapp=vsgo&openapi=1&pd=life_compare_weather&resource_id=4599&title=%E7%94%9F%E6%B4%BB%E6%B0%94%E8%B1%A1%E6%8C%87%E6%95%B0&word=%E9%95%BF%E6%B2%99&fromSite=pc");//加载网页
bt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent=new Intent();
finish();
}
});
}
}
项目目前还有很多有待完善的地方,如将用户注册登录的数据用SQLite存储会更加合理,即用户不需要返回应用加载页面,且用户可以用多个账户登录
在功能方面也还有待完善的地方,如单个记事的删除等。