基于Android的本地电子书阅读器的设计与实现Ebook(3)

之前写这个只是抱着半玩的心态,没有想到有这么多网友愿意驻足浏览,十分的惊喜。这里浅浅说一下我并不是专门学软件开发的,所以如果有什么错误请多指教。
接上回分解。现在我们来到第二个界面“感悟”:请添加图片描述
fragment_login2.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:background="#fefefe"><TextViewandroid:id="@+id/note_name"android:layout_width="match_parent"android:layout_height="50dp"android:textSize="35dp"android:textColor="@android:color/white"android:gravity="center"android:textStyle="bold"android:text="感 悟"android:background="@drawable/bookbg"/><ListViewandroid:id="@+id/listview123"android:layout_width="match_parent"android:layout_height="match_parent"android:cacheColorHint="#00000000"android:divider="#E4E4E4"android:dividerHeight="1dp"android:fadingEdge="none"android:listSelector="#00000000"android:scrollbars="none"android:layout_below="@+id/note_name"android:background="@drawable/bookbg2"></ListView><ImageViewandroid:id="@+id/add"android:layout_width="wrap_content"android:layout_height="wrap_content"android:src="@drawable/add"android:layout_marginBottom="30dp"android:layout_alignParentBottom="true"android:layout_centerHorizontal="true"android:contentDescription="TODO" />
</RelativeLayout>

对应的java LoginFragment2 :

