家庭记账本安卓版开发:第六天

一、成果展示

今天在昨天的基础上,做了一些完善,在数据库中添加了一列int型数据position,用于获取Spinner组件的value值对应的position值,加以保存读取,来实现将取值赋给Spinner组件的默认值,成功实现了下拉框的数据读取显示,进而实现了下拉框对应数据,也就是账目类型的修改,解决了一些bug,关于Activity的生命周期进行了调整,以避免了按返回键时会跳转回上一个画面,而不是它对应的上一级Activity,还解决了如果对数据进行多次查看详细信息,进行修改时,返回原Activity时账目不刷新,以及程序崩溃的问题。

修改信息

保存修改

再次查看

点击删除

二、明天的计划

加入筛选,模糊查询,需要学习Echart的使用,复习javaweb的知识。

三、原码展示

AndroidMainfest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.familybook">

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="家庭记账本"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.AppCompat.DayNight.DarkActionBar">
        <activity android:name=".LoginActivity" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".IndexActivity" android:launchMode="singleTask"/>
        <activity android:name=".RegisterActivity" android:launchMode="singleTask"/>
        <activity android:name=".AddBillActivity" android:launchMode="singleTask"/>
        <activity android:name=".QueryAllActivity"   />
        <activity android:name=".InfoActivity" android:launchMode="singleTask"/>
    </application>

</manifest>

AddBillActivity.java

package com.example.familybook;

import android.app.Activity;
import android.app.DatePickerDialog;
import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.Nullable;

import com.example.familybook.dao.BillDaoImpl;
import com.example.familybook.dao.IBillDao;
import com.example.familybook.entity.Bill;

import java.sql.Date;
import java.util.Calendar;

