IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> 【Android Studio】 notepad功能扩展实现时间戳和搜索 -> 正文阅读

[移动开发]【Android Studio】 notepad功能扩展实现时间戳和搜索

简介

实现了NotePad的基础功能时间戳和搜索,扩展了UI美化。

NotePad源码下载

可能bug及解决方式

  1. 下载源码解压并在AndroidStudio中打开后,点击build可能会报错在这里插入图片描述
    此时,在build.gradle中添加 google();
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath "com.android.tools.build:gradle:7.0.2"
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}
 
allprojects {
    repositories {
        google()
        mavenCentral ()
        maven {url 'https://dl.bintray.com/jetbrains/anko'}
    }
}
 
task clean(type: Delete) {
    delete rootProject.buildDir
}

修改 gradle 文件夹下的 gradle-wrapper.properties 的 distributionUrl 属性为

https://services.gradle.org/distributions/gradle-7.0.2-bin.zip
在这里插入图片描述
然后检查SDK版本
在这里插入图片描述
在这里插入图片描述
修改app下build.gradle的SDK版本一致
在这里插入图片描述

功能代码详解

时间戳功能

  1. 在主页面的每个列表项中添加时间戳的位置,即在notelist_item.xml布局文件中添加一个
<TextView
        android:id="@+id/text2"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:textSize="12dp"
        android:gravity="center_vertical"
        android:paddingLeft="10dip"
        android:singleLine="true"
        android:layout_weight="1"
        android:layout_margin="0dp"
        />  
  1. 需要修改这个方法中的时间戳格式
    NotePadProvider中的insert方法:
Long now = Long.valueOf(System.currentTimeMillis());
//修改 需要将毫秒数转换为时间的形式yy.MM.dd HH:mm:ss

Date date = new Date(now);

SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yy-MM-dd HH:mm:ss");

String dateFormat = simpleDateFormat.format(date);
//转换为yy.MM.dd HH:mm:ss形式的时间

if(values.containsKey(NotePad.Notes.COLUMN_NAME_CREATE_DATE) == false) {
    values.put(NotePad.Notes.COLUMN_NAME_CREATE_DATE, dateFormat);
}

if (values.containsKey(NotePad.Notes.COLUMN_NAME_MODIFICATION_DATE) == false) {
    values.put(NotePad.Notes.COLUMN_NAME_MODIFICATION_DATE, dateFormat);
} 

NoteEditor中的updateNote方法:

long now = System.currentTimeMillis();
Date date = new Date(now);
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yy-MM-dd HH:mm:ss");
String dateFormat = simpleDateFormat.format(date);
values.put(NotePad.Notes.COLUMN_NAME_MODIFICATION_DATE, dateFormat);
  1. NoteList的修改
    如果我们要加入时间戳,必须要将修改时间的列也投影出来. 所以我们将PROJECTION添加上修改时间:
private static final String[] PROJECTION = new String[] {
            NotePad.Notes._ID, // 0
            NotePad.Notes.COLUMN_NAME_TITLE, // 1
            NotePad.Notes.COLUMN_NAME_MODIFICATION_DATE,//添加修改时间
    };

PROJECTION只是定义了需要被取出来的数据列,而之后用Cursor进行数据库查询,再之后用Adapter进行装填。我们需要将显示列dataColumns和他们的viewIDs加入修改时间这一属性:

String[] dataColumns = { NotePad.Notes.COLUMN_NAME_TITLE, NotePad.Notes.COLUMN_NAME_MODIFICATION_DATE }//加入修改时间;
int[] viewIDs = { android.R.id.text1, R.id.text2 }//加入修改时间;

  1. 实现结果如下:
    Alt

搜索功能

  1. 搜索组件在主页面的菜单选项中,所以应在list_options_menu.xml布局文件中添加搜索功能