public class LoginFragment2 extends Fragment {ListView listView;List<NotepadBean> list;SQLiteHelper mSQLiteHelper;NotepadAdapter adapter;@Nullable@Overridepublic View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {View view = inflater.inflate(R.layout.fragment_login2, container, false);listView = view.findViewById(R.id.listview123);ImageView add = view.findViewById(R.id.add);add.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent = new Intent(getActivity(),RecordActivity.class);startActivityForResult(intent, 1);}});initData();return view;}protected void initData() {mSQLiteHelper = new SQLiteHelper(getActivity()); //创建数据库showQueryData();listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position, long id) {NotepadBean notepadBean = list.get(position);Intent intent = new Intent(getActivity(), RecordActivity.class);intent.putExtra("id", notepadBean.getId());intent.putExtra("time", notepadBean.getNotepadTime()); //记录的时间intent.putExtra("content", notepadBean.getNotepadContent()); //记录的内容startActivityForResult(intent, 1);}});listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {@Overridepublic boolean onItemLongClick(AdapterView<?> parent, View view, final intposition, long id) {AlertDialog dialog;AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()).setMessage("是否删除此事件?").setPositiveButton("确定", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {NotepadBean notepadBean = list.get(position);if (mSQLiteHelper.deleteData(notepadBean.getId())) {list.remove(position);adapter.notifyDataSetChanged();Toast.makeText(getActivity(), "删除成功",Toast.LENGTH_SHORT).show();}}}).setNegativeButton("取消", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {dialog.dismiss();}});dialog = builder.create();dialog.show();return true;}});}private void showQueryData() {if (list != null) {list.clear();}//从数据库中查询数据(保存的标签)list = mSQLiteHelper.query();adapter = new NotepadAdapter(getActivity(), list);listView.setAdapter(adapter);}@Overridepublic void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);if (requestCode == 1 && resultCode == 2) {showQueryData();}}}

然后我们点击添加按钮,也就是那个红红的加号,进去就是这个界面:
请添加图片描述
这里面可以添加任何你想写下的内容,比如我是梅西的球迷那么就可以写“阿根廷必胜!梅西必圆梦!”,如果你不满意左下角是删除,右边的是确认添加。
activity_record.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"android:background="#fefefe"><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="45dp"android:background="#fb7a6a"android:orientation="horizontal"><ImageViewandroid:id="@+id/note_back"android:layout_width="45dp"android:layout_height="wrap_content"android:layout_centerVertical="true"android:paddingLeft="11dp"android:src="@drawable/back" /><TextViewandroid:id="@+id/note_name"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerInParent="true"android:gravity="center"android:text="记事本"android:textColor="@android:color/white"android:textSize="35dp"android:textStyle="bold" /></RelativeLayout><TextViewandroid:id="@+id/tv_time"android:layout_width="match_parent"android:layout_height="wrap_content"android:textSize="15sp"android:paddingTop="10dp"android:paddingBottom="10dp"android:gravity="center"android:visibility="gone"android:textColor="#689F38"/><EditTextandroid:id="@+id/note_content"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_weight="1"android:gravity="top"android:hint="请输入要添加的内容"android:paddingLeft="5dp"android:textColor="@android:color/black"android:background="#fefefe" /><Viewandroid:layout_width="match_parent"android:layout_height="1dp"android:background="#689F38"/><LinearLayoutandroid:layout_width="match_parent"android:layout_height="55dp"android:orientation="horizontal"><ImageViewandroid:id="@+id/delete"android:layout_width="0dp"android:layout_weight="1"android:layout_height="wrap_content"android:src="@drawable/delete"android:paddingBottom="15dp"android:paddingTop="9dp"/><ImageViewandroid:id="@+id/note_save"android:layout_width="0dp"android:layout_weight="1"android:layout_height="wrap_content"android:src="@drawable/save_note"android:paddingBottom="15dp"android:paddingTop="9dp"/></LinearLayout>
</LinearLayout>

RecordActivity:

public class RecordActivity extends Activity implements View.OnClickListener {ImageView note_back;TextView note_time;EditText content;ImageView delete;ImageView note_save;SQLiteHelper mSQLiteHelper;TextView noteName;String id;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_record);note_back = (ImageView) findViewById(R.id.note_back);note_time = (TextView)findViewById(R.id.tv_time);content = (EditText) findViewById(R.id.note_content);delete = (ImageView) findViewById(R.id.delete);note_save = (ImageView) findViewById(R.id.note_save);noteName = (TextView) findViewById(R.id.note_name);note_back.setOnClickListener(this);delete.setOnClickListener(this);note_save.setOnClickListener(this);initData();}protected void initData() {mSQLiteHelper = new SQLiteHelper(this);noteName.setText("添加记录");Intent intent = getIntent();if(intent!= null){id = intent.getStringExtra("id");if (id != null){noteName.setText("修改记录");content.setText(intent.getStringExtra("content"));note_time.setText(intent.getStringExtra("time"));note_time.setVisibility(View.VISIBLE);}}}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.note_back:finish();break;case R.id.delete:content.setText("");break;case R.id.note_save:String noteContent=content.getText().toString().trim();if (id != null){//修改操作if (noteContent.length()>0){if (mSQLiteHelper.updateData(id, noteContent, DBUtils.getTime())){showToast("修改成功");setResult(2);finish();}else {showToast("修改失败");}}else {showToast("修改内容不能为空!");}}else {//向数据库中添加数据if (noteContent.length()>0){if (mSQLiteHelper.insertData(noteContent, DBUtils.getTime())){showToast("保存成功");setResult(2);finish();}else {showToast("保存失败");}}else {showToast("修改内容不能为空!");}}break;}}public void showToast(String message){Toast.makeText(RecordActivity.this,message,Toast.LENGTH_SHORT).show();}
}

保存之后我们会返回感悟的界面现在就会有我们之前写下的记录,长按是可以删除的:
请添加图片描述
以上的这些是要依托数据库的构建才能实现的,文件有三:
在这里插入图片描述
构建个适配器NotepadAdapter:

public class NotepadAdapter extends BaseAdapter {private LayoutInflater layoutInflater;private List<NotepadBean> list;public NotepadAdapter(Context context, List<NotepadBean> list){this.layoutInflater=LayoutInflater.from(context);this.list=list;}@Overridepublic int getCount() {return list==null ? 0 : list.size();}@Overridepublic Object getItem(int position) {return list.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ViewHolder viewHolder;if (convertView==null){convertView=layoutInflater.inflate(R.layout.notepad_item_layout,null);viewHolder=new ViewHolder(convertView);convertView.setTag(viewHolder);}else {viewHolder=(ViewHolder) convertView.getTag();}NotepadBean noteInfo=(NotepadBean) getItem(position);viewHolder.tvNoteoadContent.setText(noteInfo.getNotepadContent());viewHolder.tvNotepadTime.setText(noteInfo.getNotepadTime());return convertView;}class ViewHolder{TextView tvNoteoadContent;;TextView tvNotepadTime;public ViewHolder(View view){tvNoteoadContent=(TextView) view.findViewById(R.id.item_content);tvNotepadTime=(TextView) view.findViewById(R.id.item_time);}}
}

