`
jandroid
  • 浏览: 1933769 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

Android 实例-个人理财工具 之三 添加账单页面A

阅读更多

键字:android sdk1.0 sqlite intent ExpandableListActivity SimpleCursorTreeAdapter cursor custom dialog

 

ColaBox 登记收支记录终于进入了复杂阶段了.这个界面我也是查找了很多资料以及打开android的源代码看了后才完成了,现在想来Google的开源真是明智的啊.

 

从前面的登录页面跳转进入添加账单页面.这个页面主要是用来登记收支记录的.

说白了就是往数据库录入明细.

 

表结构就是db.execSQL("CREATE TABLE bills ("
                 + "_ID INTEGER PRIMARY KEY," //id
                 + "fee integer,"                                     //费用

                 +"acctitemid integer,"                          //账目类型
                 + "userid integer,"                                //使用者
                 + "sdate TEXT,"                                 //日期
                 + "stime TEXT,"                                //时间
                 + "desc TEXT"                                  //备注
                 + ");");

 

可以看到主要是录入这些数据.首先是布置界面,我目前想到的用个tablelayout来布局

最后布局就是如下图这样

 

图1

 

在这儿我首先需要设置账目,前面我们已经初始化过账目的数据.

账目应该是一个ExpandableListActivity 2层的结构.需要从数据库里面读取.我在账目后面放了一个editview 只读没有光标的.也就是在这儿不可录入,在该editview的onclick事件里面我们打开账目选择界面.如下图

 

图2 账目选择

 

在这个界面中点击子节点就返回前面界面,把选择的账目传递过去.在这有个问题,如果用户需要录入的账目没有怎么办?

所以我这没有用dialog方式而是用了ExpandableListActivity  在这个界面中如果长点某个子节点就弹出管理账目菜单,

来维护账目,如下图所示:

图3账目选择菜单示意                                                                    图4 编辑账目

 

 上面这些流程说起来很简单,可是当我用andriod编写时,遇到了很多问题,不过一个个都被我解决了,这正是编程的快乐所在.

关于ExpandableListActivity 大家可以参考android 里面apidemos 里面ExpandableList1,ExpandableList2,ExpandableList3

这里面对熟悉这个ui还是很有帮助的. 在ExpandableList2 里面就是从数据库进行读取的例子. 当然android里面那个我是没太

看明白因为他引用了import android.provider.Contacts.People; 联系人部分的框架,而我目前对数据库的操作和他不一样,我都是直接

sql访问.

但是你只要搞定2个cursor就ok了. Cursor groupCursor childCursor 其他都由SimpleCursorTreeAdapter帮你实现了.

下面我们来看看如何使用SimpleCursorTreeAdapter

  1. //首先要实现groupcursor就是父节点游标,这个其实就是我的acctitem表的
  2. //select * from accitem where pid is null 的结果
  3. Cursor groupCursor = billdb.getParentNode();
  4.          // Cache the ID column index
  5. mGroupIdColumnIndex = groupCursor.getColumnIndexOrThrow( "_ID" );
  6.          // Set up our adapter
  7. mAdapter =  new  MyExpandableListAdapter(groupCursor,  this ,       android.R.layout.simple_expandable_list_item_1,
  8.     android.R.layout.simple_expandable_list_item_1,
  9.          new  String[] {  "NAME"  },  // Name for group layouts
  10.          new   int [] { android.R.id.text1 }, 
  11.          new  String[] {  "NAME"  },  //
  12.          new   int [] { android.R.id.text1 });
  13. setListAdapter(mAdapter);
  14. //然后我要实现childCursor 
  15. //其实就是select * from acctitem where id=pid 的结果
  16. public   class  MyExpandableListAdapter extends SimpleCursorTreeAdapter {
  17. public  MyExpandableListAdapter(Cursor cursor, Context context,
  18.                  int  groupLayout,  int  childLayout, String[] groupFrom,
  19.                  int [] groupTo, String[] childrenFrom,  int [] childrenTo)
  20.  {
  21.             super(context, cursor, groupLayout, groupFrom, groupTo,
  22.                     childLayout, childrenFrom, childrenTo);
  23.   }
  24. protected Cursor getChildrenCursor(Cursor groupCursor) {
  25.    String pid = groupCursor.getLong(mGroupIdColumnIndex) + "";
       // Log.v("cola","pid="+pid);
       return billdb.getChildenNode(pid);
  26.   }
  27. }
  28. //我们看看Billdbhelper里面的cursor
  29.    public Cursor getParentNode(){
         return db.query("acctitem", new String[]{"_id", "name" }, "pid is null", null, null, null, "pid,_id");     
     
        }
       
        public Cursor getChildenNode(String pid){
         Log.v("cola","run getchildenNode");
         return db.query("acctitem", new String[]{"_id", "name" }, "pid="+pid, null, null, null, "_id");     
  30.     }
  31. 只要这几步一个2级的tree list就可以出现了.

上面其实才是刚开始,后面我们需要使用一个自定义的Dialog 类似于一个inputBox 因为我们新增账目是需要输入账目的名称.

就是上面图4表现的.

虽然alertDialog提供了很多方法,可以选择list,treelist,radio, 可惜就是不能录入text.

这里我参考了api demos 里面的 DateWidgets1.java 和源代码里面DatePickerDialog.java .

我们可以从alertdialog 继承.然后添加一个Editview 最后把数据返回出来.只要把上面我说的2个java看清楚了后处理起来就简单了.

主要是一个回调函数的用法.下面看代码

  1. //
  2. public   class  Dialog_edit extends AlertDialog implements OnClickListener {
  3.      private  String text =  "" ;
  4.      private  EditText edit;
  5.      private  OnDateSetListener mCallback; //定义回调函数
  6.      private  LinearLayout layout;
  7.      public   interface  OnDateSetListener {  //回调接口
  8.          void  onDateSet(String text);
  9.     }
  10.      protected  Dialog_edit(Context context, String title, String value,
  11.             OnDateSetListener Callback) {
  12.         super(context);
  13.         mCallback = Callback;
  14.         TextView label =  new  TextView(context);
  15.         label.setText( "hint" );
  16.          // setView(label);
  17.         edit =  new  EditText(context);
  18.         edit.setText(value);
  19.         layout =  new  LinearLayout(context);
  20.         layout.setOrientation(LinearLayout.VERTICAL);
  21.          // LinearLayout.LayoutParams param =
  22.          // new LinearLayout.LayoutParams(100, 40);
  23.          // layout.addView(label, param);
  24.         LinearLayout.LayoutParams param2 =  new  LinearLayout.LayoutParams(200,
  25.                 50);
  26.         layout.addView(edit, param2);
  27.        //添加edit
  28.         setView(layout);
  29.         setTitle(title);
  30.         setButton( "确定" this );
  31.         setButton2( "取消" , (OnClickListener)  null );
  32.     }
  33.      public   void  onClick(DialogInterface dialog,  int  which) {
  34.          // Log.v("cola","U click which="+which);
  35.         text = edit.getText().toString();
  36.         Log.v( "cola" "U click text="  + text);
  37.          if  (mCallback !=  null )
  38.             mCallback.onDateSet(text);  //使用回调返回录入的数据
  39.     }
  40. }

这样我们就完成了自定义的dialog 我们可以使用它来新增和编辑账目. 对于账目的增删改就是sql的事情了

在这我又遇到一个问题就是我新增一个账目后如何来刷新界面,从而反映账目修改后的变化

在这我开始以为只要使用 getExpandableListView().invalidate(); 就可以了,

因为我之前在ExpandableList1.java例子里面,使用它可以刷新界面.

在那个例子里面我修改了数组后调用该方法,界面就刷新了,而在这SimpleCursorTreeAdapter就行不通了,我想

应该只要刷新cursor应该就可以了,后来找到了notifyDataSetChanged 呵呵,果然可以了. 这样账目的录入和管理就搞定了.

 

下面给出目前最新的代码.

首先是账目管理

  1. package com.cola.ui;
  2. import android.app.AlertDialog;
  3. import android.app.ExpandableListActivity;
  4. import android.content.Context;
  5. import android.content.DialogInterface;
  6. import android.content.Intent;
  7. import android.database.Cursor;
  8. import android.os.Bundle;
  9. import android.provider.Contacts.People;
  10. import android.util.Log;
  11. import android.view.ContextMenu;
  12. import android.view.MenuItem;
  13. import android.view.View;
  14. import android.view.ContextMenu.ContextMenuInfo;
  15. import android.widget.ExpandableListAdapter;
  16. import android.widget.ExpandableListView;
  17. import android.widget.SimpleCursorTreeAdapter;
  18. import android.widget.TextView;
  19. import android.widget.ExpandableListView.ExpandableListContextMenuInfo;
  20. /**
  21.  * Demonstrates expandable lists backed by Cursors
  22.  */
  23. public   class  Frm_Editacctitem extends ExpandableListActivity {
  24.      private   int  mGroupIdColumnIndex;
  25.      private  String mPhoneNumberProjection[] =  new  String[] { People.Phones._ID,
  26.             People.Phones.NUMBER };
  27.      private  ExpandableListAdapter mAdapter;
  28.     BilldbHelper billdb;
  29.     Dialog_edit newdialog;
  30.     
  31.     
  32.      private  ExpandableListContextMenuInfo info;
  33.     
  34.     
  35.     @Override
  36.      public   void  onCreate(Bundle savedInstanceState) {
  37.         super.onCreate(savedInstanceState);
  38.         setTitle( "ColaBox-选择账目" );
  39.         billdb =  new  BilldbHelper( this );
  40.          // Query for people
  41.         Cursor groupCursor = billdb.getParentNode();
  42.          // Cache the ID column index
  43.         mGroupIdColumnIndex = groupCursor.getColumnIndexOrThrow( "_ID" );
  44.          // Set up our adapter
  45.         mAdapter =  new  MyExpandableListAdapter(groupCursor,  this ,
  46.                 android.R.layout.simple_expandable_list_item_1,
  47.                 android.R.layout.simple_expandable_list_item_1,
  48.                  new  String[] {  "NAME"  },  // Name for group layouts
  49.                  new   int [] { android.R.id.text1 },  new  String[] {  "NAME"  },  //
  50.                  new   int [] { android.R.id.text1 });
  51.         setListAdapter(mAdapter);
  52.         registerForContextMenu(getExpandableListView());
  53.     }
  54.     
  55.     @Override
  56.      public  boolean onChildClick(ExpandableListView parent, View v,  int  groupPosition,  int  childPosition,  long  id)
  57.     {
  58.         Bundle bundle =  new  Bundle();
  59.         bundle.putString( "DataKey" , ((TextView)v).getText().toString()); //给bundle 写入数据
  60.         Intent mIntent =  new  Intent();
  61.         mIntent.putExtras(bundle);
  62.         setResult(RESULT_OK, mIntent);
  63.         billdb.close();
  64.         finish(); 
  65.          return   true ;    
  66.     }
  67.     @Override
  68.      public   void  onCreateContextMenu(ContextMenu menu, View v,
  69.             ContextMenuInfo menuInfo) {
  70.         super.onCreateOptionsMenu(menu);
  71.          if  (ExpandableListView
  72.                 .getPackedPositionType(((ExpandableListContextMenuInfo) menuInfo).packedPosition) == 1) {
  73.             Log.v( "cola" "run menu" );
  74.             menu.setHeaderTitle( "菜单" );
  75.             menu.add(0, 1, 0,  "新 增" );
  76.             menu.add(0, 2, 0,  "删 除" );
  77.             menu.add(0, 3, 0,  "编 辑" );
  78.         }
  79.     }
  80.     @Override
  81.      public  boolean onContextItemSelected(MenuItem item) {
  82.         info = (ExpandableListContextMenuInfo) item.getMenuInfo();
  83.          if  (item.getItemId() == 1) {
  84.              // Log.v("cola","id"+info.id);
  85.             newdialog =  new  Dialog_edit( this "请输入新增账目的名称" "" ,
  86.                     mDialogClick_new);
  87.             newdialog.show();
  88.         }  else   if  (item.getItemId() == 2) {
  89.              new  AlertDialog.Builder( this ).setTitle( "提示" ).setMessage( "确定要删除'" +((TextView)info.targetView).getText().toString()+ "'这个账目吗?" )
  90.                     .setIcon(R.drawable.quit).setPositiveButton( "确定" ,
  91.                              new  DialogInterface.OnClickListener() {
  92.                                  public   void  onClick(DialogInterface dialog,
  93.                                          int  whichButton) {
  94.                                     billdb.Acctitem_delitem(( int )info.id);
  95.                                     updatedisplay();
  96.                                 }
  97.                             }).setNegativeButton( "取消" ,
  98.                              new  DialogInterface.OnClickListener() {
  99.                                  public   void  onClick(DialogInterface dialog,
  100.                                          int  whichButton) {
  101.                                      // 取消按钮事件
  102.                                 }
  103.                             }).show();
  104.         }  else   if  (item.getItemId() == 3) {
  105.             newdialog =  new  Dialog_edit( this "请修改账目名称" ,
  106.                     ((TextView) info.targetView).getText().toString(),
  107.                     mDialogClick_edit);
  108.             newdialog.show();
  109.         }
  110.          return   false ;
  111.     }
  112.      private  Dialog_edit.OnDateSetListener mDialogClick_new =  new  Dialog_edit.OnDateSetListener() {
  113.          public   void  onDateSet(String text) {
  114.             Log.v( "cola" "new acctitem" );
  115.             billdb.Acctitem_newitem(text,ExpandableListView.getPackedPositionGroup(info.packedPosition));
  116.             updatedisplay();
  117.         }
  118.     };
  119.     
  120.      private  Dialog_edit.OnDateSetListener mDialogClick_edit =  new  Dialog_edit.OnDateSetListener() {
  121.          public   void  onDateSet(String text) {            
  122.             billdb.Acctitem_edititem(text,( int )info.id);
  123.             updatedisplay();
  124.         }
  125.     };
  126.      private   void  updatedisplay(){
  127.         Log.v( "cola" "update display" );
  128.         ((MyExpandableListAdapter)mAdapter).notifyDataSetChanged();
  129.     }
  130.     
  131.      public   class  MyExpandableListAdapter extends SimpleCursorTreeAdapter {
  132.          public  MyExpandableListAdapter(Cursor cursor, Context context,
  133.                  int  groupLayout,  int  childLayout, String[] groupFrom,
  134.                  int [] groupTo, String[] childrenFrom,  int [] childrenTo) {
  135.             super(context, cursor, groupLayout, groupFrom, groupTo,
  136.                     childLayout, childrenFrom, childrenTo);
  137.         }
  138.         @Override
  139.          protected  Cursor getChildrenCursor(Cursor groupCursor) {
  140.             String pid = groupCursor.getLong(mGroupIdColumnIndex) +  "" ;
  141.              // Log.v("cola","pid="+pid);
  142.              return  billdb.getChildenNode(pid);
  143.         }
  144.         @Override
  145.          public   long  getGroupId( int  groupPosition) {
  146.              // Log.v("cola", "getGroupId " + groupPosition);
  147.             Cursor groupCursor = (Cursor) getGroup(groupPosition);
  148.              return  groupCursor.getLong(mGroupIdColumnIndex);
  149.         }
  150.         @Override
  151.          public   long  getChildId( int  groupPosition,  int  childPosition) {
  152.              // Log.v("cola", "getChildId " + groupPosition + "," +
  153.              // childPosition);
  154.             Cursor childCursor = (Cursor) getChild(groupPosition, childPosition);
  155.              return  childCursor.getLong(0);
  156.         }
  157.     }
  158. }

自定义对话框

  1. package com.cola.ui;
  2. import android.app.AlertDialog;
  3. import android.content.Context;
  4. import android.content.DialogInterface;
  5. import android.content.DialogInterface.OnClickListener;
  6. import android.util.Log;
  7. import android.widget.EditText;
  8. import android.widget.LinearLayout;
  9. import android.widget.TextView;
  10. public   class  Dialog_edit extends AlertDialog implements OnClickListener {
  11.      private  String text =  "" ;
  12.      private  EditText edit;
  13.      private  OnDateSetListener mCallback;
  14.      private  LinearLayout layout;
  15.      public   interface  OnDateSetListener {
  16.          void  onDateSet(String text);
  17.     }
  18.      protected  Dialog_edit(Context context, String title, String value,
  19.             OnDateSetListener Callback) {
  20.         super(context);
  21.         mCallback = Callback;
  22.         TextView label =  new  TextView(context);
  23.         label.setText( "hint" );
  24.          // setView(label);
  25.         edit =  new  EditText(context);
  26.         edit.setText(value);
  27.         layout =  new  LinearLayout(context);
  28.         layout.setOrientation(LinearLayout.VERTICAL);
  29.          // LinearLayout.LayoutParams param =
  30.          // new LinearLayout.LayoutParams(100, 40);
  31.          // layout.addView(label, param);
  32.         LinearLayout.LayoutParams param2 =  new  LinearLayout.LayoutParams(200,
  33.                 50);
  34.         layout.addView(edit, param2);
  35.         setView(layout);
  36.         setTitle(title);
  37.         setButton( "确定" this );
  38.         setButton2( "取消" , (OnClickListener)  null );
  39.     }
  40.      public   void  onClick(DialogInterface dialog,  int  which) {
  41.          // Log.v("cola","U click which="+which);
  42.         text = edit.getText().toString();
  43.         Log.v( "cola" "U click text="  + text);
  44.          if  (mCallback !=  null )
  45.             mCallback.onDateSet(text);
  46.     }
  47. }

数据库管理代码

  1. package com.cola.ui;
  2. import android.content.Context;
  3. import android.database.Cursor;
  4. import android.database.sqlite.SQLiteDatabase;
  5. import android.util.Log;
  6. /**
  7.  * Provides access to a database of notes. Each note has a title, the note
  8.  * itself, a creation date and a modified data.
  9.  */
  10. public   class  BilldbHelper {
  11.      private   static  final String TAG =  "Cola_BilldbHelper" ;
  12.      private   static  final String DATABASE_NAME =  "cola.db" ;
  13.     
  14.     SQLiteDatabase db;
  15.     Context context;
  16.     
  17.     BilldbHelper(Context _context) {
  18.         context=_context;
  19.         db=context.openOrCreateDatabase(DATABASE_NAME, 0,  null ); 
  20.         Log.v(TAG, "db path=" +db.getPath());
  21.     }
  22.     
  23.      public   void  CreateTable_acctitem() {
  24.          try {
  25.             db.execSQL( "CREATE TABLE acctitem ("
  26.                     +  "_ID INTEGER PRIMARY KEY,"
  27.                     +  "PID integer,"
  28.                     +  "NAME TEXT"                
  29.                     +  ");" );
  30.             Log.v( "cola" , "Create Table acctitem ok" );
  31.         } catch (Exception e){
  32.             Log.v( "cola" , "Create Table acctitem err,table exists." );
  33.         }
  34.     }
  35.     
  36.      public   void  CreateTable_bills() {
  37.          try {
  38.             db.execSQL( "CREATE TABLE bills ("
  39.                     +  "_ID INTEGER PRIMARY KEY,"
  40.                     + " acctitemid integer,"    
  41.                     +  "fee integer,"
  42.                     +  "userid integer,"
  43.                     +  "sdate TEXT,"
  44.                     +  "stime TEXT,"
  45.                     +  "desc TEXT"                 
  46.                     +  ");" );
  47.             
  48.             Log.v( "cola" , "Create Table acctitem ok" );
  49.         } catch (Exception e){
  50.             Log.v( "cola" , "Create Table acctitem err,table exists." );
  51.         }
  52.     }
  53.     
  54.      public   void  CreateTable_colaconfig() {
  55.          try {
  56.             db.execSQL( "CREATE TABLE colaconfig ("
  57.                     +  "_ID INTEGER PRIMARY KEY,"
  58.                     +  "NAME TEXT"             
  59.                     +  ");" );
  60.             Log.v( "cola" , "Create Table colaconfig ok" );
  61.         } catch (Exception e){
  62.             Log.v( "cola" , "Create Table acctitem err,table exists." );
  63.         }
  64.     }
  65.     
  66.      public   void  InitAcctitem() {
  67.          try {
  68.            //s.getBytes(encoding);
  69.           db.execSQL( "insert into acctitem values (1,null,'收入')" );
  70.           db.execSQL( "insert into acctitem values (2,1,'工资')" );
  71.           db.execSQL( "insert into acctitem values (9998,1,'其他')" );
  72.           db.execSQL( "insert into acctitem values (0,null,'支出')" );
  73.           db.execSQL( "insert into acctitem values (3,0,'生活用品')" );
  74.           db.execSQL( "insert into acctitem values (4,0,'水电煤气费')" );
  75.           db.execSQL( "insert into acctitem values (5,0,'汽油费')" );
  76.           db.execSQL( "insert into acctitem values (9999,0,'其他')" );
  77.           
  78.            //db.execSQL("insert into bills values(100,135,10000,'','','备注')");
  79.           Log.v( "cola" , "insert into ok" ); 
  80.         } catch (Exception e)
  81.         {
  82.             Log.v( "cola" , "init acctitem e=" +e.getMessage());
  83.         }
  84.         
  85.     }
  86.      public   void  Acctitem_newitem(String text, int  type){
  87.         
  88.         Cursor c =db.query( "acctitem" new  String[]{ "max(_id)+1" },  "_id is not null and _id<9998" null null null null );
  89.         c.moveToFirst();
  90.          int  maxid=c.getInt(0);      
  91.         String sql= "insert into acctitem values (" +maxid+ "," +type+ ",'" +text+ "')" ;
  92.         db.execSQL(sql);
  93.         Log.v( "cola" , "newitem ok text=" +text+ " id=" +type+ " sql=" +sql);
  94.         
  95.     }
  96.     
  97.      public   void  Acctitem_edititem(String text, int  id){      
  98.         db.execSQL( "update acctitem set name='" +text+ "' where _id=" +id);
  99.         Log.v( "cola" , "edititem ok text=" +text+ " id=" +id);
  100.     }
  101.     
  102.      public   void  Acctitem_delitem( int  id){
  103.         
  104.         db.execSQL( "delete from acctitem where _id=" +id);
  105.         Log.v( "cola" , "delitem ok id=" +id);
  106.     }
  107.     
  108.      public   void  QueryTable_acctitem(){
  109.         
  110.     }
  111.     
  112.      public   void  FirstStart(){
  113.          try {
  114.             String col[] = { "type" "name"  };
  115.             Cursor c =db.query( "sqlite_master" , col,  "name='colaconfig'" null null null null );
  116.              int  n=c.getCount();
  117.              if  (c.getCount()==0){
  118.                 CreateTable_acctitem();
  119.                 CreateTable_colaconfig();
  120.                 CreateTable_bills();
  121.                 InitAcctitem();         
  122.             }           
  123.              //getTree();            
  124.             Log.v( "cola" , "c.getCount=" +n+ "" );
  125.                     
  126.             
  127.         } catch (Exception e){
  128.             Log.v( "cola" , "e=" +e.getMessage());
  129.         }
  130.         
  131.         
  132.     }
  133.     
  134.     
  135.      public   void  close(){
  136.         db.close();
  137.     }
  138.     
  139.      public  Cursor getParentNode(){
  140.          return  db.query( "acctitem" new  String[]{ "_id" "name"  },  "pid is null" null null null "pid,_id" );      
  141.   
  142.     }
  143.     
  144.      public  Cursor getChildenNode(String pid){
  145.         Log.v( "cola" , "run getchildenNode" );
  146.          return  db.query( "acctitem" new  String[]{ "_id" "name"  },  "pid=" +pid,  null null null "_id" );     
  147.     }
  148.    
  149. }

 

这段代码搞了2个通宵.昨天晚上又被ubuntu 8.04和vmware 5.5 折腾死.我的周末就这样泡汤了.

##############################################

2008-11-23 01:43 湖北武汉

 

 

 

##############################################

备注:

      今天看了下android的dialog例子,发现android 带了可输入文字的dialog例子,呵呵,实际上和我自定义的方法就是类似的.

我之前还是demo看的太少了,也就不会走弯路了.

      具体可以看AlertDialogSamples.java

分享到:
评论

相关推荐

    Android 个人理财工具三:添加账单页面 上

    总之,实现Android个人理财工具的账单页面涉及数据库设计、界面布局和数据适配器的使用。通过精心设计和代码实现,用户可以方便地添加和管理他们的财务记录,从而提高个人财务管理的效率。在后续的部分,开发者可能...

    Android应用小实例--炫酷计时器

    在这个“Android应用小实例--炫酷计时器”中,我们将深入探讨如何在Android应用中创建并定制一个功能丰富的计时器。 计时器组件在Android SDK中是`android.widget.Chronometer`类,它类似于一个倒计时定时器,但...

    个人理财通(Android).zip

    总结,个人理财通(Android)是Android平台上的一款实用理财工具,它结合了Android系统的特性和财务管理的需求,提供了全面的个人财务解决方案。虽然缺乏官方文档,但对于用户来说,它的直观界面和实用功能足以满足...

    Fragment实例-Android Studio项目

    在这个"Fragment实例-Android Studio项目"中,我们可以深入理解Fragment的使用方法以及如何在不同设备上适配。 1. **Fragment基本概念** Fragment是Activity的一部分,可以包含UI组件和业务逻辑。它们可以在一个...

    Android串口开发(android-serialport-api开发)工程实例

    Android串口开发(android-serialport-api开发)工程实例。SerialPortUtil里面有我常用的转换工具(16进制字符串转二进制字符串并补位、二进制字符串转16进制字符串并补位)

    android 实例源码 集合

    在Android开发领域,掌握实例源码是提升技能和理解系统工作原理的重要途径。"android 实例源码 集合" 提供了多种Android应用程序的源代码,这为我们提供了宝贵的参考资源,帮助开发者深入理解Android应用开发的各种...

    android-sdk-windows.rar

    4. 配置AVD(Android Virtual Device):通过AVD Manager创建模拟器实例,选择设备配置、系统镜像和硬件选项,以便在Windows上运行Android应用。 三、使用Android SDK进行开发 1. 创建项目:使用Android Studio,...

    Android 个人理财工具五:显示账单明细 上

    在Android应用开发中,创建一个个人理财工具的关键部分之一是展示用户的收支明细。在这个场景下,开发者需要从SQLite数据库中提取数据并将其呈现给用户。本文将深入探讨如何实现这一功能,特别是如何利用ListView和...

    android 仿京东商品三级分类简单实例

    在Android开发中,构建一个类似京东商品的三级分类系统是一项常见的任务,这涉及到用户界面设计、数据结构管理和触摸事件处理等多个方面。在这个简单的实例中,我们将探讨如何在Android平台上实现这样的功能,不涉及...

    Android-Universal-Image-Loader Demo和jar包

    《Android-Universal-Image-Loader:高效加载与缓存图片的解决方案》 在移动开发领域,尤其是Android平台,图片加载和缓存是一个重要的课题。Android-Universal-Image-Loader(简称UIL)是一款强大的开源库,专门...

    Android-Adt-sdk(18-19)

    Android ADT SDK(Android Developer Tools Software Development Kit)是Android开发者用于构建、调试和发布Android应用程序的重要工具集。这个压缩包包含了版本18和19的SDK,分别对应Android 4.3 (API Level 18) ...

    Android Fragment实例

    在Android应用开发中,Fragment是Android SDK中的一个重要组件,它被设计用来支持多屏幕适配和增强用户界面的模块化。Fragment允许开发者将应用程序的功能或UI部分分解为独立的、可重用的组件,这些组件可以在不同的...

    android-async-http-master

    为了使用这个库,开发者需要将其添加到项目的依赖库中,如果是使用Gradle构建系统,可以在`build.gradle`文件中添加依赖。然后,就可以在代码中创建`AsyncHttpClient`实例,配置请求参数,并注册回调来处理请求结果...

    Android-友盟第三方登录、分享实现 完整实例源码

    本文将深入探讨如何在Android项目中实现友盟(Umeng)的第三方登录与分享功能,结合提供的完整实例源码,帮助开发者更好地理解和运用这一技术。 首先,让我们了解什么是友盟。友盟是阿里巴巴移动事业群旗下的开放...

    android实例开发完全手册

    《Android实例开发完全手册》是一本深度探讨Android应用开发的实战型书籍,旨在通过丰富的实例帮助读者掌握Android开发的核心技术和实践技巧。这本书涵盖了从基础到高级的各个方面,为开发者提供了全面的学习路径。 ...

    Android NDK调用第三方的动态库实例-绝对简单易用

    这个是Android NDK上调用第三方的动态库的实例,而且代码简单容易理解,非常适合新手学习参考,因为网上很多资源是C2C(Copy to Copy)的,有些还不能运行,容易误导新手,并且还要设置积分,我免积分提供给网友下载...

    android简单定位实例

    在Android平台上,实现简单的定位功能是一项常见的任务,它涉及到Android系统的地理位置服务,主要依赖于GPS(全球定位系统)以及网络定位技术。本实例将详细解析如何在Android应用中集成定位功能,让应用能够获取到...

    Android创意实例详解书籍源码

    《Android创意实例详解》这本书籍源码的分享,旨在为Android开发者提供丰富的实践案例和学习资源。这份源码集合涵盖了Android应用开发中的多种创新技术与设计思路,是深入理解和掌握Android开发技能的理想辅助资料。...

    OpenGL ES 2 for Android A Quick-Start Guide

    Android作为全球最受欢迎的移动操作系统之一,提供了对OpenGL ES 2的广泛支持。这意味着开发者可以利用这一强大工具来创建引人入胜的游戏和视觉效果丰富的应用程序。为了有效地使用OpenGL ES 2进行开发,本书涵盖了...

    Android Wi-Fi Direct 开发示例代码

    **Android Wi-Fi Direct 开发详解** Wi-Fi Direct,也称为Wi-Fi P2P(Peer-to-Peer),是一种无线网络连接技术,允许设备之间无需通过传统Wi-Fi接入点(如路由器)进行直接通信。这种技术在Android平台上被广泛用于...

Global site tag (gtag.js) - Google Analytics