日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

基于 SQLite 开发Android studio 的记账APP

發布時間:2024/1/1 Android 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于 SQLite 开发Android studio 的记账APP 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

使用Android studio版本:3.2? JDK版本: jdk1.8.0_151

華為 mate s 測試不顯示Log.d()部分手機解決方法?https://blog.csdn.net/HorrorKwan/article/details/78717122

項目介紹

記賬APP核心功能

展示,添加,編輯,刪除

?

運用到的知識

  • 數據庫設計
  • 復雜視圖的編寫
  • 一些設計要素
  • 單例模式
  • 適配器模式(RecycleView,ListView)
  • 編寫實戰項目中的經驗
  • 功能拆分?

    • 視圖? ? ? ? ? ? ? ? ? ? 兩個Activity 用于展示添加賬目
    • 持久化實現? ?? ? ? SQLite 數據庫編輯賬目
    • 工具類? ? ? ? ? ? ? ? 實現簡單的日期操作,資源管理
    • 主要界面控件? ? ? TextView 用于展示星期/日期? ? ? ? ? Floating Button? ? ? ? ?ViewPager? Fragment? ?List View? ?Dialog(彈出式對話框)
    • 添加賬目界面控件 TextView? ?Edit Text? ? Recycler View? ? 自定義鍵盤(Table Layout的使用) 時間選擇控件
    • 邏輯層? ?SQLlitOpenHelper? ? ?RecordBean(賬目的抽象數據結構)? DateUtil 工具類? ? GlobaUtil 工具類用于全局資源提供

    Android 中的持久化方案-- SQLite

    ?Android 中的持久化技術有

    • SharedPerferences
    • 文件儲存(SD卡)?
    • SQLite

    認識SQLite

    • 輕量級關系數據庫
    • 運算速度快
    • 占用資源少
    • 支持標準SQl語法?

    數據庫中的基本元素

    • 關系數據庫
    • 表:同一類記錄的集合
    • 字段:對應實體的屬性
    • 元祖:也叫 做記錄,表中的每一行?

    數據庫中的四個主要操作? ? CRUD

    • 增,添加(Create)
    • 刪,刪除(Delete)
    • 改,更新(Update)
    • 查,查詢(Retrieve)

    編寫數據結構

    數據庫實現

    RecordBean類

    • 支出/收入
    • 消費類別
    • 消費金額
    • 備注
    • 日期
    • 時間?

    UUID

    通用唯一識別碼(Universally Unique Identifier),在一臺機器上生成的數字,它保證同一時空中所有機器都是唯一的。

    新建 RecordBean 類

    /*** 數據結構* @author SmallLetters@sina.com*/ public class RecordBean {private String TAG = "RecordBean";/*** 消費類別*/public enum RecordType {//支出,收入RECORD_TYPE_EXPENSE, RECORD_TYPE_INCOME}//消費額private double amount;private RecordType type;private String category;private String remark;private String date;private long timeStamp;private String uuid;/*** 生成唯一識別碼*/public RecordBean() {uuid = UUID.randomUUID().toString();timeStamp = System.currentTimeMillis();date = DateUtil.getFormattedDate();}public String getTAG() {return TAG;}public void setTAG(String TAG) {this.TAG = TAG;}public double getAmount() {return amount;}public void setAmount(double amount) {this.amount = amount;}public int getType() {if(this.type == RecordType.RECORD_TYPE_EXPENSE){return 1;}else {return 0;}}public void setType(int type) {if (type == 1){this.type = RecordType.RECORD_TYPE_EXPENSE;}else {this.type = RecordType.RECORD_TYPE_INCOME;}}public String getCategory() {return category;}public void setCategory(String category) {this.category = category;}public String getRemark() {return remark;}public void setRemark(String remark) {this.remark = remark;}public String getDate() {return date;}public void setDate(String date) {this.date = date;}public long getTimeStamp() {return timeStamp;}public void setTimeStamp(long timeStamp) {this.timeStamp = timeStamp;}public String getUuid() {return uuid;}public void setUuid(String uuid) {this.uuid = uuid;} }

    編寫日期工具類

    新建DateUtil 類

    /*** @author SmallLetters@sina.com*/ public class DateUtil {/***unix time -> 23:43* @param timeStamp* @return HH:mm 當前時間*/public static String getFormattedTime(long timeStamp){// yyyy-MM-dd HH:mm:ssSimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm");return simpleDateFormat.format(new Date(timeStamp));}/*** @return yyyy-MM-dd 當前時間*/public static String getFormattedDate(){SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");return simpleDateFormat.format(new Date());}}

    編寫數據庫操作類

    數據增刪改查

    新建RecordDatabaseHeleper 類 extends(繼承) SQLiteOpenHelper /*** 數據庫操作類** @author SmallLetters@sina.com*/ public class RecordDatabaseHeleper extends SQLiteOpenHelper {public static final String BD_NAME = "Record";public static final String CREATE_RECORD_DB = "create table Record("+ "id integer primary key autoincrement,"+ "uuid text,"+ "type integer,"+ "category text,"+ "remark text,"+ "amount double,"+ "time integer,"+ "date date)";public RecordDatabaseHeleper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {super(context, name, factory, version);}@Overridepublic void onCreate(SQLiteDatabase sqLiteDatabase) {sqLiteDatabase.execSQL(CREATE_RECORD_DB);}@Overridepublic void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {}/*** 增,添加數據** @param bean*/public void addRecord(RecordBean bean) {SQLiteDatabase db = this.getWritableDatabase();ContentValues contentValues = new ContentValues();contentValues.put("uuid", bean.getUuid());contentValues.put("type", bean.getType());contentValues.put("category", bean.getCategory());contentValues.put("remark", bean.getRemark());contentValues.put("amount", bean.getAmount());contentValues.put("time", bean.getTimeStamp());contentValues.put("date", bean.getDate());db.insert(BD_NAME, null, contentValues);}/*** 刪除數據** @param uuid*/public void removeRecord(String uuid) {SQLiteDatabase db = this.getWritableDatabase();db.delete(BD_NAME, "uuid=?", new String[]{uuid});}/*** 更改** @param uuid* @param record*/public void editRecord(String uuid, RecordBean record) {//根據uuid刪除當前數據removeRecord(uuid);//設置uuidrecord.setUuid(uuid);//添加數據addRecord(record);}/*** 根據日期查詢數據 按大到小排序* @param dateStr 日期* @return RecordBean*/public LinkedList<RecordBean> readRecords(String dateStr){LinkedList<RecordBean> records =new LinkedList<>();SQLiteDatabase db = this.getWritableDatabase();Cursor cursor = db.rawQuery("select DISTINCT * from Record where date = ? order by time asc",new String[]{dateStr});if (cursor.moveToFirst()){do {String uuid = cursor.getString(cursor.getColumnIndex("uuid"));int type = cursor.getInt(cursor.getColumnIndex("type"));String category =cursor.getString(cursor.getColumnIndex("category"));String remark = cursor.getString(cursor.getColumnIndex("remark"));double amount = cursor.getDouble(cursor.getColumnIndex("amount"));String date = cursor.getString(cursor.getColumnIndex("date"));long timeStamp =cursor.getLong(cursor.getColumnIndex("timeStamp"));RecordBean recordBean = new RecordBean();recordBean.setUuid(uuid);recordBean.setType(type);recordBean.setCategory(category);recordBean.setRemark(remark);recordBean.setAmount(amount);recordBean.setDate(date);recordBean.setTimeStamp(timeStamp);records.add(recordBean);}while (cursor.moveToNext());}cursor.close();return records;}/*** 獲取有賬目的日期* @return*/public LinkedList<String> getAvaliableDate(){LinkedList<String> dates = new LinkedList<>();SQLiteDatabase db = this.getWritableDatabase();Cursor cursor = db.rawQuery("select DISTINCT * from Record order by date asc",new String[]{});if (cursor.moveToFirst()){do {String date = cursor.getString(cursor.getColumnIndex("date"));if (!dates.contains(date)){dates.add(date);}}while (cursor.moveToNext());}cursor.close();return dates;} }

    編輯主界面

    1.主界面功能? 此處省略。。。

    2.引入第三方開源庫? ?? ?這里作者使用的是?GitHub? ? 搜索??ticker? ?然后根據使用方法應用

    添加到?build.gradle (Mobule:app) 下 的?

    dependencies{} 里面

    頭部布局編寫

    首先在布局文件按CTRL+alt+shift+s? 選擇Dependencies? 增加

    com.android.support:support-v13:28.0.0

    com.android.support:design:28.0.0

    這兩個依賴

    然后下載圖標? + 我是在?https://material.io/icons? 下載的 然后復制到res文件夾下

    下面是布局代碼

    <?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"xmlns:app="http://schemas.android.com/apk/res-auto"android:fitsSystemWindows="true"tools:context=".MainActivity"><android.support.design.widget.AppBarLayoutandroid:id="@+id/app_bar_layout"android:layout_width="match_parent"android:layout_height="120dp"android:elevation="0dp"android:orientation="vertical"><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"><RelativeLayoutandroid:id="@+id/amount_layout"android:layout_width="match_parent"android:layout_height="80dp"><com.robinhood.ticker.TickerViewandroid:id="@+id/amount_text"android:elevation="0dp"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerHorizontal="true"android:textColor="@android:color/white"android:textSize="70dp" /><TextViewandroid:id="@+id/currency_text"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentTop="true"android:layout_alignParentEnd="true"android:layout_marginStart="0dp"android:layout_marginTop="0dp"android:layout_marginEnd="113dp"android:layout_toEndOf="@+id/amount_text"android:gravity="center"android:text="¥"android:textColor="@android:color/white"android:textSize="60dp" /></RelativeLayout><TextViewandroid:id="@+id/date_text"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_below="@+id/amount_layout"android:layout_centerHorizontal="true"android:text="00"android:textColor="@color/colorPrimaryDark"android:textStyle="bold" /></RelativeLayout></android.support.design.widget.AppBarLayout><android.support.design.widget.FloatingActionButtonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_margin="16dp"android:src="@drawable/baseline_add_black_48"app:layout_anchor="@+id/app_bar_layout"app:layout_anchorGravity="right|bottom"tools:layout_editor_absoluteX="328dp"tools:layout_editor_absoluteY="95dp" /></android.support.design.widget.CoordinatorLayout>

    效果圖:

    ?

    ?在代碼部分? 輸入?

    getSupportActionBar().setElevation(0); 陰影就去除了

    編寫每日花費 Pager

    新建布局 content_main? ? ? ?layout? 寫RelativeLayout

    在activity_main? 中引入content_main 布局

    <include layout ="@layout/content_main"/>

    下面是content_main布局

    <?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="match_parent"xmlns:app="http://schemas.android.com/apk/res-auto"app:layout_behavior="@string/appbar_scrolling_view_behavior"><android.support.v4.view.ViewPagerandroid:id="@+id/view_pager"android:layout_width="match_parent"android:layout_height="match_parent"></android.support.v4.view.ViewPager></RelativeLayout>

    編寫每日賬目 Fragment

    新建布局 fragment_main? ? ?

    <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent" android:layout_height="match_parent"><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"><TextViewandroid:id="@+id/day_text"android:background="#5e5e5e"android:text="LING"android:textColor="@android:color/white"android:paddingLeft="15dp"android:textStyle="bold"android:gravity="center_vertical"android:layout_width="match_parent"android:layout_height="35dp" /><ListViewandroid:id="@+id/listView"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_below="@+id/day_text"></ListView></RelativeLayout><RelativeLayoutandroid:id="@+id/no_record_layout"android:layout_width="match_parent"android:layout_height="match_parent"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="NO_RECORD_LAYOUT"android:layout_centerHorizontal="true"android:layout_centerVertical="true"android:textSize="20dp" /></RelativeLayout></FrameLayout>

    新建類? MainFragment? 繼承 Fragment

    /*** @author SmallLetters*/@SuppressLint("ValidFragment") public class MainFragment extends Fragment {private View mrootView;private TextView mtextView;private ListView mlistView;private String date = "";@SuppressLint("ValidFragment")public MainFragment(String date){this.date = date;}@Nullable@Overridepublic View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {mrootView = inflater.inflate(R.layout.fragment_main,container,false);initView();return mrootView;}private void initView(){mtextView = mrootView.findViewById(R.id.day_text);mlistView = mrootView.findViewById(R.id.listView);mtextView.setText(date);} }

    編寫ViewPager 適配器

    新建MainViewPagerAdapter? 繼承 FragmentPagerAdapter

    /*** @author SmallLetters*/ public class MainViewPagerAdapter extends FragmentPagerAdapter {LinkedList<MainFragment> fragments = new LinkedList<>();LinkedList<String> datas = new LinkedList<>();public MainViewPagerAdapter(FragmentManager fm) {super(fm);initFragments();}@Overridepublic Fragment getItem(int i) {return fragments.get(i);}@Overridepublic int getCount() {return fragments.size();}private void initFragments(){//測試數據datas.add("2018-10-07");datas.add("2018-10-08");datas.add("2018-10-09");//循環出有賬目的日期for (String date:datas){//設置日期MainFragment fragment = new MainFragment(date);fragments.add(fragment);}}/*** 獲取總日期數量* @return 最后一次記賬的日期*/public int getLastIndex(){return fragments.size()-1;}}

    實現ViewPage

    package com.sina.smallletters;import android.os.Bundle; import android.support.v4.view.ViewPager; import android.support.v7.app.AppCompatActivity;/*** @author smallletters@sina.com*/ public class MainActivity extends AppCompatActivity {private ViewPager viewPager;private MainViewPagerAdapter pagerAdapter;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);RecordBean recordBean = new RecordBean();viewPager = findViewById(R.id.view_pager);//布局陰影設置為0getSupportActionBar().setElevation(0);pagerAdapter = new MainViewPagerAdapter(getSupportFragmentManager());//更新pagerAdapter.notifyDataSetChanged();//設置ViewPager ->content_main.xmlviewPager.setAdapter(pagerAdapter);//顯示順序viewPager.setCurrentItem(pagerAdapter.getLastIndex());} }

    實現ListView

    drawable 下 新建circle .xml? ? ?圖片背景文件

    <shape xmlns:android="http://schemas.android.com/apk/res/android"android:shape="oval"><solid android:color="@android:color/darker_gray"/><size android:height="120dp" android:width="120dp"/></shape>

    Layout 下新建 cell_list_view? ?->? RelativeLayout

    <?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="match_parent"android:padding="16dp"><ImageViewandroid:id="@+id/imageView_category"android:background="@drawable/circle"android:layout_centerVertical="true"android:layout_alignParentLeft="true"android:layout_alignParentStart="true"android:layout_width="40dp"android:layout_height="40dp" /><LinearLayoutandroid:layout_centerVertical="true"android:layout_marginStart="16dp"android:layout_marginLeft="16dp"android:layout_toRightOf="@id/imageView_category"android:layout_width="200dp"android:layout_height="wrap_content"android:orientation="vertical"><TextViewandroid:id="@+id/textView_remark"android:textColor="@android:color/primary_text_light"android:textSize="20dp"android:text="PHONE"android:layout_width="match_parent"android:layout_height="wrap_content" /><TextViewandroid:id="@+id/textView_time"android:textSize="15dp"android:text="15:15"android:layout_width="match_parent"android:layout_height="wrap_content" /></LinearLayout><LinearLayoutandroid:layout_centerVertical="true"android:layout_alignParentRight="true"android:layout_alignParentEnd="true"android:layout_width="wrap_content"android:layout_height="wrap_content"><TextViewandroid:id="@+id/textView_amount"android:textSize="20dp"android:textStyle="bold"android:text="-20000.00"android:layout_width="wrap_content"android:layout_height="wrap_content" /></LinearLayout></RelativeLayout>

    配置ListView Adapter?

    新建ListViewAdapter? ? 繼承? BaseAdapter??

    /*** @author SmallLetters*/ public class ListViewAdapter extends BaseAdapter {private LinkedList<RecordBean> records = new LinkedList<>();private LayoutInflater minflater;private Context mcontext;public ListViewAdapter (Context context){this.mcontext=context;minflater = LayoutInflater.from(mcontext);}public void setData(LinkedList<RecordBean> record){this.records=record;//更新notifyDataSetChanged();}@Overridepublic int getCount() {return records.size();}@Overridepublic Object getItem(int i) {return records.get(i);}@Overridepublic long getItemId(int i) {return i;}@Overridepublic View getView(int i, View view, ViewGroup viewGroup) {ViewHolder holder;if (view == null){view=minflater.inflate(R.layout.cell_list_view,null);RecordBean recordBean = (RecordBean) getItem(i);holder = new ViewHolder(view,recordBean);view.setTag(holder);}else {holder = (ViewHolder) view.getTag();}return view;}class ViewHolder{TextView remarkTV;TextView amountTV;TextView timeTV;ImageView categoryIcon;public ViewHolder(View view,RecordBean recordBean){remarkTV = view.findViewById(R.id.textView_remark);amountTV=view.findViewById(R.id.textView_amount);timeTV=view.findViewById(R.id.textView_time);categoryIcon=view.findViewById(R.id.imageView_category);}}}

    然后在MainFragment 類里? 添加

    private LinkedList<RecordBean> records = new LinkedList<>(); private ListViewAdapter listViewAdapter;

    在MainFragment 類initView()方法中添加

    //測試數據records.add(new RecordBean());records.add(new RecordBean());records.add(new RecordBean());listViewAdapter = new ListViewAdapter(getContext());listViewAdapter.setData(records);mlistView.setAdapter(listViewAdapter);if (listViewAdapter.getCount() > 0){mrootView.findViewById(R.id.no_record_layout).setVisibility(View.INVISIBLE);}

    編寫鍵盤布局

    新建activity_add_record.xml

    <?xml version="1.0" encoding="utf-8"?> <RelativeLayout 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"tools:context=".AddRecordActivity"app:layout_behavior="@string/appbar_scrolling_view_behavior"><LinearLayoutandroid:id="@+id/LinearLayout"android:layout_width="match_parent"android:layout_height="220dp"android:background="@android:color/darker_gray"android:layout_alignParentBottom="true"android:layout_alignParentStart="true"android:layout_alignParentLeft="true"><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:layout_weight="0.25"><TableLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:background="@android:color/white"><TableRow android:layout_weight="10"><Buttonandroid:id="@+id/keyboard_seven"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_weight="1"android:background="@android:color/white"android:text="7" /><Buttonandroid:id="@+id/keyboard_eight"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_weight="1"android:background="@android:color/white"android:text="8" /><Buttonandroid:id="@+id/keyboard_nine"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_weight="1"android:background="@android:color/white"android:text="9" /></TableRow><TableRow android:layout_weight="10"><Buttonandroid:id="@+id/keyboard_four"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_weight="1"android:background="@android:color/white"android:text="4" /><Buttonandroid:id="@+id/keyboard_five"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_weight="1"android:background="@android:color/white"android:text="5" /><Buttonandroid:id="@+id/keyboard_six"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_weight="1"android:background="@android:color/white"android:text="6" /></TableRow><TableRow android:layout_weight="10"><Buttonandroid:id="@+id/keyboard_one"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_weight="1"android:background="@android:color/white"android:text="1" /><Buttonandroid:id="@+id/keyboard_two"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_weight="1"android:background="@android:color/white"android:text="2" /><Buttonandroid:id="@+id/keyboard_three"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_weight="1"android:background="@android:color/white"android:text="3" /></TableRow><TableRow android:layout_weight="10"><Buttonandroid:layout_width="match_parent"android:layout_height="match_parent"android:layout_weight="1"android:background="@android:color/white" /><Buttonandroid:id="@+id/keyboard_zero"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_weight="1"android:background="@android:color/white"android:text="0" /><Buttonandroid:id="@+id/keyboard_dot"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_weight="1"android:background="@android:color/white"android:text="." /></TableRow></TableLayout></RelativeLayout><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:layout_weight="0.75"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><ImageButtonandroid:id="@+id/keyboard_type"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_weight="1.7"android:background="@android:color/white"android:src="@drawable/baseline_add_circle_outline_black_18dp" /><ImageButtonandroid:id="@+id/keyboard_backspace"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_weight="2.5"android:background="@android:color/white"android:src="@drawable/baseline_backspace_black_18dp" /><ImageButtonandroid:id="@+id/keyboard_done"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_weight="2.5"android:background="@android:color/white"android:src="@drawable/baseline_check_black_18dp" /></LinearLayout></RelativeLayout></LinearLayout><RelativeLayoutandroid:background="@color/colorPrimaryDark"android:layout_above="@id/LinearLayout"android:layout_width="match_parent"android:layout_height="match_parent"><TextViewandroid:id="@+id/TextView_amount"android:gravity="center"android:textColor="@android:color/white"android:textSize="60dp"android:text="000"android:layout_width="match_parent"android:layout_height="80dp" /><EditTextandroid:id="@+id/EditText"android:layout_marginLeft="10dp"android:layout_marginRight="10dp"android:background="@drawable/bg_edit_text"android:layout_below="@+id/TextView_amount"android:layout_width="match_parent"android:layout_height="50dp" /><android.support.v7.widget.RecyclerViewandroid:layout_below="@+id/EditText"android:layout_margin="10dp"android:layout_width="match_parent"android:layout_height="match_parent"></android.support.v7.widget.RecyclerView></RelativeLayout></RelativeLayout>

    ? 鍵盤邏輯

    新建AddRecordActivity 類

    /*** @author SmallLetters*/ public class AddRecordActivity extends AppCompatActivity implements View.OnClickListener {private static String TAG ="AddRecordActivity";private TextView amountText;/*** 用來存儲鍵盤輸入的數*/private String userInput=" ";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_add_record);findViewById(R.id.keyboard_one).setOnClickListener(this);findViewById(R.id.keyboard_two).setOnClickListener(this);findViewById(R.id.keyboard_three).setOnClickListener(this);findViewById(R.id.keyboard_four).setOnClickListener(this);findViewById(R.id.keyboard_five).setOnClickListener(this);findViewById(R.id.keyboard_six).setOnClickListener(this);findViewById(R.id.keyboard_seven).setOnClickListener(this);findViewById(R.id.keyboard_eight).setOnClickListener(this);findViewById(R.id.keyboard_nine).setOnClickListener(this);findViewById(R.id.keyboard_zero).setOnClickListener(this);amountText = findViewById(R.id.TextView_amount);handleType();handleDot();handleBackspace();handleDone();}/*** 點*/private void handleDot(){findViewById(R.id.keyboard_dot).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {Log.d(TAG,"dot");if (!userInput.contains(".")){userInput += ".";}}});}/*** 支出/收入*/private void handleType(){findViewById(R.id.keyboard_type).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {Log.d(TAG,"type");}});}/*** 刪除/*/private void handleBackspace(){findViewById(R.id.keyboard_backspace).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {if (userInput.length()>0){//userInput有值 刪除一個數userInput=userInput.substring(0,userInput.length()-1);}if (userInput.length()>0 && userInput.charAt(userInput.length()-1)=='.'){//如果userInput有值 與 最后一個數是 . 刪除一個數userInput=userInput.substring(0,userInput.length()-1);}//更新amountTextupdateAmountText();}});}/***完成*/private void handleDone(){findViewById(R.id.keyboard_done).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {if (userInput.equals("")){//把輸入的字符串類型的數轉換成 double類型double amount = Double.valueOf(userInput);}else {}}});}@Overridepublic void onClick(View view) {Button button = (Button) view;String intent=button.getText().toString();Log.d(TAG,intent);if (userInput.contains(".")){//userInput 有 .if (userInput.split("\\.").length==1 || userInput.split("\\.")[1].length()< 2 ){//11.11 小數點后面 只能是兩位數userInput += intent;}}else {//沒有小數點userInput += intent;}updateAmountText();}/*** 鍵盤輸入設置TextView_amuont*/private void updateAmountText() {if (userInput.contains(".")){//有小數點if (userInput.split("\\.").length == 1){//只有一個點amountText.setText(userInput+"00");}else if (userInput.split("\\.")[1].length()==1){//小數點后面有一位數amountText.setText(userInput+"0");}else if (userInput.split("\\.")[1].length()==2){//小數點后面有兩位數amountText.setText(userInput);}}else {if (userInput.equals("")){//沒有數amountText.setText("0.00");}else {//輸入的是整數amountText.setText(userInput+".00");}}}}

    ?

    未完成? ?待續

    總結

    以上是生活随笔為你收集整理的基于 SQLite 开发Android studio 的记账APP的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。