NotepadBean:

public class NotepadBean {private String id;                  //记录的idprivate String notepadContent;   //记录的内容private String notepadTime;       //保存记录的时间public String getId() {return id;}public void setId(String id) {this.id = id;}public String getNotepadContent() {return notepadContent;}public void setNotepadContent(String notepadContent) {this.notepadContent = notepadContent;}public String getNotepadTime() {return notepadTime;}public void setNotepadTime(String notepadTime) {this.notepadTime = notepadTime;}
}

这个是重中之重,实现了数据库的增删改查
SQLiteHelper:

public class SQLiteHelper extends SQLiteOpenHelper {private SQLiteDatabase sqLiteDatabase;//创建数据库public SQLiteHelper(Context context){super(context, DBUtils.DATABASE_NAME, null, DBUtils.DATABASE_VERION);sqLiteDatabase = this.getWritableDatabase();}//创建表@Overridepublic void onCreate(SQLiteDatabase db) {db.execSQL("create table "+DBUtils.DATABASE_TABLE+"("+DBUtils.NOTEPAD_ID+" integer primary key autoincrement,"+ DBUtils.NOTEPAD_CONTENT +" text," + DBUtils.NOTEPAD_TIME+ " text)");}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {}//添加数据public boolean insertData(String userContent,String userTime){ContentValues contentValues=new ContentValues();contentValues.put(DBUtils.NOTEPAD_CONTENT,userContent);contentValues.put(DBUtils.NOTEPAD_TIME,userTime);returnsqLiteDatabase.insert(DBUtils.DATABASE_TABLE,null,contentValues)>0;}//删除数据public boolean deleteData(String id){String sql=DBUtils.NOTEPAD_ID+"=?";String[] contentValuesArray=new String[]{String.valueOf(id)};returnsqLiteDatabase.delete(DBUtils.DATABASE_TABLE,sql,contentValuesArray)>0;}//修改数据public boolean updateData(String id,String content,String userYear){ContentValues contentValues=new ContentValues();contentValues.put(DBUtils.NOTEPAD_CONTENT,content);contentValues.put(DBUtils.NOTEPAD_TIME,userYear);String sql=DBUtils.NOTEPAD_ID+"=?";String[] strings=new String[]{id};returnsqLiteDatabase.update(DBUtils.DATABASE_TABLE,contentValues,sql,strings)>0;}//查询数据public List<NotepadBean> query(){List<NotepadBean> list=new ArrayList<NotepadBean>();Cursor cursor=sqLiteDatabase.query(DBUtils.DATABASE_TABLE,null,null,null,null,null,DBUtils.NOTEPAD_ID+" desc");if (cursor!=null){while (cursor.moveToNext()){NotepadBean noteInfo=new NotepadBean();@SuppressLint("Range") String id = String.valueOf(cursor.getInt(cursor.getColumnIndex(DBUtils.NOTEPAD_ID)));@SuppressLint("Range") String content = cursor.getString(cursor.getColumnIndex(DBUtils.NOTEPAD_CONTENT));@SuppressLint("Range") String time = cursor.getString(cursor.getColumnIndex(DBUtils.NOTEPAD_TIME));noteInfo.setId(id);noteInfo.setNotepadContent(content);noteInfo.setNotepadTime(time);list.add(noteInfo);}cursor.close();}return list;}
}

第三部分是一个分类,按照当初我的设想是与书架联系起来,但是肝到后面就累了,就简简单单实现一个分类,有亿丢丢粗糙,别介意哈。
请添加图片描述
fragment_login3.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="horizontal"tools:context=".LoginFragment3"><LinearLayoutandroid:layout_weight="1"android:layout_width="0dp"android:layout_height="match_parent"android:orientation="vertical"><TextViewandroid:id="@+id/lg3_textView3"android:layout_width="match_parent"android:layout_height="50dp"android:text="分  类"android:gravity="center"android:textSize="35dp"android:textColor="@color/white"android:background="@drawable/bookbg"></TextView><ListViewandroid:id="@+id/lg3_listView"android:textSize="35dp"android:gravity="center"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@drawable/bookbg2"/></LinearLayout></LinearLayout>

