项目实战,小结项目开发中的得与失,在项目中做了新建功能及相关页面,用到了以下几个知识点,在这里和大家分享一下:
进展-新建功能及相关页面:
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");
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 + "]");
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;
}
}