项目实战:UI美化和动画、数据传递、时间控件、字符串处理、数据库操作、和AS配置

项目实战,小结项目开发中的得与失,在项目中做了新建功能及相关页面,用到了以下几个知识点,在这里和大家分享一下:

进展-新建功能及相关页面:
1.UI美化,小图标的使用;

有句成语叫画龙点睛,小图标就是,不经意间的一点点缀,看图:



相比生硬的一段文字,有了小图标,用户界面更友好,表达更清晰,平淡中也增添了几分小乐趣。



只要在布局文件中添加这一行简单的代码就ok啦:

android:drawableLeft="@drawable/icon_username"



动画,让APP更灵动:

简单的修改下布局文件,让APP中的ListView活起来。

在res目录下新建anim文件夹,添加anim_item.xml和anim_layout.xml,源代码如下:

anim_item.xml:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/accelerate_interpolator"
    android:shareInterpolator="true">
    <translate
        android:duration="600"
        android:fromXDelta="100%"
        android:toXDelta="0%" />
    <alpha
        android:duration="600"
        android:fromAlpha="0.1"
        android:toAlpha="1.0" />
</set>

anim_layout.xml:

<?xml version="1.0" encoding="utf-8"?>
<layoutAnimation xmlns:android="http://schemas.android.com/apk/res/android"
    android:animation="@anim/anim_item"
    android:animationOrder="normal"
    android:delay="1"
    android:interpolator="@android:anim/accelerate_interpolator">
</layoutAnimation>

<!--
android:animation表示为子元素指定具体的入场动画,这里是我们定义的anim_item.xml
android:animationOrder表示子元素动画的顺序,有三个值noraml(正序)reverse(逆序)random(随机)
android:delay表示子元素动画的 时间延迟,这里0.5是子View每个动画延迟150s,每个动画的周期300s(上面定义的)乘以0.5
-->

然后在ListView的布局文件中添加如下属性,搞定,赶紧run一下看看效果吧。

        android:layoutAnimation="@anim/anim_layout"



2.巩固Intent数据传递,TimePicker控件的使用,字符串处理,TextUtils工具,SQL插入。

 这次主要是巩固之前项目中用到的知识点。


Intent在Activity之间进行数据传递,采用键值对的形式,主要使用putExtra、getStringExtra方法:

                    Intent intent = new Intent();
                    intent.setClass(NewRoomActivity.this, RoomListActivity.class);
                    intent.putExtra("roomName",roomName);
                    intent.putExtra("roomLocal",roomLocal);
                    startActivity(intent);

        Intent i = getIntent();
        roomName = i.getStringExtra("roomName");
        roomLocal = i.getStringExtra("roomLocal");



TimePicker控件的相关操作,setIs24HourView设置24小时显示形式,设置监听事件监听操作setOnTimeChangedListener:

        startTime_tp_new = (TimePicker) findViewById(R.id.startTime_tp_new);
        startTime_tp_new.setIs24HourView(true);
        startTime_tp_new.setOnTimeChangedListener(new TimePicker.OnTimeChangedListener() {
            @Override
            public void onTimeChanged(TimePicker view, int hour, int minute) {
                mStartHour = hour;
                mStartMinute = minute;
            }
        });


字符串处理,StringBuffer类高效处理字符串、append添加数据:

                time = new StringBuffer().append("").append(FormatTime(mStartHour))
                        .append(":").append(FormatTime(mStartMinute))
                        .append("-").append(FormatTime(mEndHour))
                        .append(":").append(FormatTime(mEndMinute)).toString();

在这里补充一下:String,StringBuffer,StringBuilder:

三者在执行速度方面的比较:StringBuilder >  StringBuffer  >  String。

String是“字符字符串常量”,也就是不可改变的对象。而另两者是字符串变量,可改变的对象。