public class AddBillActivity extends Activity {
    private int mYear;
    private int mMonth;
    private int mDay;
    private int mPosition;
    private Spinner  mTypeSpin;
    private EditText mMoney;
    private TextView mDate;
    private EditText mRemark;
    private Button mAddBillBtn;
    private IBillDao mIBillDao;
    private String mTypeText;
    private String mUsername;
    private String TAG="AddBillActivity";

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_addbill);

        //

        //获取登录者的用户名
        Intent intent =getIntent();
        mUsername =intent.getStringExtra("username");
        Log.e(TAG,"使用者:"+mUsername);

        //获取时间
        initDate();

        //初始化控件
        initView();

        //添加监听事件
        initListener();
    }

    private void initDate() {
        //获取当前时间
        Calendar ca = Calendar.getInstance();
        mYear = ca.get(Calendar.YEAR);
        mMonth = ca.get(Calendar.MONTH);
        mDay = ca.get(Calendar.DAY_OF_MONTH);
    }

    private void initListener() {

        mTypeSpin.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                mPosition=position;
                mTypeText=parent.getItemAtPosition(position).toString();
                Toast.makeText(AddBillActivity.this,mTypeText,Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {

            }
        });
        mDate.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //调用时间选择器
                DatePickerDialog datePickerDialog = new DatePickerDialog(AddBillActivity.this, R.style.MyDatePickerDialogTheme, onDateSetListener, mYear, mMonth, mDay);
                //获取时间戳
                long timeStamp = System.currentTimeMillis();
                //设置可以显示的最晚的时间
                datePickerDialog.getDatePicker().setMaxDate(timeStamp);
                //弹框
                datePickerDialog.show();
            }
        });
        mAddBillBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                addBill();
            }
        });
    }

    /**
     * 日期选择器对话监听
     */
    private DatePickerDialog.OnDateSetListener onDateSetListener = new DatePickerDialog.OnDateSetListener() {

        @Override
        public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
            mYear = year;
            mMonth = monthOfYear;
            mDay = dayOfMonth;

            String days;
            if (mMonth + 1 < 10) {
                if (mDay < 10) {
                    days = new StringBuffer().append(mYear).append("-").append("0").
                            append(mMonth + 1).append("-").append("0").append(mDay).append("").toString();
                } else {
                    days = new StringBuffer().append(mYear).append("-").append("0").
                            append(mMonth + 1).append("-").append(mDay).append("").toString();
                }

            } else {
                if (mDay < 10) {
                    days = new StringBuffer().append(mYear).append("-").
                            append(mMonth + 1).append("-").append("0").append(mDay).append("").toString();
                } else {
                    days = new StringBuffer().append(mYear).append("-").
                            append(mMonth + 1).append("-").append(mDay).append("").toString();
                }

            }

            mDate.setText(days);
        }
    };
    private void addBill() {
        Bill bill=null;
        //获取账目类型
        if(mTypeText==null){
            //说明用户未点击按钮,选择默认首项:饮食
            mTypeText="饮食";
            mPosition=0;
        }
        //获取账目金额
        String moneyText=mMoney.getText().toString().trim();
        //获取日期
        String  date= mDate.getText().toString().trim();
        //获取备注
        String remarkText=mRemark.getText().toString().trim();
        if(TextUtils.isEmpty(moneyText)){
            //账目金额为空
            Toast.makeText(this,"账目金额不可以为空",Toast.LENGTH_SHORT).show();
            return;
        }else if(TextUtils.isEmpty((CharSequence) date)){
            //账目日期为空
            Toast.makeText(this,"账目日期不可以为空",Toast.LENGTH_SHORT).show();
            return;
        }else {
            Log.e(TAG, "账户:" + mUsername);
            Log.e(TAG, "类型:" + mTypeText);
            Log.e(TAG, "类型:" + mPosition);
            Log.e(TAG, "金额:" + moneyText);
            Log.e(TAG, "日期:" + date);
            Log.e(TAG, "备注:" + remarkText);
            bill=new Bill(mUsername,mTypeText,mPosition,moneyText,date,remarkText);
            int rs=(int)mIBillDao.AddBill(bill);
            Log.e(TAG,"rs:"+rs);
            if (rs > -1) {
                //添加成功,跳回首面
                Intent intent = new Intent();
                setResult(2, intent);
                finish();
            }
        }
    }

    private void initView() {
        mTypeSpin =(Spinner) this.findViewById(R.id.type_spin);
        mMoney =(EditText)this.findViewById(R.id.bill_money);
        mDate =(TextView) this.findViewById(R.id.bill_date);
        mRemark=(EditText)this.findViewById(R.id.bill_remark);
        mAddBillBtn=(Button)this.findViewById(R.id.add_bill_btn);
        mIBillDao  =new BillDaoImpl(AddBillActivity.this);
    }
}

InfoActivity.java

package com.example.familybook;

import android.app.Activity;
import android.app.DatePickerDialog;
import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.Adapter;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.Nullable;

import com.example.familybook.dao.BillDaoImpl;
import com.example.familybook.dao.IBillDao;
import com.example.familybook.entity.Bill;

import java.util.Calendar;