LoginFragment3:

public class LoginFragment3 extends Fragment implements AdapterView.OnItemClickListener{
ListView listView;
SimpleAdapter simpleAdapter;public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {View view = inflater.inflate(R.layout.fragment_login3, container, false);listView = view.findViewById(R.id.lg3_listView);simpleAdapter = new SimpleAdapter(getActivity(),getData(),R.layout.item3,new String[]{"title"},new int[]{R.id.item_tv});listView.setAdapter(simpleAdapter);listView.setOnItemClickListener(this);return view;}private List<Map<String,Object>> getData() {String [] titles={"玄幻","都市","科幻","历史","添加书籍"};List<Map<String,Object>> list= new ArrayList<>();for(int i=0;i<5;i++){Map  map = new HashMap();map.put("title",titles[i]);list.add(map);}return list;}public void onActivityCreated(@Nullable Bundle savedInstanceState) {super.onActivityCreated(savedInstanceState);}@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position, long id) {switch(position){case 0:Intent intent1=new Intent(getActivity(),jiemian1.class);startActivity(intent1);break;case 1:Intent intent2=new Intent(getActivity(),jiemian2.class);startActivity(intent2);break;case 2:Intent intent3=new Intent(getActivity(),jiemian3.class);startActivity(intent3);break;case 3:Intent intent4=new Intent(getActivity(),jiemian4.class);startActivity(intent4);break;case 4:Intent intent5=new Intent(getActivity(),jiemian5.class);startActivity(intent5);break;default:throw new IllegalStateException("Unexpected value: " + position);}}
}

点击添加:
请添加图片描述
activity_jiemian5.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context=".MainActivity"android:background="@drawable/bookbg2"><TextViewandroid:id="@+id/lg3_textView3"android:layout_width="match_parent"android:layout_height="50dp"android:text="添加书籍"android:gravity="center"android:textSize="35dp"android:textColor="@color/white"android:background="@drawable/bookbg"></TextView><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"android:padding="10dp"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:maxLines="1"android:text="书籍名"></TextView><EditTextandroid:id="@+id/bookname"android:layout_width="match_parent"android:layout_height="wrap_content"></EditText></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"android:padding="10dp"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:maxLines="1"android:text="类型"></TextView><EditTextandroid:id="@+id/sort1"android:layout_width="match_parent"android:layout_height="wrap_content"></EditText></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"android:padding="10dp"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:maxLines="1"android:text="作者"></TextView><EditTextandroid:id="@+id/author"android:layout_width="match_parent"android:layout_height="wrap_content"></EditText></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="100dp"android:orientation="horizontal"android:padding="10dp"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:maxLines="1"android:text="简介"></TextView><EditTextandroid:id="@+id/short1"android:layout_width="match_parent"android:layout_height="wrap_content"></EditText></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="100dp"android:orientation="horizontal"android:padding="10dp"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:maxLines="1"android:text="内容"></TextView><EditTextandroid:id="@+id/judge"android:layout_width="match_parent"android:layout_height="30dp"></EditText></LinearLayout><Buttonandroid:onClick="insert"android:layout_width="200dp"android:layout_height="50dp"android:text="上传书籍"android:layout_gravity="center"></Button></LinearLayout>

jiemian5 :

public class jiemian5 extends AppCompatActivity {private EditText bookname,sort1,author,short1,judge;private  MySQLiteOpenHelper mySQLiteOpenHelper;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_jiemian5);initview();mySQLiteOpenHelper = new MySQLiteOpenHelper(this);}private void initview() {bookname = findViewById(R.id.bookname);sort1 = findViewById(R.id.sort1);author = findViewById(R.id.author);short1 = findViewById(R.id.short1);judge = findViewById(R.id.judge);}public void insert(View view) {String Ebookname = bookname.getText().toString().trim();String Esort1 = sort1.getText().toString().trim();String Eauthor = author.getText().toString().trim();String Eshort1 = short1.getText().toString().trim();String Ejudge = judge.getText().toString().trim();Ebook ebook1 = new Ebook();ebook1.setBookname(Ebookname);ebook1.setAuthor(Eauthor);ebook1.setSort1(Esort1);ebook1.setEshort1(Eshort1);ebook1.setEjudge(Ejudge);long rowid = mySQLiteOpenHelper.insertbook(ebook1);if (rowid != -1){Toast.makeText(this,"添加成功!",Toast.LENGTH_SHORT).show();}else {Toast.makeText(this,"添加失败!",Toast.LENGTH_SHORT).show();}}
}