StringBuilder与 StringBuffer

    StringBuilder:线程非安全的

    StringBuffer:线程安全的

    当我们在字符串缓冲去被多个线程使用是,JVM不能保证StringBuilder的操作是安全的,虽然他的速度最快,但是可以保证StringBuffer是可以正确操作的。当然大多数情况下就是我们是在单线程下进行的操作,所以大多数情况下是建议用StringBuilder而不用StringBuffer的,就是速度的原因。

           对于三者使用的总结: 1.如果要操作少量的数据用 = String

                        2.单线程操作字符串缓冲区 下操作大量数据 = StringBuilder

                        3.多线程操作字符串缓冲区 下操作大量数据 = StringBuffer


上次用到的FormatTime函数处理时间单位的显示状况:

    private String FormatTime(int time){
        String s = Integer.toString(time);
        if(s.length() == 1){
            s = "0" + s;
        }
        return s;
    }

TextUtils类isEmpty方法进行非空判断:

                if(TextUtils.isEmpty(time)){
                    Toast.makeText(NewRoomActivity.this, "时间不能为空!", Toast.LENGTH_SHORT).show();
                }


数据库插入操作,这次写的是原生SQL语句:

                    db.execSQL("insert into Room (name, owner, time, content, local) values(?, ?, ?, ?, ?)",
                            new String[] { roomName, owner, time, content, roomLocal });




文末小彩蛋-AS配置:

打造称手的兵器(AS):

1.日志调试,Log打印:

logt

    private static final String TAG = "SuggestActivity";
logd

        Log.d(TAG, "onCreate: ");
logm

        Log.d(TAG, "onCreate() called with: " + "savedInstanceState = [" + savedInstanceState + "]");


2.AS同Eclipse快捷键,Eclipse重度使用者的福音:


3.代码提示:

ctrl+Alt+space(空格)


4.移动快捷键:
因为之前换成了Eclipse快捷键模式,因此移动快捷键变成了alt+上或下箭头,移动代码到指定的位置。

ctrl+alt+向下箭头,复制当前代码到下一行。

5.其他:

ctrl+o,列出当前类中的所有方法及属性,点击enter就能够直接跳转至你想去的位置。

ctrl+e,在最近浏览的文件中转换。alt+shift+r将鼠标移动至属性名或方法名上,按下alt+shift+r,输入新名称并点击回车。

Eclipse中编译好的apk文件时在bin文件里面的,但是在Android Studio有一个比较大的改动了,编译好的apk在android studio里面是直接看不到了,而且apk文件所在目录也变了,那apk文件放在哪呢,你要在硬盘中找到对应的工程目录:

项目目录\app\build\outputs\apk

其中app是你的module,记得一定要在对应的module下找对应的编译好的apk文件。



小结:

进展-新建功能及相关页面:
1.UI美化,小图标的使用,动画,让APP更灵动;

2.巩固Intent数据传递,TimePicker控件的使用,字符串处理,TextUtils工具,SQL插入操作:
Intent在Activity之间进行数据传递,采用键值对的形式,主要使用putExtra、getStringExtra方法。

TimePicker控件的相关操作,setIs24HourView设置24小时显示形式,设置监听事件监听操作setOnTimeChangedListener。

字符串处理,StringBuffer类高效处理字符串、append添加数据。

FormatTime函数处理时间单位的显示状况。

TextUtils类isEmpty方法进行非空判断。

数据库插入操作,原生SQL语句。

3. AS配置:

日志调试,Log打印;Eclipse快捷键;代码提示;移动快捷键;其他。


最后附上今天开发的核心源代码:

import android.app.Activity;
import android.content.Intent;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.TimePicker;
import android.widget.Toast;

import dbutils.MyDatabaseHelper;

/**
 * Created by 权兴权意 on 2016/8/23.
 */
public class NewRoomActivity extends Activity{

    private TimePicker startTime_tp_new;
    private TimePicker endTime_tp_new;
    private TextView time_tv_new;
    private Button yesTime_btn_new;
    private EditText content_et_new;
    private EditText owner_et_new;
    private Button new_btn_new;

    private int mStartHour;
    private int mStartMinute;
    private int mEndHour;
    private int mEndMinute;
    private String time;
    private MyDatabaseHelper dbHelper;

    private String roomName;
    private String roomLocal;
    private String content;
    private String owner;


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

        dbHelper = new MyDatabaseHelper(this, "Meeting.db", null, MyDatabaseHelper.DB_VERSION);