public class InfoActivity extends Activity {
    private Bill mBill;
    private String mUsername;
    private int mBillID;
    private int mYear;
    private int mMonth;
    private int mDay;
    private int mPosition;
    private Spinner mTypeSpin;
    private EditText mMoney;
    private TextView mDate;
    private EditText mRemark;
    private Button mUpdateBillBtn;
    private Button mDeleteBillBtn;
    private IBillDao mIBillDao;
    private String mTypeText;
    private String TAG="InfoActivity";

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_info);

        //获取登录者的用户名
        Intent intent =getIntent();
        mUsername =intent.getStringExtra("username");
        mBillID =intent.getIntExtra("bill_id",mBillID);

        Log.e(TAG,"使用者:"+mUsername);
        Log.e(TAG,"账单号:"+mBillID);

        //获取时间
        initDate();

        //初始化控件
        initView();

        //从数据库获取信息,并完成信息初始化
        mBill=mIBillDao.QueryBill(mBillID);
        initInfo();
        //添加监听事件
        initListener();
    }

    private void initInfo() {
        mTypeSpin.setSelection(mBill.getTypeposition());
        mMoney.setText(mBill.getMoney());
        mDate.setText(mBill.getDate());
        mRemark.setText(mBill.getRemark());
    }

    private void initDate() {
        //获取当前时间
        Calendar ca = Calendar.getInstance();
        mYear = ca.get(Calendar.YEAR);
        mMonth = ca.get(Calendar.MONTH);
        mDay = ca.get(Calendar.DAY_OF_MONTH);
    }

    private void initListener() {
        mTypeSpin.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                mPosition=position;
                mTypeText=parent.getItemAtPosition(position).toString();
                Toast.makeText(InfoActivity.this,mTypeText,Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {

            }
        });

        mDate.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //调用时间选择器
                DatePickerDialog datePickerDialog = new DatePickerDialog(InfoActivity.this, R.style.MyDatePickerDialogTheme, onDateSetListener, mYear, mMonth, mDay);
                //获取时间戳
                long timeStamp = System.currentTimeMillis();
                //设置可以显示的最晚的时间
                datePickerDialog.getDatePicker().setMaxDate(timeStamp);
                //弹框
                datePickerDialog.show();
            }
        });
        mDeleteBillBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                deleteBill();
            }
        });
        mUpdateBillBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                updateBill();
            }
        });

    }

    /**
     * 进行修改
     */
    private void updateBill() {
        Bill bill=null;
        //获取账目类型

        //获取账目金额
        String moneyText=mMoney.getText().toString().trim();
        //获取日期
        String  date= mDate.getText().toString().trim();
        //获取备注
        String remarkText=mRemark.getText().toString().trim();
        if(TextUtils.isEmpty(moneyText)){
            //账目金额为空
            Toast.makeText(this,"账目金额不可以为空",Toast.LENGTH_SHORT).show();
            return;
        }else if(TextUtils.isEmpty((CharSequence) date)){
            //账目日期为空
            Toast.makeText(this,"账目日期不可以为空",Toast.LENGTH_SHORT).show();
            return;
        }else {
            Log.e(TAG, "账户:" + mUsername);
            Log.e(TAG, "类型:" + mTypeText);
            Log.e(TAG, "类型:" + mPosition);
            Log.e(TAG, "金额:" + moneyText);
            Log.e(TAG, "日期:" + date);
            Log.e(TAG, "备注:" + remarkText);
            bill=new Bill(mUsername,mTypeText,mPosition, moneyText,date,remarkText);
            boolean rs=mIBillDao.Update(mBillID,bill);
            Log.e(TAG,"rs:"+rs);
            if (rs ) {
                //修改成功,跳回账页
                Intent intent = new Intent();
                intent.putExtra("username",mUsername);
                intent.setClass(this,QueryAllActivity.class);
                startActivity(intent);
                finish();
            }
        }
    }

    /**
     * 进行删除
     */
    private void deleteBill() {
        boolean rs=mIBillDao.DeleteBill(mBillID);
        if(rs){
            //删除成功,跳回账页
            Intent intent = new Intent();
            intent.putExtra("username",mUsername);
            intent.setClass(this,QueryAllActivity.class);
            startActivity(intent);
            finish();
        }

    }

    /**
     * 日期选择器对话监听
     */
    private DatePickerDialog.OnDateSetListener onDateSetListener = new DatePickerDialog.OnDateSetListener() {

        @Override
        public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
            mYear = year;
            mMonth = monthOfYear;
            mDay = dayOfMonth;

            String days;
            if (mMonth + 1 < 10) {
                if (mDay < 10) {
                    days = new StringBuffer().append(mYear).append("-").append("0").
                            append(mMonth + 1).append("-").append("0").append(mDay).append("").toString();
                } else {
                    days = new StringBuffer().append(mYear).append("-").append("0").
                            append(mMonth + 1).append("-").append(mDay).append("").toString();
                }

            } else {
                if (mDay < 10) {
                    days = new StringBuffer().append(mYear).append("-").
                            append(mMonth + 1).append("-").append("0").append(mDay).append("").toString();
                } else {
                    days = new StringBuffer().append(mYear).append("-").
                            append(mMonth + 1).append("-").append(mDay).append("").toString();
                }

            }

            mDate.setText(days);
        }
    };

    private void initView() {
        mTypeSpin =(Spinner) this.findViewById(R.id.type_spin);
        mMoney =(EditText)this.findViewById(R.id.bill_money);
        mDate =(TextView) this.findViewById(R.id.bill_date);
        mRemark=(EditText)this.findViewById(R.id.bill_remark);
        mUpdateBillBtn=(Button)this.findViewById(R.id.update_btn);
        mDeleteBillBtn=(Button)this.findViewById(R.id.delete_btn);
        mIBillDao  =new BillDaoImpl(InfoActivity.this);
    }
}

