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