        Intent i = getIntent();
        roomName = i.getStringExtra("roomName");
        roomLocal = i.getStringExtra("roomLocal");

        time_tv_new = (TextView) findViewById(R.id.time_tv_new);
        startTime_tp_new = (TimePicker) findViewById(R.id.startTime_tp_new);
        startTime_tp_new.setIs24HourView(true);
        startTime_tp_new.setOnTimeChangedListener(new TimePicker.OnTimeChangedListener() {
            @Override
            public void onTimeChanged(TimePicker view, int hour, int minute) {
                mStartHour = hour;
                mStartMinute = minute;
            }
        });
        endTime_tp_new = (TimePicker) findViewById(R.id.endTime_tp_new);
        endTime_tp_new.setIs24HourView(true);
        endTime_tp_new.setOnTimeChangedListener(new TimePicker.OnTimeChangedListener() {
            @Override
            public void onTimeChanged(TimePicker view, int hour, int minute) {
                mEndHour = hour;
                mEndMinute = minute;
            }
        });
        yesTime_btn_new = (Button) findViewById(R.id.yesTime_btn_new);
        yesTime_btn_new.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                time = new StringBuffer().append("").append(FormatTime(mStartHour))
                        .append(":").append(FormatTime(mStartMinute))
                        .append("-").append(FormatTime(mEndHour))
                        .append(":").append(FormatTime(mEndMinute)).toString();
                time_tv_new.setText(time);
            }
        });

        content_et_new = (EditText) findViewById(R.id.content_et_new);
        owner_et_new = (EditText) findViewById(R.id.owner_et_new);

        new_btn_new = (Button) findViewById(R.id.new_btn_new);
        new_btn_new.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                content = content_et_new.getText().toString();
                owner = owner_et_new.getText().toString();

                if(TextUtils.isEmpty(time)){
                    Toast.makeText(NewRoomActivity.this, "时间不能为空!", Toast.LENGTH_SHORT).show();
                }
                if(TextUtils.isEmpty(content)){
                    Toast.makeText(NewRoomActivity.this, "主题不能为空!", Toast.LENGTH_SHORT).show();
                }
                if(TextUtils.isEmpty(owner)){
                    Toast.makeText(NewRoomActivity.this, "发起人不能为空!", Toast.LENGTH_SHORT).show();
                }

//                Toast.makeText(NewRoomActivity.this, "NewRoomActivity:" + "roomName-" + roomName
//                        +"owner-" + owner + "time-" + time
//                        +"content-" + content + "roomLocal-" + roomLocal,
//                        Toast.LENGTH_SHORT).show();

                if(!TextUtils.isEmpty(time)&&!TextUtils.isEmpty(content)&&!TextUtils.isEmpty(owner)){
                    SQLiteDatabase db = dbHelper.getWritableDatabase();
                    db.execSQL("insert into Room (name, owner, time, content, local) values(?, ?, ?, ?, ?)",
                            new String[] { roomName, owner, time, content, roomLocal });
//                ContentValues values = new ContentValues();
//                values.put("name", roomName);
//                values.put("owner", owner);
//                values.put("time", time);
//                values.put("content", content);
//                values.put("roomLocal", roomLocal);
//                db.insert("Room", null, values);
                    Log.d("权兴权意:","db.insert succeed.");
                    Toast.makeText(NewRoomActivity.this, "NewRoomActivity-db.insert succeed.",
                            Toast.LENGTH_SHORT).show();
//                values.clear();
                    db.close();

                    Intent intent = new Intent();
                    intent.setClass(NewRoomActivity.this, RoomListActivity.class);
                    intent.putExtra("roomName",roomName);
                    intent.putExtra("roomLocal",roomLocal);
                    startActivity(intent);
                }

            }
        });
//        Toast.makeText(SuggestActivity.this, "SuggestActivity--" + mHour + ":" + mMinute,
//                Toast.LENGTH_SHORT).show();
    }

    private String FormatTime(int time){
        String s = Integer.toString(time);
        if(s.length() == 1){
            s = "0" + s;
        }
        return s;
    }
}











  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值