<item
      android:id="@+id/menu_search"
      android:icon="@android:drawable/ic_menu_search"
      android:title="@string/menu_search"
      android:showAsAction="always" />
  1. 新建一个查找笔记内容的布局文件note_search.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"
    >

    <SearchView
        android:id="@+id/search"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:iconifiedByDefault="false" />

    <ListView
        android:id="@+id/list"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</LinearLayout>
  1. 在NoteList类中的onOptionsItemSelected方法中添加search查询的处理(跳转)

        case R.id.menu_search:  
        //查找功能  
        //startActivity(new Intent(Intent.ACTION_SEARCH, getIntent().getData()));  
          Intent intent = new Intent(this, NoteSearch.class);  
          this.startActivity(intent);  
          return true;  
  1. 新建一个NoteSearch类用于search功能的功能实现
package com.example.android.notepad;
import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.widget.ListView;
import android.widget.SearchView;
import android.widget.SimpleCursorAdapter;
import android.widget.Toast;

public class NoteSearch extends Activity implements SearchView.OnQueryTextListener
{
    ListView listView;
    SQLiteDatabase sqLiteDatabase;
    /**
     * The columns needed by the cursor adapter
     */
    private static final String[] PROJECTION = new String[]{
            NotePad.Notes._ID, // 0
            NotePad.Notes.COLUMN_NAME_TITLE, // 1
            NotePad.Notes.COLUMN_NAME_MODIFICATION_DATE//时间
    };

    public boolean onQueryTextSubmit(String query) {
        Toast.makeText(this, "您选择的是:"+query, Toast.LENGTH_SHORT).show();
        return false;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.note_search);
        SearchView searchView = (SearchView) findViewById(R.id.search);
        Intent intent = getIntent();
        if (intent.getData() == null) {
            intent.setData(NotePad.Notes.CONTENT_URI);
        }
        listView = (ListView) findViewById(R.id.list);
        sqLiteDatabase = new NotePadProvider.DatabaseHelper(this).getReadableDatabase();
        //设置该SearchView显示搜索按钮
        searchView.setSubmitButtonEnabled(true);

        //设置该SearchView内默认显示的提示文本
        searchView.setQueryHint("查找");
        searchView.setOnQueryTextListener(this);

    }
    public boolean onQueryTextChange(String string) {
        String selection1 = NotePad.Notes.COLUMN_NAME_TITLE+" like ? or "+NotePad.Notes.COLUMN_NAME_NOTE+" like ?";
        String[] selection2 = {"%"+string+"%","%"+string+"%"};
        Cursor cursor = sqLiteDatabase.query(
                NotePad.Notes.TABLE_NAME,
                PROJECTION, // The columns to return from the query
                selection1, // The columns for the where clause
                selection2, // The values for the where clause
                null,          // don't group the rows
                null,          // don't filter by row groups
                NotePad.Notes.DEFAULT_SORT_ORDER // The sort order
        );
        // The names of the cursor columns to display in the view, initialized to the title column
        String[] dataColumns = {
                NotePad.Notes.COLUMN_NAME_TITLE,
                NotePad.Notes.COLUMN_NAME_MODIFICATION_DATE
        } ;
        // The view IDs that will display the cursor columns, initialized to the TextView in
        // noteslist_item.xml
        int[] viewIDs = {
                android.R.id.text1,
                android.R.id.text2
        };
        // Creates the backing adapter for the ListView.
        SimpleCursorAdapter adapter
                = new SimpleCursorAdapter(
                this,                             // The Context for the ListView
                R.layout.noteslist_item,         // Points to the XML for a list item
                cursor,                           // The cursor to get items from
                dataColumns,
                viewIDs
        );
        // Sets the ListView's adapter to be the cursor adapter that was just created.
        listView.setAdapter(adapter);
        return true;
    }
}
  1. 最后要在清单文件AndroidManifest.xml里面注册NoteSearch,否则无法实现界面的跳转
<activity android:name=".NoteSearch" android:label="@string/menu_search" />
  1. 实现结果如下:
    AltAlt

UI美化

  1. 先给NoteList换个主题,把黑色换成白色,在AndroidManifest.xml中NotesList的Activity中添加:
android:theme="@android:style/Theme.Holo.Light"
  1. 创建数据库表地方添加颜色的字段:
 @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("CREATE TABLE " + NotePad.Notes.TABLE_NAME + "   ("
        + NotePad.Notes._ID + " INTEGER PRIMARY KEY,"
        + NotePad.Notes.COLUMN_NAME_TITLE + " TEXT,"
        + NotePad.Notes.COLUMN_NAME_NOTE + " TEXT,"
        + NotePad.Notes.COLUMN_NAME_CREATE_DATE + " INTEGER,"
        + NotePad.Notes.COLUMN_NAME_MODIFICATION_DATE + " INTEGER,"
        + NotePad.Notes.COLUMN_NAME_BACK_COLOR + " INTEGER" //颜色
        + ");");
       }
  1. 在系统中预定于好五种颜色,根据颜色对应不int值选择要显示的颜色,契约类中的定义:
public static final int DEFAULT_COLOR = 0; //白
public static final int YELLOW_COLOR = 1; //黄
public static final int BLUE_COLOR = 2; //蓝
public static final int GREEN_COLOR = 3; //绿
public static final int RED_COLOR = 4; //红
  1. 由于数据库中多了一个字段,所以要在NotePadProvider中添加对其相应的处理
    static{}:
sNotesProjectionMap.put(
        NotePad.Notes.COLUMN_NAME_BACK_COLOR,
        NotePad.Notes.COLUMN_NAME_BACK_COLOR);

insert:

 // 新建笔记,背景默认为白色
if (values.containsKey(NotePad.Notes.COLUMN_NAME_BACK_COLOR) == false) {
     values.put(NotePad.Notes.COLUMN_NAME_BACK_COLOR, NotePad.Notes.DEFAULT_COLOR);
     }
  1. 自定义一个CursorAdapter继承SimpleCursorAdapter,既能完成cursor读取的数据库内容填充到item,又能将颜色填充:
public class MyCursorAdapter extends SimpleCursorAdapter {
 public MyCursorAdapter(Context context, int layout, Cursor c,
                        String[] from, int[] to) {
     super(context, layout, c, from, to);
 }
 @Override
 public void bindView(View view, Context context, Cursor cursor){
     super.bindView(view, context, cursor);
     //从数据库中读取的cursor中获取笔记列表对应的颜色数据,并设置笔记颜色
     int x = cursor.getInt(cursor.getColumnIndex(NotePad.Notes.COLUMN_NAME_BACK_COLOR));
     /**
      * 白 255 255 255
      * 黄 247 216 133
      * 蓝 165 202 237
      * 绿 161 214 174
      * 红 244 149 133
      */
     switch (x){
         case NotePad.Notes.DEFAULT_COLOR:
             view.setBackgroundColor(Color.rgb(255, 255, 255));
             break;
         case NotePad.Notes.YELLOW_COLOR:
             view.setBackgroundColor(Color.rgb(247, 216, 133));
             break;
         case NotePad.Notes.BLUE_COLOR:
             view.setBackgroundColor(Color.rgb(165, 202, 237));
             break;
         case NotePad.Notes.GREEN_COLOR:
             view.setBackgroundColor(Color.rgb(161, 214, 174));
             break;
         case NotePad.Notes.RED_COLOR:
             view.setBackgroundColor(Color.rgb(244, 149, 133));
             break;
         default:
             view.setBackgroundColor(Color.rgb(255, 255, 255));
             break;
     }
 }
}
  1. NoteList中的PROJECTION添加颜色项:
private static final String[] PROJECTION = new String[] {
         NotePad.Notes._ID, // 0
         NotePad.Notes.COLUMN_NAME_TITLE, // 1
         //扩展 显示时间 颜色
         NotePad.Notes.COLUMN_NAME_MODIFICATION_DATE, // 2
         NotePad.Notes.COLUMN_NAME_BACK_COLOR,
 };

并且将NoteList中用的SimpleCursorAdapter改使用MyCursorAdapter:

 //修改为可以填充颜色的自定义的adapter,自定义的代码在MyCursorAdapter.java中
adapter = new MyCursorAdapter(
     this,
     R.layout.noteslist_item,
     cursor,
     dataColumns,
     viewIDs
 );

作者:056
原文链接

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-12-13 12:56:35  更:2021-12-13 12:58:22 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 7:59:12-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码