QueryAllActivity.java

package com.example.familybook;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Intent;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.ScrollView;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.Nullable;

import com.example.familybook.dao.BillDaoImpl;
import com.example.familybook.dao.IBillDao;
import com.example.familybook.entity.Bill;
import com.example.familybook.utils.ShowBillsAdapter;
import com.example.familybook.utils.ViewHolder;

import java.util.List;

public class QueryAllActivity extends Activity {
    private String mUsername;
    private String TAG="QueryAllActivity";
    private List <Bill> mShowBills;
    private IBillDao mIBillDao;
    private SQLiteOpenHelper mBillDatabaseHelper;
    private ListView mShowBillList;
    private int mInfoCode=1;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_list);
        this.setTitle("总览账目信息");

        //获取登录者的用户名
        Intent intent =getIntent();
        mUsername =intent.getStringExtra("username");
        Log.e(TAG,"使用者:"+mUsername);

        //初始化控件
        initView();

        //获取表格布局
        mShowBillList=(ListView)findViewById(R.id.list_View);

        //获取从数据库获得的表单
        mShowBills=mIBillDao.listAllBill(mUsername);

        //新建并配置Show
        ShowBillsAdapter  ShowAdapter=new ShowBillsAdapter(mShowBills,this);
        mShowBillList.setAdapter(ShowAdapter);
        mShowBillList.deferNotifyDataSetChanged();
        //添加事件监听
        initListener();
    }

    private void initListener() {
        mShowBillList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Bill bill =mShowBills.get(position);
                int bill_id=bill.get_id();
                Intent intent=new Intent();
                intent.putExtra("username",mUsername);
                intent.putExtra("bill_id",bill_id);
                intent.setClass(QueryAllActivity.this,InfoActivity.class);
                startActivity(intent);
                finish();
            }
        });

    }

    private void initView() {
        mIBillDao =new BillDaoImpl(QueryAllActivity.this);

    }

}

BillDaoImpl.java

package com.example.familybook.dao;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

import com.example.familybook.database.FamilyBookDatabaseHelper;
import com.example.familybook.entity.Bill;
import com.example.familybook.utils.Constants;

import java.util.ArrayList;
import java.util.List;

public class BillDaoImpl implements IBillDao {
    private  final FamilyBookDatabaseHelper mBillDatabaseHelper;
    private IBillDao mIBillDao;

    public BillDaoImpl(Context context){
        mBillDatabaseHelper=new FamilyBookDatabaseHelper(context);
    }

