移动开发大作业————随手记(主界面和编辑界面)
功能需求
随手记的功能
1编辑增加笔记
2.自由查看修改保存的笔记
3.自由填写文字和图片
主界面编写
MainActivity.java
package com.cong.notepad;import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Timer;
import java.util.TimerTask;
import android.os.Bundle;
import android.os.Environment;
import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
import android.util.Log;
import android.view.ContextMenu;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.View.OnClickListener;
import android.view.View.OnCreateContextMenuListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ImageButton;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends Activity {private TextView addtravels;private ListView travelslist;private DBManage dm=null;private HTMLManager HM=null;public Cursor cursor = null;public Cursor cursor2=null;private int i=0;private int start=0;private int end=0;private String str1=null;private String str2="[";private String str4="]";private String iconname=null;private File copyfromfile=null;private File copyintofile=null;private FileOutputStream copyinto=null;private FileInputStream copyfrom=null;private ListViewAdd adapter;// 数据源对象private static Boolean isExit = false; private static Boolean hasTask = false;public static final String CHECK_STATE = "0";public static final String EDIT_STATE = "1";public static final String ALERT_STATE = "2";Timer tExit = new Timer(); TimerTask task = new TimerTask() { @Override public void run() { isExit = true; hasTask = true; } }; @Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);addtravels=(TextView)findViewById(R.id.addtravels);addtravels.setOnClickListener(new addListener());travelslist=(ListView)findViewById(R.id.travelslist);dm=new DBManage(this);HM=new HTMLManager();initAdapter(); travelslist.setAdapter(adapter);travelslist.setOnItemClickListener(new myOnItemClickListener());travelslist.setOnCreateContextMenuListener(new myOnCreateContextMenuListener());//设置长按监听器}class addListener implements OnClickListener{public void onClick(View v) {// TODO Auto-generated method stubIntent intent=new Intent();intent.setClass(MainActivity.this, edittravels.class);intent.putExtra("state", EDIT_STATE);startActivity(intent);finish();}}public void initAdapter(){dm.open();//打开数据库操作对象cursor = dm.selectAll();//获取所有数据cursor.moveToFirst();//将游标移动到第一条数据,使用前必须调用int count = cursor.getCount();//个数ArrayList<String> items = new ArrayList<String>();ArrayList<String> times = new ArrayList<String>();for(int i= 0; i < count; i++){items.add(cursor.getString(cursor.getColumnIndex("title")));times.add(cursor.getString(cursor.getColumnIndex("time")));cursor.moveToNext();//将游标指向下一个}dm.close();//关闭数据操作对象adapter = new ListViewAdd(this,items,times);//创建数据源}public class myOnCreateContextMenuListener implements OnCreateContextMenuListener{public void onCreateContextMenu(ContextMenu menu, View v,ContextMenuInfo menuInfo) {// TODO Auto-generated method stubfinal AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo;menu.setHeaderTitle("");//设置选项Log.i("log", "chooseing menu");menu.add(0,0,0,"删除");menu.add(0,1,0,"修改");menu.add(0,2,0,"查看");menu.add(0,3,0,"导出到SD卡");}}public boolean onContextItemSelected(MenuItem item){AdapterView.AdapterContextMenuInfo menuInfo = (AdapterView.AdapterContextMenuInfo)item.getMenuInfo();dm.open();switch(item.getItemId()){case 0://删除Log.i("log", "selectItem---->"+item.getItemId());try{Log.i("log", "cursor ready move ");Log.i("log", "menuInfo position "+menuInfo.position);cursor.moveToPosition(menuInfo.position);Log.i("log", "cursor move success");int i = dm.delete(Long.parseLong(cursor.getString(cursor.getColumnIndex("_id"))));//删除数据adapter.removeListItem(menuInfo.position);//删除数据adapter.notifyDataSetChanged();//通知数据源,数据已经改变,刷新界面dm.close();}catch(Exception ex){ex.printStackTrace();}break;case 1://修改// Log.v("show", "chenggong2");try{cursor.moveToPosition(menuInfo.position);//用于Activity之间的通讯Intent intent = new Intent();//通讯时的数据传送intent.putExtra("id", cursor.getString(cursor.getColumnIndex("_id")));intent.putExtra("state", ALERT_STATE);intent.putExtra("title", cursor.getString(cursor.getColumnIndex("title")));intent.putExtra("time", cursor.getString(cursor.getColumnIndex("time")));intent.putExtra("content", cursor.getString(cursor.getColumnIndex("content")));//设置并启动另一个指定的Activityintent.setClass(MainActivity.this, edittravels.class);MainActivity.this.startActivity(intent);finish();}catch(Exception ex){ex.printStackTrace();}break;case 2://查看// Log.v("show", "chenggong3");try{cursor.moveToPosition(menuInfo.position);Intent intent = new Intent();intent.putExtra("id", cursor.getString(cursor.getColumnIndex("_id")));intent.putExtra("title", cursor.getString(cursor.getColumnIndex("title")));intent.putExtra("time", cursor.getString(cursor.getColumnIndex("time")));intent.putExtra("content", cursor.getString(cursor.getColumnIndex("content")));intent.setClass(MainActivity.this, checktravels.class);MainActivity.this.startActivity(intent);}catch(Exception ex){ex.printStackTrace();}break;case 3:try{cursor.moveToPosition(menuInfo.position);String title=cursor.getString(cursor.getColumnIndex("title"));String content=cursor.getString(cursor.getColumnIndex("content"));HM.htmlmanager(title, content);copyicon(title,content);Toast.makeText(MainActivity.this, "导出成功,快去SD卡的\" 随手记 \"里找出来分享吧!!", Toast.LENGTH_LONG).show();}catch(Exception ex){Toast.makeText(MainActivity.this, "Sorry!!!导出失败!!", Toast.LENGTH_LONG).show();ex.printStackTrace();}break;default:;}dm.close();return super.onContextItemSelected(item);}public int copyicon(String title1,String content1){for(i=0;i<content1.length();i++){str1=content1.substring(i, i+1);if(str1.equals(str2)){start=i+1;}if(str1.equals(str4)){end=i;iconname=content1.substring(start, end);Log.i("log", iconname);cursor2=dm.selcetPathByName(iconname);cursor2.moveToFirst();String iconpath2=cursor2.getString(cursor2.getColumnIndex("path"));Log.i("log", iconpath2);cursor2.close();copyfromfile=new File(iconpath2);String copyintopath="/mnt/sdcard/随手记/"+title1+"/"+iconname;Log.i("log", copyintopath);copyfile(iconpath2,copyintopath);} }return 0;}public int copyfile(String from,String into){try{copyfrom=new FileInputStream(from);copyinto=new FileOutputStream(into);Log.i("log", "fuck you");byte[] bt = new byte[1024]; int c; while((c=copyfrom.read(bt)) > 0){ copyinto.write(bt,0,c);}copyfrom.close();copyinto.close();Log.i("log", "copy success");return 1;}catch (FileNotFoundException e) { // TODO Auto-generated catch blocke.printStackTrace();return -1;} catch (IOException e) { // TODO Auto-generated catch blocke.printStackTrace();return -1;} }//短按,即点击public class myOnItemClickListener implements OnItemClickListener{public void onItemClick(AdapterView<?> arg0, View v, int position, long id) {// TODO Auto-generated method stub//super.onListItemClick(l, v, position, id);Log.i("log", "position--->"+position);cursor.moveToPosition(position);Intent intent = new Intent();intent.putExtra("state", CHECK_STATE);intent.putExtra("id", cursor.getString(cursor.getColumnIndex("_id")));intent.putExtra("title", cursor.getString(cursor.getColumnIndex("title")));intent.putExtra("content", cursor.getString(cursor.getColumnIndex("content")));intent.putExtra("time", cursor.getString(cursor.getColumnIndex("time")));intent.setClass(MainActivity.this, checktravels.class);MainActivity.this.startActivity(intent);}}@Overrideprotected void onDestroy() {// TODO Auto-generated method stubcursor.close();super.onDestroy();}public boolean onKeyDown(int keyCode, KeyEvent event) { //按两次返回退出// TODO Auto-generated method stub if(keyCode == KeyEvent.KEYCODE_BACK){ System.out.println(isExit); if(isExit == false ) { isExit = true; System.out.println("isexit1 "+isExit); Toast.makeText(this, "再按一次退出程序", Toast.LENGTH_SHORT).show(); System.out.println("isexit2 "+isExit); if(!hasTask) {System.out.println("hastask "+hasTask); tExit.schedule(task, 2000); }} else {finish(); System.exit(0);} }return false;
}
}
布局文件
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent"android:layout_height="fill_parent"android:background="@drawable/background"android:orientation="vertical" ><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="40dip"android:background="@drawable/lable" ><TextViewandroid:id="@+id/textview"android:layout_width="150dip"android:layout_height="40dip"android:layout_centerHorizontal="true"android:layout_centerVertical="true"android:layout_marginTop="5dp"android:text=" 随 手 记"android:textColor="#99CC00"android:textSize="24sp"android:textStyle="bold" ></TextView><TextViewandroid:id="@+id/addtravels"android:layout_width="35dip"android:layout_height="38dip"android:layout_alignParentRight="true"android:layout_marginTop="2dip"android:background="@drawable/writeicon" ></TextView></RelativeLayout><ListViewandroid:id="@+id/travelslist"android:layout_width="fill_parent"android:layout_height="fill_parent" ></ListView></LinearLayout>
编辑界面编写
edittravels.java
package com.cong.notepad;import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Calendar;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import android.app.Activity;
import android.content.ContentResolver;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.media.ExifInterface;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.provider.MediaStore.MediaColumns;
import android.text.Editable;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.Html.ImageGetter;
import android.text.format.DateFormat;
import android.text.style.ImageSpan;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.Toast;public class edittravels extends Activity{private static final int SELECT_IMAGE =123;int rotate = 0; private EditText titleedit;private EditText travelsedit;private ImageButton save;private ImageButton insertimage;private ImageButton takephoto;private String idString;private int id2;private String title="";private String travelsdata = "";private String timeText = "";public Cursor cursor=null;public String namestr="";private DBManage dm=null;private Bitmap bitmap = null;private String path = null;private int state =-1;@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);setContentView(R.layout.edittravels);titleedit=(EditText)findViewById(R.id.titleedit);travelsedit=(EditText)findViewById(R.id.travelsedit);save=(ImageButton)findViewById(R.id.save);save.setOnClickListener(new saveListener());insertimage=(ImageButton)findViewById(R.id.insertimage);insertimage.setOnClickListener(new insertimageListener());dm=new DBManage(this);Intent intent = getIntent();state = Integer.parseInt(intent.getStringExtra("state"));Log.i("log", "state---->"+state);if (state==2){idString =intent.getStringExtra("id");Log.i("log", "id---->"+idString);id2 = Integer.parseInt(idString);title = intent.getStringExtra("title");travelsdata = intent.getStringExtra("content");timeText = intent.getStringExtra("time");titleedit.setText(title);dm.open();int i=0;int start=0;int end=0;String str1=null;String str2="[";String str4="]";String iconname=null;SpannableString travelsSpan =new SpannableString(travelsdata);for(i=0;i<travelsdata.length();i++){str1=travelsdata.substring(i, i+1);//travelsString+=str1;Log.i("log", str1);if(str1.equals(str2)){start=i+1;}if(str1.equals(str4)){end=i;namestr=travelsdata.substring(start,end);Log.i("log", namestr);cursor=dm.selcetPathByName(namestr);cursor.moveToFirst();path=cursor.getString(cursor.getColumnIndex("path"));cursor.close();namestr=null;Log.i("log", path);if(!(cursor==null)){int count=cursor.getCount();Log.i("log", "count----->"+count);BitmapFactory.Options options =new BitmapFactory.Options();options.inJustDecodeBounds =true;bitmap =BitmapFactory.decodeFile(path, options); //此时返回bm为空options.inJustDecodeBounds =false;int be = (int)(options.outHeight/ (float)100);if (be <= 0)be = 1;options.inSampleSize = be;bitmap=BitmapFactory.decodeFile(path,options);Drawable drawable = new BitmapDrawable(bitmap);drawable.setBounds(0, 0, 360, 280);ImageSpan span = new ImageSpan(drawable,ImageSpan.ALIGN_BOTTOM);travelsSpan.setSpan(span, start-1,end+1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);}else{Log.i("log", "insert icon faile");}}}dm.close(); travelsedit.setText(travelsSpan);}}//保存按钮点击事件class saveListener implements OnClickListener{public void onClick(View v) {// TODO Auto-generated method stubtitle = titleedit.getText().toString();travelsdata= travelsedit.getText().toString();Log.i("log","title---->"+title);Log.i("log", "travels---->"+travelsdata);try{dm.open();if(state==1) dm.insert(title, travelsdata);if (state==2)Log.i("log", "ready to alter");dm.update(id2, title, travelsdata);dm.close();}catch(Exception ex){ex.printStackTrace();}Intent gobackIntent=new Intent(edittravels.this,MainActivity.class);edittravels.this.startActivity(gobackIntent);finish();}}//插入图片点击事件class insertimageListener implements OnClickListener{public void onClick(View v) {// TODO Auto-generated method stub//Intent getImage = new Intent(Intent.ACTION_PICK,//MediaStore.Images.Media.INTERNAL_CONTENT_URI);//startActivityForResult(getImage, SELECT_IMAGE);Intent intent=new Intent(Intent.ACTION_GET_CONTENT);intent.addCategory(Intent.CATEGORY_OPENABLE);intent.setType("image/*");intent.putExtra("return-data", true);startActivityForResult(intent, SELECT_IMAGE);}}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);if (resultCode == RESULT_OK){path=getpath(data.getData());BitmapFactory.Options options =new BitmapFactory.Options();options.inJustDecodeBounds =true;//获取这个图片的宽和高bitmap =BitmapFactory.decodeFile(path, options); //此时返回bm为空options.inJustDecodeBounds =false; //计算缩放比int be = (int)(options.outHeight/ (float)100);if (be <= 0)be = 1;options.inSampleSize = be;Log.i("log","be---->"+be);//重新读入图片bitmap=BitmapFactory.decodeFile(path,options);int bitmapwidth=options.outWidth;int bitmapheight=options.outHeight;//检查图片是否要翻转try { ExifInterface exifInterface = new ExifInterface(path); int result = exifInterface.getAttributeInt( ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_UNDEFINED); switch(result) { case ExifInterface.ORIENTATION_ROTATE_90: rotate = 90; Log.i("log", "rotate----->"+rotate);break; case ExifInterface.ORIENTATION_ROTATE_180: rotate = 180; Log.i("log", "rotate----->"+rotate);break; case ExifInterface.ORIENTATION_ROTATE_270: rotate = 270;Log.i("log", "rotate----->"+rotate);break; default: break; } } catch (IOException e) { e.printStackTrace(); }if (rotate!=0&&bitmap!=null){Matrix matrix=new Matrix();matrix.reset();matrix.setRotate(rotate);Bitmap bitmap1= Bitmap.createBitmap(bitmap, 0, 0, options.outWidth, options.outHeight, matrix, true);bitmap = bitmap1;rotate=0;bitmapwidth=options.outHeight;bitmapheight=options.outWidth;}Drawable drawable = new BitmapDrawable(bitmap);drawable.setBounds(0, 0,bitmapwidth*2,bitmapheight*2);String iconname = path.substring(path.lastIndexOf("/")+1);String iconimfo="["+iconname+"]";SpannableString spannable = new SpannableString(iconimfo);ImageSpan span = new ImageSpan(drawable,ImageSpan.ALIGN_BOTTOM);spannable.setSpan(span, 0,iconimfo.length(),Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);int select=travelsedit.getSelectionStart();Editable edit = travelsedit.getEditableText();edit.insert(select, spannable);try{dm.open();dm.inserticonpath(iconname, path);dm.close();}catch(Exception ex){ex.printStackTrace();}}}String getpath(Uri uri) {String[] projection = {MediaColumns.DATA};Cursor cursor = managedQuery(uri, projection, null, null, null);startManagingCursor(cursor);int column_index = cursor.getColumnIndexOrThrow(MediaColumns.DATA);// 记录图片的位置Log.i("log","column_index---->"+column_index);cursor.moveToFirst();return cursor.getString(column_index);}int poi = 0;@Overrideprotected void onDestroy() {// TODO Auto-generated method stubsuper.onDestroy();}public boolean onKeyDown(int KeyCode,KeyEvent event){if (KeyCode==KeyEvent.KEYCODE_BACK){Intent goBackToMainIntent=new Intent(edittravels.this,MainActivity.class);this.startActivity(goBackToMainIntent);finish();}return false;}}
布局界面
edittravels.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent"android:layout_height="fill_parent"android:background="@drawable/background"android:orientation="vertical" ><LinearLayoutandroid:layout_width="fill_parent"android:layout_height="40dip"android:orientation="horizontal" ><EditTextandroid:id="@+id/titleedit"android:layout_width="275dip"android:layout_height="47dip"android:layout_marginLeft="2dip"android:background="#00000000"android:hint="输入标题:" ></EditText><ImageButtonandroid:id="@+id/save"android:layout_width="45dip"android:layout_height="wrap_content"android:src="@drawable/saveicon" /></LinearLayout><LinearLayoutandroid:layout_width="fill_parent"android:layout_height="fill_parent"android:layout_weight="1"android:orientation="vertical" ><EditTextandroid:id="@+id/travelsedit"android:layout_width="fill_parent"android:layout_height="fill_parent"android:layout_marginLeft="2dip"android:layout_weight="1"android:background="#00000000"android:gravity="top"android:hint="输入内容:" ></EditText><LinearLayoutandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_weight="0"android:orientation="horizontal" ><ImageButtonandroid:id="@+id/insertimage"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="0"android:src="@drawable/insericon" android:visibility="visible"></ImageButton></LinearLayout></LinearLayout></LinearLayout>
移动开发大作业————随手记(主界面和编辑界面)相关推荐
- iOS 11开发教程(六)iOS11Main.storyboard文件编辑界面
iOS 11开发教程(六)iOS11Main.storyboard文件编辑界面 在1.2.2小节中提到过编辑界面(Interface builder),编辑界面是用来设计用户界面的,单击打开Main. ...
- web前端设计与开发大作业(三)----注册与登陆界面
一.登陆界面 <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF ...
- web前端设计与开发大作业(四)----主页导航界面
导航界面 <!DOCTYPE html> <html > <head> <meta charset="utf-8" /> <t ...
- web前端设计与开发大作业(二)----酒店预约界面
这是主体部分,写的比较简单 <body><div id="top"><div id="logo"><img src=& ...
- 移动应用技术开发大作业——Android平台个人简历
这门水课一学期就三四节,两节Android一节ios,就要交大作业了. 出于兴趣自己开始自学,先是做了个简单的登录界面,再跟从CSDN上下载的仿知乎日报模板结合了一下. 由于要交作业,花一整天的时间完 ...
- 商城+前后端分离+课程设计+大作业 Springboot+vue+swagger+好看的安卓界面
这里写目录标题 一.绪论 二.需求分析 2.2商户与顾客间通讯服务 2.3 完整的购物流程 2.4 后台管理 2.5 交流社区 2.6 附加功能 2.7 部署在云服务器上 三.总体设计 3.1系统结构 ...
- 安卓开发大作业_罗湖小程序开发制作价格低
罗湖小程序开发制作价格低 深圳市驰骋网络技术有限公司 驰骋网络提供外观结构设计+软硬件+APP+云服务 一站式开发服务 小程序开始走入了人们的视线,由于其独特的便捷性,给我们的生活提供了非常大的帮助, ...
- php动态网站开发大作业,PHP动态网站开发项目实战
任务1 分析网站需求1 1.1 知识准备1 1.1.1 功能结构图1 1.1.2 用例图2 1.2 任务实现5 1.2.1 花公子蜂蜜网站项目功能结构分析5 1.2.2 花公子蜂蜜网站项目用例分析6 ...
- 游戏开发大作业 01 游戏设计
概念 介绍 源质迷宫的目标是运用Unity引擎制作一款解密游戏,以此来加深对Unity游戏开发的理解. 背景 游戏建立在一个由源质构成的迷宫中,迷宫中的人物可以通过法力控制源质胶囊中的源质改变迷宫结构 ...
最新文章
- oracle没什么没有备份,怎么恢复没有备份的Oracle数据库
- UPS远程监控系统的设计与实现
- c++ primer 5th第13章拷贝控制知识点和自编习题答案
- t系列服务器更换pip升级版本,Python更新pip出现错误解决方法
- 编译Ruby2.0 问题解决
- python遍历循环中的遍历结构可以是什么_(一)Python入门-4控制语句:06for循环结构-遍历各种可迭代对象-range对象...
- 打家劫舍(Leetcode)动态规划c语言
- Windows Server 2012正式版RDS系列⑻
- Vuex的API文档
- [乙女向]金色琴弦2f 安可[PSP汉化版][带完美存档+文档攻略+金手指]
- Q学习(Q-learning)入门小例子及python实现
- c语言自学 中文,C语言自学《一》 ---- 初探C语言
- 通过网线连接两台主机
- 常犇_专访丨《河神》制片人常犇:走夜路不怕黑,做好剧别怕累
- 西门子1513CPU冗余组态
- 企业微信客户端开启开发者模式
- arduino制作简单家庭仿真小台灯(自己设计好模型,就是一个很棒的台灯)
- 深度学习——注意力机制
- 通用模型、全新框架,WavLM语音预训练模型全解
- 关于WPA3-H2E的技术讲解