因为不能实现与前面的联动,那只好自己输入数据咯,输入完后看看效果:
请添加图片描述
说明下我是不看网络小说的,以上内容是某度推荐的,如有错误还请海涵。
这四个内容差不多,我以第一个举例:
在这里插入图片描述
activity_jiemian1.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context=".jiemian1"android:background="@drawable/bookbg2"><TextViewandroid:id="@+id/lg3_textView3"android:layout_width="match_parent"android:layout_height="50dp"android:text="玄幻"android:gravity="center"android:textSize="35dp"android:textColor="@color/white"android:background="@drawable/bookbg"></TextView><ListViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/listview1"android:background="@drawable/bookbg2"></ListView>
</LinearLayout>

jiemian1:

public class jiemian1 extends AppCompatActivity {private ListView listView;private  MySQLiteOpenHelper mySQLiteOpenHelper;private Cursor cursor;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_jiemian1);mySQLiteOpenHelper = new MySQLiteOpenHelper(this);listView = findViewById(R.id.listview1);final SimpleAdapter adapter = new SimpleAdapter(this, getData(), R.layout.list_item, new String[]{"a", "b", "c"}, new int[]{R.id.booknamex, R.id.authorx, R.id.shortx} );listView.setAdapter(adapter);}private List<Map<String,Object>> getData() {SQLiteDatabase db = mySQLiteOpenHelper.getWritableDatabase();String Eguanjianzi = "玄幻";List<Map<String,Object>> list = new ArrayList<>();cursor = db.query("Ebook008", null, "sort like ?", new String[]{Eguanjianzi}, null, null, null);while (cursor.moveToNext()) {String bookname = cursor.getString(1);String author = cursor.getString(3);String short1 = cursor.getString(4);Map map = new HashMap();map.put("a", bookname);map.put("b", author);map.put("c", short1);list.add(map);}cursor.close();return list;}}

然后仍是一个数据库:
MySQLiteOpenHelper