    /**
     * 添加账目
     * @param bill
     * @return
     */
    @Override
    public long AddBill(Bill bill) {
        SQLiteDatabase db =mBillDatabaseHelper.getWritableDatabase();
        long result =-1;
        try {
            ContentValues values  =new ContentValues();
            values.put(Constants.BILL_TABLE_FIELD_UNAME,bill.getUsername());
            values.put(Constants.BILL_TABLE_FIELD_TYPE,bill.getType());
            values.put(Constants.BILL_TABLE_FIELD_TYPEP_OSITION,bill.getTypeposition());
            values.put(Constants.BILL_TABLE_FIELD_MONEY,bill.getMoney());
            values.put(Constants.BILL_TABLE_FIELD_DATE,bill.getDate());
            values.put(Constants.BILL_TABLE_FIELD_REMARK,bill.getRemark());
            result=db.insert(Constants.BILL_TABLE_NAME,null,values);
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            db.close();
        }

        return result;
    }

    @Override
    public List<Bill> listAllBill(String username) {
        List<Bill> bills= new ArrayList<>();
        Bill bill=null;
        SQLiteDatabase db = mBillDatabaseHelper.getWritableDatabase();

        try {

            String sql ="select * from "+Constants.BILL_TABLE_NAME+" where "+Constants.BILL_TABLE_FIELD_UNAME+"=? ";
            String[] str  =new  String[]{username};
            Cursor cursor =db.rawQuery(sql,str);
            /**
             * 下面在库中进行具体查询,并将
             */
            while (cursor.moveToNext()){
                /**
                 * 将查到的数据逐一获取
                 */

                //set id
                int billID = cursor.getInt(cursor.getColumnIndex(Constants.BILL_TABLE_FIELD_ID));
                //set type
                String type=cursor.getString(cursor.getColumnIndex(Constants.BILL_TABLE_FIELD_TYPE));
                //set type_position
                int type_position=cursor.getInt(cursor.getColumnIndex(Constants.BILL_TABLE_FIELD_TYPEP_OSITION));
                //set money
                String money=cursor.getString(cursor.getColumnIndex(Constants.BILL_TABLE_FIELD_MONEY));
                //set date
                String date=cursor.getString(cursor.getColumnIndex(Constants.BILL_TABLE_FIELD_DATE));
                //set remark
                String remark=cursor.getString(cursor.getColumnIndex(Constants.BILL_TABLE_FIELD_REMARK));

                /**
                 * 将获取的数据封装到bill中
                 */
                bill=new Bill(billID,username,type,type_position,money,date,remark);
                /**
                 * 将封装好的数据bill封装到bills中
                 */
                bills.add(bill);
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            db.close();

        }
        return bills;
    }

    @Override
    public Bill QueryBill(int id) {
        Bill bill=null;

        SQLiteDatabase db = mBillDatabaseHelper.getWritableDatabase();

        try {

            String sql ="select * from "+Constants.BILL_TABLE_NAME+" where "+Constants.BILL_TABLE_FIELD_ID+"=? ";
            String[] str  =new  String[]{String.valueOf(id)};
            Cursor cursor=db.rawQuery(sql,str);
            /**
             * 下面在库中进行具体查询,并将
             */
            if(cursor.moveToNext()){
                /**
                 * 将查到的数据逐一获取
                 */

                //set username
                String username=cursor.getString(cursor.getColumnIndex(Constants.BILL_TABLE_FIELD_UNAME));
                //set type
                String type=cursor.getString(cursor.getColumnIndex(Constants.BILL_TABLE_FIELD_TYPE));
                //set type_position
                int type_position=cursor.getInt(cursor.getColumnIndex(Constants.BILL_TABLE_FIELD_TYPEP_OSITION));
                //set money
                String money=cursor.getString(cursor.getColumnIndex(Constants.BILL_TABLE_FIELD_MONEY));
                //set date
                String date=cursor.getString(cursor.getColumnIndex(Constants.BILL_TABLE_FIELD_DATE));
                //set remark
                String remark=cursor.getString(cursor.getColumnIndex(Constants.BILL_TABLE_FIELD_REMARK));

                /**
                 * 将获取的数据封装到bill中
                 */
                bill=new Bill(id,username,type,type_position,money,date,remark);

            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            db.close();

        }
        return bill;
    }

    /**
     * 对Bill表单进行删除
     * @param id
     * @return
     */
    @Override
    public boolean DeleteBill(int id) {
        boolean flag=false;

        SQLiteDatabase db = mBillDatabaseHelper.getWritableDatabase();

            String sql ="delete  from "+Constants.BILL_TABLE_NAME+" where "+Constants.BILL_TABLE_FIELD_ID+"=? ";
            Object[] str  =new  Object[]{id};
            db.execSQL(sql,str);
            db.close();
        /**
         * 在删除结束后,查找该id对应的Bill是否存在,来判断删除是否成功
         */
        flag=true;

        return flag;
    }

    /**
     * 对Bill表单进行修改
     * @param id
     * @param bill
     * @return
     */
    @Override
    public boolean Update(int id,Bill bill) {
        boolean flag=false;

        SQLiteDatabase db = mBillDatabaseHelper.getWritableDatabase();

        String sql ="update "+Constants.BILL_TABLE_NAME
                +" set "+Constants.BILL_TABLE_FIELD_UNAME+"=? ,"
                +Constants.BILL_TABLE_FIELD_TYPE+"= ?,"
                +Constants.BILL_TABLE_FIELD_TYPEP_OSITION+"=?,"
                +Constants.BILL_TABLE_FIELD_MONEY+"=?,"
                +Constants.BILL_TABLE_FIELD_DATE+"=?,"
                +Constants.BILL_TABLE_FIELD_REMARK+"=?"
                +" where "+Constants.BILL_TABLE_FIELD_ID+"=? ";
        Object[] obj  =new  Object[]{bill.getUsername(),bill.getType(),bill.getTypeposition(),bill.getMoney(),bill.getDate(),bill.getRemark(),id};
        db.execSQL(sql,obj);
        db.close();
        /**
         * 在修改结束后,查找该id对应的Bill是否相同,来判断修改是否成功
         */
            flag=true;

        return flag;
    }
}

原文地址:https://www.cnblogs.com/yeyueweiliang/p/12308355.html

时间: 02-14

家庭记账本安卓版开发:第六天的相关文章

屌丝也能开发安卓版2048(App Inventor)

想编写安卓游戏,java太难,来试试App Inventor,虽然有人认为他是中学生的玩具,但是也能编写2048这样的火爆游戏,不需要太复杂的算法. 整个游戏有几个模块: 一.游戏初始化 数列转化为图形,使用了canvas和精灵,相对应list,这里注意精灵位置是固定的,只是更改图片,多少分,就对于n.jpg,0分是底色图片.左右移动,使用了flung判断,绝对值判断,水平速度和垂直速度哪个大,用来判断是左右移动还是上下移动. 二.计分模块 一般计分在合并处增加,最高分用了tiny db,游戏结

钢铁少女 无限钻石安卓版下载 和 源代码部署成功

本文中所有资料.资源文件仅供技术学习.研究之用,请必须在24小时内删除所下载文件,切勿用于商业用途,否则由此引发的法律纠纷及连带责任本站和发布者概不承担.本文中的网游信息.网游源代码资源均来自互联网,非本站开发.如有侵犯您的合法权益请来信告之,我们会在三个工作日内予以清除.<钢铁少女>(战舰少女2.0)的源代码部署成功,欢迎试玩. 无限钻石安卓版下载 http://pan.baidu.com/s/1i4hfG9J客户端源代码 http://pan.baidu.com/s/1o74CgjS服务器

【热门APP用户体验分析】购物类APP之王——淘宝安卓版(二)

在上一篇的文章中,简单的介绍了一下淘宝客户端的首页的导航栏,还有一些小的细节问题,这一篇,我们还是继续剖析淘宝客户端安卓版. 我们首先还是先放出淘宝的主界面 在这个界面中,最上方是一个广告栏,可以点击进入对应的活动界面.广告栏可以手动的滑动,而且滑动体验非常好,在使用其他软件的时候,会发生左右广告栏的滑动和上下的刷新滑动出现冲突的情况,表现出来就是界面一直在颤动,但是淘宝的广告栏做的非常好,只要在广告栏的区域滑动,触摸焦点就会被锁定,不会发生手势冲突的情况,淘宝的开发者应该是重写了控件的触摸事件

实操UNITY3D接入91SDK安卓版

原地址:http://bbs.18183.com/thread-149758-1-1.html 本文内容为创建UNITY3D接入91SDK的DEMO的具体操作过程.本人水平有限,UNITY3D与Android如何交互的技术请大家参看雨松的博客.我的开发环境: MAC系统, ECLIPSE, UNITY4.0开发过程:1.准备要UNITY为交互Android自备的CLASS.JAR文件.   我的操作过程是:应用程序->UNTITY文件夹->UNITY->右键:显示包内容->CONT

安卓版谍报馆客户端应用源码

这款是我最新开发的一个作品,目前已经上传到源码天堂那里了,或者先可以到安卓教程网(android.662p.com)看看详细说明先,大家可以去了解一下吧.应用介绍谍报馆是手机中国推出的手机资讯客户端,为用户提供最快速.全面的手机新品谍报,新机评测.应用体验.价格促销等精彩内容.手机中国成立于2007年9月,是一家资讯覆盖全国并定位于专业与品味并重的新兴垂直手机网站,被认为是中国第一专业手机门户.手机中国立足手机高端专业内容的建设,拥有20多个专业频道,100余个子频道,每天提供上百篇最新最快的手

腾讯通RTX 手机安卓版试用

提到腾讯通RTX,很多朋友都耳熟能详,因为这是每天工作联络的必须品,同事间交流及传送文件都需要用到的工具.但提到RTX腾讯通手机版,不免会产生很多疑问.RTX还有手机版?带着这样的疑问,接下来就由昆明国防路百信手机大全为大家分享. 首先安装到手机.RTX手机版也延续了腾讯众多手机产品的特点,体积小权限多.安装完毕之后首次打开会看到"企业通讯录"的大Logo. 进行登录了,由于是需要"总机号",而非PC端的服务器地址,不清楚总机号的同学请询问本公司网管.登录后会看到底

百度地图 JavaScript API极速版 开发体会

前段时间百度地图API推出了 JavaScript API 极速版 1.0 简单看了一下,从产品定位来说真是挺好. 把开发者细分成普通web开发者和移动web开发者.正好用到了手机地图这块决定尝试一下.先看一下百度地图官方对它的定义.     本套百度地图API是专为手机浏览器提供的API,您可使用该套API,在手机页面中展示地图.标注位置.检索poi.查询线路等. 特点: 较同时兼容PC和手机浏览器的JavaScript API大众版而言,该版更适配移动设备,体积更小,加载地图速度更快,更省流

Win7下搭建安卓android开发环境

本文出自 "孤狼" 博客,请务必保留此出处http://332374363.blog.51cto.com/5262696/1310882 另外,在搭建android开发环境时,还参考了http://www.apkbus.com/android-641-1-1.html 参考了:http://wenku.baidu.com/view/6108ac19b7360b4c2f3f6406.html 一.假设你现在什么都没有,那么你需要下载以下的东西: 1.JDK(JavaDevelopment

程序设计C语言二级考试教程 Java基础视频教程 安卓软件开发教程 Unity3D游戏制作入门教程

热门推荐电脑办公计算机基础知识教程 Excel2010基础教程 Word2010基础教程 PPT2010基础教程 五笔打字视频教程 Excel函数应用教程 Excel VBA基础教程 WPS2013表格教程 更多>平面设计PhotoshopCS5教程 CorelDRAW X5视频教程 Photoshop商业修图教程 Illustrator CS6视频教程 更多>室内设计3Dsmax2012教程 效果图实例提高教程 室内设计实战教程 欧式效果图制作实例教程 AutoCAD2014室内设计 Aut

安卓版php服务器的mysql数据库增删改查简单案例

index.php文件: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html