Android日志管理程序
来源:互联网 发布:java.lang.instrument 编辑:程序博客网 时间:2024/05/17 07:04
转载请标明出处:http://blog.csdn.net/wu_wxc/article/details/49967893
本文出自【吴孝城的CSDN博客】
这是一个日志管理程序,可以保存为草稿,保存日志,会自动获取手机当前时间,可以删除日志。查看日志内容。
下面是该日志管理程序需要编辑的文件和全部代码
其中有用来SQLite知识,不懂可以到下面链接查看
Android本地数据存储之SQLite
Sharedpreference的相关知识可谓到下面链接查看
Android本地数据存储之Sharedpreference
用到了
android.support.design.widget.FloatingActionButton
在build.gradle(Module:app)中添加依赖
compile 'com.android.support:design:23.1.1'
activity_main.xml
<?xml version="1.0" encoding="utf-8"?><android.support.design.widget.CoordinatorLayout 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:fitsSystemWindows="true" tools:context=".MainActivity"> <include layout="@layout/content_main" /> <android.support.design.widget.FloatingActionButton android:id="@+id/fab" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="bottom|end" android:layout_margin="@dimen/fab_margin" android:src="@android:drawable/ic_input_add" /></android.support.design.widget.CoordinatorLayout>content_main.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="vertical" tools:context=".MainActivity" tools:showIn="@layout/activity_main"> <TextView android:layout_width="match_parent" android:layout_height="56dp" android:background="#3F51B5" android:gravity="center" android:text="日志" android:textColor="#ffffff" android:textSize="34sp" /> <ListView android:id="@android:id/list" android:layout_width="match_parent" android:layout_height="wrap_content" /></LinearLayout>daily_item_list.xml
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <TextView android:id="@+id/item_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="title" android:layout_marginLeft="10dp" android:layout_marginTop="8dp" android:layout_marginBottom="8dp" android:textSize="30sp"/> <TextView android:id="@+id/item_time" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="8dp" android:layout_alignParentRight="true" android:layout_marginRight="10dp" android:layout_marginBottom="10dp" android:textSize="16sp" android:text="2015-11-20"/></RelativeLayout>activity_create_daily.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:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:orientation="vertical" tools:context="cn.wuxiaocheng.wuxiaocheng.CreateDailyActivity"> <android.support.design.widget.TextInputLayout android:id="@+id/title" android:layout_width="match_parent" android:layout_height="wrap_content"> <EditText android:hint="日志标题" android:layout_width="match_parent" android:layout_height="wrap_content" /> </android.support.design.widget.TextInputLayout> <EditText android:id="@+id/content" android:hint="内容" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="top" android:inputType="textMultiLine" android:minLines="10" android:maxLines="10" android:scrollbars="vertical"/> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal"> <Button android:id="@+id/cancel" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="返回"/> <Button android:id="@+id/save" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="30dp" android:text="保存"/> </LinearLayout></LinearLayout>activity_daily_content.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:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:orientation="vertical" tools:context="cn.wuxiaocheng.wuxiaocheng.DailyContent"> <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <TextView android:id="@+id/title_view" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="title" android:layout_marginLeft="10dp" android:layout_marginTop="8dp" android:layout_marginBottom="8dp" android:textSize="30sp"/> <TextView android:id="@+id/time_view" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_marginRight="10dp" android:textSize="16sp" android:layout_marginTop="20dp" android:text="2015-11-20"/> </RelativeLayout> <TextView android:id="@+id/content_view" android:layout_width="match_parent" android:layout_height="match_parent" android:scrollbars="vertical" android:text="content" android:maxLines="10" android:minLines="10" android:gravity="top" android:inputType="textMultiLine" android:layout_weight="1"/> <LinearLayout android:layout_width="wrap_content" android:layout_gravity="center_horizontal" android:layout_height="wrap_content"> <Button android:id="@+id/back" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="返回" android:textSize="20sp"/> <Button android:id="@+id/del" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="删除" android:layout_marginLeft="50dp" android:textSize="20sp"/> </LinearLayout></LinearLayout>
MainActivity.java
package cn.wuxiaocheng.wuxiaocheng;import android.app.ListActivity;import android.content.Context;import android.content.Intent;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;import android.os.Bundle;import android.os.Parcelable;import android.support.design.widget.FloatingActionButton;import android.view.View;import android.widget.Adapter;import android.widget.AdapterView;import android.widget.SimpleCursorAdapter;import java.util.Currency;import cn.wuxiaocheng.wuxiaocheng.db.MyDBOpenHelper;public class MainActivity extends ListActivity { private Context mcontext; private MyDBOpenHelper mydb; private SimpleCursorAdapter adapter; private SQLiteDatabase dbRead; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //悬浮按钮 final FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); fab.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //打开编辑日志界面 Intent intent = new Intent(MainActivity.this, CreateDailyActivity.class); startActivity(intent); } }); //数据库操作 mcontext = MainActivity.this; mydb = new MyDBOpenHelper(mcontext, "dbDaily.db", null, 1); //用可读方式打开数据库 dbRead = mydb.getReadableDatabase(); adapter = new SimpleCursorAdapter(mcontext, R.layout.daily_item_list, null, new String[]{"title", "time"}, new int[]{R.id.item_title, R.id.item_time}); setListAdapter(adapter); //刷新 refresh(); //点击日志碱触发事件 getListView().setOnItemClickListener(listener); } //刷新,查询整个表 private void refresh() { Cursor c = dbRead.query("dbDaily", null, null, null, null, null, null); adapter.changeCursor(c); } //某个日志被点击后执行的内容 private AdapterView.OnItemClickListener listener = new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Intent intent = new Intent(MainActivity.this, DailyContent.class); Cursor c = adapter.getCursor(); c.moveToPosition(position); int itemId = c.getInt(c.getColumnIndex("_id")); //用Bundle将该条日志的_id传递给DailyContent.java Bundle bundle = new Bundle(); bundle.putInt("_id", itemId); intent.putExtras(bundle); //启动意图 startActivity(intent); } };}
CreateDailyActivity.java
package cn.wuxiaocheng.wuxiaocheng;import android.app.AlertDialog;import android.content.ContentValues;import android.content.Context;import android.content.DialogInterface;import android.content.Intent;import android.content.SharedPreferences;import android.content.SharedPreferences.Editor;import android.database.sqlite.SQLiteDatabase;import android.support.design.widget.TextInputLayout;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.text.Editable;import android.text.TextWatcher;import android.view.View;import android.widget.Button;import android.widget.EditText;import android.widget.Toast;import cn.wuxiaocheng.wuxiaocheng.db.MyDBOpenHelper;public class CreateDailyActivity extends AppCompatActivity implements View.OnClickListener { private TextInputLayout title; private EditText content; private Button cancen, save; private Context mcontext; private MyDBOpenHelper mydb; private SQLiteDatabase dbWrite; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_create_daily); setTitle("编辑你的日志"); title = (TextInputLayout) findViewById(R.id.title); content = (EditText) findViewById(R.id.content); cancen = (Button) findViewById(R.id.cancel); save = (Button) findViewById(R.id.save); cancen.setOnClickListener(this); save.setOnClickListener(this); title.setHint("日志标题"); EditText editText = title.getEditText(); assert editText != null; editText.addTextChangedListener(new TextWatcher() { //编辑前 @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } //编辑时 @Override public void onTextChanged(CharSequence s, int start, int before, int count) { if (s.length() > 10) { title.setError("日志标题不能超过10位"); title.setErrorEnabled(true); } else { title.setErrorEnabled(false); } } //编辑后 @Override public void afterTextChanged(Editable s) { } }); //自动填写已有的草稿 setEdit(); //创建数据库 mcontext = CreateDailyActivity.this; //创建MyDBOpenHelper类的费用对象,传入所需的值,创建名为my.db的数据库,版本号为1 mydb = new MyDBOpenHelper(mcontext, "dbDaily.db", null, 1); //用可写方法打开数据库 dbWrite = mydb.getWritableDatabase(); } //打开编辑界面时自动填充上次保存的草稿 private void setEdit() { SharedPreferences sp = getSharedPreferences("sDaily", Context.MODE_WORLD_READABLE); String stitle = sp.getString("spName", null); String scontent = sp.getString("spContent", null); //将标题和内容显示出来 title.getEditText().setText(stitle); content.setText(scontent); } //对话框的点击事件 @Override public void onClick(View v) { switch (v.getId()) { case R.id.cancel: if (title.getEditText().getText().toString().equals("") && content.getText().toString().equals("")){ finish(); } else{ AlertDialog.Builder builder = new AlertDialog.Builder(CreateDailyActivity.this); builder.setTitle("是否保存为草稿"); builder.setNegativeButton("不保存", qx); builder.setPositiveButton("保存", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { //执行保存草稿功能 draft(); } }); builder.create().show(); } break; case R.id.save: if (title.getEditText().getText().toString().equals("") && content.getText().toString().equals("")){ Toast.makeText(CreateDailyActivity.this, "日志标题和日志内容不能为空",Toast.LENGTH_LONG).show(); } else if (title.getEditText().getText().toString().equals("")){ Toast.makeText(CreateDailyActivity.this, "日志标题不能为空",Toast.LENGTH_LONG).show(); } else if (content.getText().toString().equals("")){ Toast.makeText(CreateDailyActivity.this, "日志内容不能为空",Toast.LENGTH_LONG).show(); } else if (title.getEditText().getText().toString().length()>10){ Toast.makeText(CreateDailyActivity.this, "日志标题长度不能超过10",Toast.LENGTH_LONG).show(); } else { //保存日志 saveDaily(); Toast.makeText(CreateDailyActivity.this, "日志保存成功!", Toast.LENGTH_SHORT).show(); //返回日志显示界面 Intent intent = new Intent(CreateDailyActivity.this, MainActivity.class); startActivity(intent); } break; } } //保存日志 private void saveDaily() { ContentValues cv = new ContentValues(); cv.put("title", title.getEditText().getText().toString()); cv.put("content", content.getText().toString()); //将数据写入表中 dbWrite.insert("dbDaily", null, cv); title.getEditText().setText(""); content.setText(""); //清除SharedPreferences保存的草稿 SharedPreferences sp = getSharedPreferences("sDaily", 0); Editor editor = sp.edit(); //用clear()方法清除数据,commit()保存清除结果 editor.clear().commit(); //关闭对话框 } //点击不保存时清除SharedPreferences内容,关闭Dialog对话框,返回主界面 DialogInterface.OnClickListener qx = new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { //清除SharedPreferences保存的草稿 SharedPreferences sp = getSharedPreferences("sDaily", 0); Editor editor = sp.edit(); //用clear()方法清除数据,commit()保存清除结果 editor.clear().commit(); //关闭对话框 dialog.dismiss(); //返回主界面 finish(); } }; //保存草稿到SharedPreferences private void draft() { //保存输入内容到Sharedpreference String spName = title.getEditText().getText().toString(); String spContent = content.getText().toString(); SharedPreferences sp = getSharedPreferences("sDaily", Context.MODE_WORLD_READABLE); //通过Editor对象以键值对<String Key,String Value>存储数据 Editor editText = sp.edit(); editText.putString("spName", spName); editText.putString("spContent", spContent); //通过.commit()方法保存数据 editText.commit(); Toast.makeText(CreateDailyActivity.this, "日志已保存为草稿", Toast.LENGTH_SHORT).show(); //返回主界面 finish(); }}MyDBOpenHelper文件继承SQLiteOpenHelper
写丰了另一个包里
MyDBOpenHelper.java
package cn.wuxiaocheng.wuxiaocheng.db;import android.content.Context;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteOpenHelper;public class MyDBOpenHelper extends SQLiteOpenHelper { public MyDBOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) { super(context, name, factory, version); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL("CREATE TABLE dbDaily(_id INTEGER PRIMARY KEY AUTOINCREMENT, " + "title VARCHAR(10), " + "time INT NOT NULL DEFAULT CURRENT_TIMESTAMP ," + "content VARCHAR)"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { }}
DailyContent.java
package cn.wuxiaocheng.wuxiaocheng;import android.app.AlertDialog.Builder;import android.content.Context;import android.content.DialogInterface;import android.content.Intent;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.Button;import android.widget.TextView;import cn.wuxiaocheng.wuxiaocheng.db.MyDBOpenHelper;public class DailyContent extends AppCompatActivity implements View.OnClickListener { private Button back, del; private TextView title, time, content; private MyDBOpenHelper mydb; private SQLiteDatabase dbWrite, dbRead; private Context mcontext; private int id; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_daily_content); back = (Button) findViewById(R.id.back); del = (Button) findViewById(R.id.del); title = (TextView) findViewById(R.id.title_view); time = (TextView) findViewById(R.id.time_view); content = (TextView) findViewById(R.id.content_view); //添加点击事件 back.setOnClickListener(this); del.setOnClickListener(this); mcontext = DailyContent.this; mydb = new MyDBOpenHelper(mcontext, "dbDaily.db", null, 1); //用可读方式打开数据库 dbRead = mydb.getReadableDatabase(); //用可写权限打开数据库 dbWrite = mydb.getWritableDatabase(); //获得MainActivity.java传递过来的_id Bundle bundle = getIntent().getExtras(); id = bundle.getInt("_id"); //执行查询SQL语句 Cursor c = dbRead.rawQuery("SELECT * FROM dbDaily WHERE _id=?", new String[]{id + ""}); if (c.moveToFirst()) { String getTitle = c.getString(c.getColumnIndex("title")); String getTime = c.getString(c.getColumnIndex("time")); String getContent = c.getString(c.getColumnIndex("content")); //将从数据库获得的显示出来 title.setText(getTitle); time.setText(getTime); content.setText(getContent); //设置标题栏显示的是本条日志的标题 setTitle(getTitle); } c.close(); } //点击事件 @Override public void onClick(View v) { switch (v.getId()) { //返回按钮 case R.id.back: finish(); break; //删除按钮 case R.id.del: adkToDel(); break; } } //确定删除对话框 private void adkToDel() { Builder builder = new Builder(DailyContent.this); builder.setTitle("确定删除该日志"); builder.setNegativeButton("取消", cancel); builder.setPositiveButton("删除", delDaily); builder.create().show(); } //删除该条日志 DialogInterface.OnClickListener delDaily = new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { //执行删除功能 dbWrite.delete("dbDaily", "_id=?", new String[]{id + ""}); //删除日志后返回主界面 Intent intent = new Intent(DailyContent.this, MainActivity.class); startActivity(intent); } }; //取消对话框 DialogInterface.OnClickListener cancel = new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } };}
用到多个Activity,所以要在清单文件里配置
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="cn.wuxiaocheng.wuxiaocheng" > <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme" > <activity android:name=".MainActivity" android:label="@string/app_name" android:theme="@style/AppTheme.NoActionBar" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".CreateDailyActivity" > </activity> <activity android:name=".DailyContent" > </activity> </application></manifest>
其中21-24行为添加的两个Activity
运行效果如图
源码下载
打包好的程序“日志.apk”
1 0
- Android日志管理程序
- Android之——流量管理程序示例
- Android进程管理机制及优化+自动内存管理程序
- android调用系统自带的文件管理程序选择文件
- Android进程管理机制及优化+自动内存管理程序
- 酒店管理程序
- 投票管理程序
- 进程管理程序
- 通讯录管理程序
- 图书管理程序
- 学生管理程序
- Nginx 管理程序
- 停车管理程序
- 图书管理程序
- 权限管理程序
- 电话号码管理程序
- android 退出应用后管理程序中force stop 强制关闭为灰色的代码
- android日志
- Webkit之Port类(ChromeClientQt类)
- android 常用调试命令
- 继承方式代理
- Java常用排序算法(快速排序/插入排序/shell排序)
- 学习搭建NDK的环境
- Android日志管理程序
- github_将项目放在github仓库中
- 跨平台照片社交应用Instagram 5岁生日派对4亿用户庆祝!
- Java中数据类型及其之间的转换
- Linux下的分页机制
- TUN/TAP跨netns通信
- Deep Learning with Torch
- git常用命令
- 呃呃呃