public class MySQLiteOpenHelper extends SQLiteOpenHelper {public MySQLiteOpenHelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) {super(context, name, factory, version);}private static final String DB_NAME = "mysqlite008.db";private static final String TABLE_NAME_EBOOK = "Ebook008";private static final String create_table_sql = "create table " + TABLE_NAME_EBOOK + "(id integer primary key autoincrement, bookname text ,sort text ,author text,short text,judge text)";public MySQLiteOpenHelper(Context context) {super(context, DB_NAME, null, 1);}@Overridepublic void onCreate(SQLiteDatabase db) {db.execSQL(create_table_sql);}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {}public long insertbook(Ebook ebook) {SQLiteDatabase db = getWritableDatabase();ContentValues values = new ContentValues();values.put("bookname", ebook.getBookname());values.put("sort", ebook.getSort1());values.put("author", ebook.getAuthor());values.put("short", ebook.getEshort1());values.put("judge", ebook.getEjudge());return db.insert(TABLE_NAME_EBOOK, null, values);}public  List<Ebook>  chaxun(String guanjianzi){List<Ebook> ebooks = new ArrayList<>();SQLiteDatabase db = getWritableDatabase();Cursor cursor = db.query(TABLE_NAME_EBOOK,null,"sort like ?",new String[]{guanjianzi},null,null,null);if (cursor!= null){while (cursor.moveToNext()){String bookname = cursor.getString(1);String sort1 = cursor.getString(2);String author = cursor.getString(3);String short1 = cursor.getString(4);String judge =cursor.getString(5);Ebook ebook1 = new Ebook();ebook1.setBookname(bookname);ebook1.setSort1(sort1);ebook1.setAuthor(author);ebook1.setEshort1(short1);ebook1.setEjudge(judge);ebooks.add(ebook1);}
//            cursor.close();}return  ebooks;}
}

最后有几个小的xml布局文件可能前面没给到,本来想这次直接给的,但是不知道是这次编写的太长还是什么的,我现在打字都很卡,人麻了,就先告退了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/55213.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

电子书《Head First Android 开发》百度网盘链接

电子书《Head First Android 开发》&#xff0c;很不错的一本学习安卓的书&#xff0c;需要的可以使用百度网盘 链接&#xff1a;https://pan.baidu.com/s/1bYR0fKK2c0qU-T45Hg6nDQ 提取码&#xff1a;c6pn 目录&#xff1a;

基于Android的本地电子书阅读器的设计与实现Ebook(终章)

昨天写到最后实在是卡的受不了了&#xff0c;今天把这个写完。 最后就是补充几个xml&#xff0c;不知道前面有没有放&#xff0c;在这里补充下。 应该有五个是遗漏的&#xff1a; 我在这里按照顺序依次给出代码&#xff0c;就不标名字了 <?xml version"1.0" enc…

安卓电子书格式_不用电脑,6招教你把手机上的电子书传输到Kindle上

点击 上方蓝字 查看你有多少朋友在悄悄关注 本文共 15 68 字 预计阅读时间: 2 分钟 相信每位Kindler都会有这样的生活场景——出门在外,不易携带电脑,手头上只能带轻量级的设备,比如带一部可以上网的手机,一台Kindle。 在这种场景下,如果Kindle上没有想看的书,而手机上却…

基于安卓的电子书阅读器

功能描述&#xff1a; 1&#xff1a;用户在使用软件前需要先对软件进行注册&#xff0c;注册完成后通过账号和密码登录成功后&#xff0c;才可以对软件进行使用 2&#xff1a;用户登录成功后可以查看最新书籍信息&#xff0c;以及数据的分类&#xff0c;排行等信息&#xff0c;…

epub文件是什么文件?如何用安卓手机打开?

大家在查找资料时&#xff0c;越来越多的遇见epub格式了。其实EPUB是一种电子文档格式&#xff0c; 如同word txt pdf一样可以承载很多文字信息。但在这种格式中&#xff0c;使用了不同的开放标准。区别在于&#xff0c;EPub文件属于一种可以“自动重新编排”的文件&#xff1b…

安卓手机电子书阅读器的使用体验及对比

写在前面 由于一些原因, 我一直使用安卓手机, 在安卓上查看PDF, 我经历了几个不同的阶段, 但是体验多多少少会有一些不好, 直到最近, 我才在一篇博客中找到了一款软件, 名为readera, 可以说完美解决了之前各种软件中的一些缺点与不足了. 下面从我的各个阶段使用 的PDF阅读器开…

安卓手机上最好的3个mobi阅读器

如epub、azw3一样&#xff0c;mobi也是一种常见的电子书格式&#xff0c;它可以用亚马逊电子设备打开阅读&#xff0c;但是在手机上应该怎么打开呢&#xff1f;其实通过一些支持mobi格式的阅读器就可以打开。今天小编就为大家推荐3个在安卓手机上可用的mobi阅读器。 第一款&am…

下载了免费的txt电子书,如何用安卓手机打开?

小编在通勤的时候&#xff0c;经常会看到身边的人在拿着手机看小说&#xff0c;看来喜欢使用手机阅读的人真的越来越多了。今天小编就为大家推荐几款良心的安卓手机TXT阅读器&#xff0c;使用这些阅读器&#xff0c;读TXT电子书的体验更好哦&#xff01;一起来看看吧&#xff0…

mobi怎么在Android手机上打开?

mobi格式之所以流行主要是源于亚马逊官网的电子书格式以及Kindle&#xff0c;mobi格式的文件无法直接用阅读器打开&#xff0c;而我们在日常生活中经常用手机打开文件阅读。今天小编就向大家分享mobi怎么在Android手机上打开&#xff1f; mobi文件转码为epub文件 首先&#xf…

epub电子书如何用安卓手机打开?

现在网络上有很多epub格式的小说资源&#xff0c;但很多手机由于自身不能直接打开epub格式文件&#xff0c;或者阅读软件使用感较差&#xff0c;会我们的阅读带来不小的困扰。今天我就为大家介绍3款可以在安卓手机上打开epub的小说阅读器。 第一款&#xff1a;Neat Reader 这…

azw3电子书如何用安卓手机打开?

现在网络上有很多azw3格式的小说资源&#xff0c;但这个格式是适配亚马逊kindle的&#xff0c;很多手机由于自身不能直接打开azw3格式文件&#xff0c;会我们的阅读带来不小的困扰。今天我就为大家介绍3款可以在安卓手机上打开azw3的小说阅读器。 第一款&#xff1a;Neat Read…

txt电子书如何用安卓手机完美打开?

在手机上看小说&#xff0c;好的阅读器可以使阅读体验锦上添花。下面为大家推荐几款安卓手机上的txt阅读器&#xff0c;供大家尝试。 第一款&#xff1a;Neat Reader 这款阅读器界面设计相当整洁&#xff0c;色调以淡蓝色和白色为主&#xff0c;整体阅读视觉感舒适&#xff0c…

验证码过期(小功能)

作用&#xff1a;模拟获取验证码&#xff0c;10s后&#xff0c;重新获取。未过期前不可重复获取&#xff1b; <% page language"java" import"java.util.*" pageEncoding"utf-8"%> <% String path request.getContextPath(); String b…

马斯克血洗推特!传机器学习裁员90%,团队直接解散

【导读】马氏推特裁员迎来大结局&#xff01;员工互相告别&#xff0c;「血色星期五」来了。 周五&#xff0c;推特大裁员正式开始&#xff01; 据称已经有3700多名员工卷铺盖走人了。按照推特7500人左右的员工数量来看&#xff0c;看起来猜50%的人赌对了。 大家&#xff0c…

NC:恢复菌群多样性或能降低耐药性

文章目录 建筑环境中的人为微生物耐药性热心肠日报 摘要背景结果限制与微生物多样性减少相关附表1. 基于单个宏基因组样品blastx比对NCBI NR估计Alpha多样性图1. 宏基因组数据物种和功能香农多样性指数组间比较附图1. 16S物种香农多样性指数组间比较 环境差异与微生物组相关图2…

艾美捷抗人干扰素α单抗(MT1),灵敏且高特异性

IFN-α2 干扰素-α&#xff08;IFN-α&#xff0c;也称为IFN-α、IFN-α、IFNA和干扰素-α&#xff09;是一种I型干扰素。人类有 13 种 IFN-α 亚型&#xff1a;IFN-α 1、2、4、5、6、7、8、10、13、14、16、17 和 21。与其他亚型一样&#xff0c;干扰素-α2 (IFN- α2&#…

宏病毒组研究大放异彩!| 凌恩生物1-5月高分宏病毒组文章大盘点!

凌恩生物现已在宏组学、基因组、表观遗传以及蛋白代谢等多组学及联合分析领域积累了深厚经验&#xff0c;打造出成熟的科研服务平台&#xff0c;以优质售前方案和优秀售后服务助力客户在Nature、Science、PNAS、ISME和MIcrobiome等高端国际期刊上发表了大量文章。 伴随着组学技…

Nature-2018-抗菌药物组合有望特异性治疗耐多药性的细菌感染

本文由同济大学赵晗编译&#xff0c;宏基因组公众号编辑。 抗菌药物组合的物种特异活性 Species-specific activity of antibacterial drug combinations (Nature,IF: 41.577) 一、摘要 抗菌药物耐药性的传播已经成为一个日渐严重的公共健康问题&#xff0c;它使得曾经可…

生命早期肠道微生物组和疫苗功效

疫苗是公共卫生领域最伟大的成就之一&#xff0c;每年可预防数百万儿童疾病和死亡病例。然而&#xff0c;许多疫苗的功效在地理和社会经济不同地区的婴儿之间可能存在很大差异。 有研究发现&#xff0c;肠道微生物组组成的差异已成为解释免疫结果差异的主要因素之一。 在本篇文…

细菌感染和抗生素使用

谷禾健康 人的身体拥有数千种细菌&#xff0c;这些细菌在维持健康方面发挥着重要作用。当这些细菌失控繁殖并侵入身体的其他部位或将有害细菌引入身体的系统时&#xff0c;可能会发生细菌感染。 细菌感染的严重程度取决于所涉及的细菌类型和所感染的部位等。细菌最常感染肠道、…