Blogcat
这是一份关于个人「项目」xbp2.apk开发过程的记录
xbp2
= XB Project two(base Android)xbp2
的目标是做一个使用ViewPager
开发的多屏应用并集合多种功能xbp2
做的是手动(别手懒~),这东西没必要被人又挖了一次数据,try to offline:)WebView
包装√
ViewPager
文档的example推荐用 TabsAdapter
来做ViewPager
的容器,但是在用new TabsAdapter
的 .addTab()
方法时我不知道怎麽用TabListener
来监听滑到当前Tab的方法,只能做一些视图的查看。
protected void onCreate(Bundle savedInstanceState) { mViewPager = new ViewPager(this); .... setContentView(mViewPager); .... mTabsAdapter = new TabsAdapter(this, mViewPager); }>效果如图:
所以我选择了另一种方法List来做每一屏(Tab)的容器:
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_main); viewPager = (ViewPager) this.findViewById(R.id.viewpager); pagerTitleStrip = (PagerTitleStrip) this.findViewById(R.id.pagertitile); pagerTitleStrip.setTextColor(Color.WHITE); View view1 = LayoutInflater.from(MainActivity.this).inflate( R.layout.tab1, null); .... list = new ArrayList(); list.add(view1); ... }
效果如图:
在后者的方法能直接实现对每一屏(Tab)中各控件的事件监听,而无需去实现TabsListener
之类的监听接口.
第二屏中通过点击Button控件调用Time/DatePickerDialog
来进行时间/日期的选择。(More about Picker
)
Tab2.xml:
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
······
android:text="@string/btn_date"
android:onClick="showdateTime" />
在实现类文件中实现onClick
事件的方法(这里指showdateTime
):
public void showdateTime(View v)
{
// 创建一个TimePickerDialog实例,并把它显示出来。
new TimePickerDialog(MainActivity.this,
0, // 绑定监听器
new TimePickerDialog.OnTimeSetListener()
{
@Override
public void onTimeSet(TimePicker tp, int hourOfDay,
int minute)
{
myCalendar.setTimeInMillis(System.currentTimeMillis()); //设置Calendar对象
myCalendar.set(Calendar.HOUR_OF_DAY, hourOfDay); //设置闹钟小时数
myCalendar.set(Calendar.MINUTE, minute); //设置闹钟的分钟数
myCalendar.set(Calendar.SECOND, 0); //设置闹钟的秒数
myCalendar.set(Calendar.MILLISECOND, 0); //设置闹钟的毫秒数
Intent intent = new Intent(MainActivity.this, AlarmReceiver.class); //创建Intent对象
PendingIntent pi = PendingIntent.getBroadcast(MainActivity.this, 0, intent, 0); //创建PendingIntent
// 获取AlarmManager对象
aManager = (AlarmManager) getSystemService(ALARM_SERVICE);
aManager.set(AlarmManager.RTC_WAKEUP, myCalendar.getTimeInMillis(), pi); //设置闹钟
//aManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), pi); //设置当前时间闹钟
Toast.makeText(MainActivity.this, "闹钟设置成功", Toast.LENGTH_SHORT).show();//提示用户
}
}, myCalendar.get(Calendar.HOUR_OF_DAY)
, myCalendar.get(Calendar.MINUTE), true)
.show();
}
Waring:
myCalendar.set(Calendar.HOUR_OF_DAY, hourOfDay);
与
myCalendar.set(Calendar.HOUR, hourOfDay);
的区别,如果用HOUR的话只能识别12小时制(虽然能选择12点过后的钟点,但是并不能实现定时闹钟功能)。应使用HOUR_OF _DAY
(P.s. 调用日期Picker同理~)
调用Noitification.Builder
(More about Notification.Builder
)
顶部显示notification,下拉查看自定义的提醒内容。这里使用JSP
的Session
来代替Intent.putExtra()
. //改天用putExtra改写
Session.java:
public class Session { @SuppressWarnings("unchecked") private Map _objectContainer; private static Session session; // Attention here, DO NOT USE keyword 'new' to create this object. // Instead, use getSession method. @SuppressWarnings("unchecked") private Session() { _objectContainer = new HashMap(); } public static Session getSession() { if (session == null) { session = new Session(); return session; } else { return session; } } @SuppressWarnings("unchecked") public void put(Object key, Object value) { _objectContainer.put(key, value); } public Object get(Object key) { return _objectContainer.get(key); } public void cleanUpSession() { _objectContainer.clear(); } public void remove(Object key) { _objectContainer.remove(key); } }
使用Notification.Builder实现通知栏功能:
Intent notificationIntent = new Intent(context, SecondActivity.class);
PendingIntent contentIntent = PendingIntent.getActivity(context, 0, notificationIntent, 0);
NotificationManager nm = (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);
Notification.Builder builder = new Notification.Builder(context);
builder.setContentIntent(contentIntent)
.setSmallIcon(R.drawable.heart)
.setTicker("Helo Noti")
.setWhen(System.currentTimeMillis())
.setAutoCancel(true)
.setContentTitle("Helo Noti2")
.setContentText(notiText);
Notification n = builder.build();
nm.notify(1, n)
(以下包含在AlarmReceive.java中,AlarmReciver继承BroadcastReceiver
。在MainActivity.java中,设定闹钟到点时 PendingIntent pi = PendingIntent.getBroadcast(MainActivity.this, 0, intent, 0);)
,而不是使用.getActivity()
)
Tips:
①
存储数据:
text = (EditText)view2.findViewById(R.id.text); //注意:view2!
Session session = Session.getSession();
String str2 = text.getText().toString(); //获取EditText中输入的内容
session.put("str", str2);
读取数据:
Session session = Session.getSession();
session.get("str");
②
Eclipse报错 error opening trace file: No such file or directory (2),一般是AndroidManifest.xml中有出错.
使用Dialog重写显示时间、日期选择的方法:
即用DatePickerDialog
& TimePickerDialog
来显示日期/时间{弹出框}
//Date Picker
class showDatePicker implements OnClickListener {
@Override
public void onClick(View v) {
final Calendar c = Calendar.getInstance();
currentDate = Calendar.getInstance();
int mYear = c.get(Calendar.YEAR);
int mMonth = c.get(Calendar.MONTH);
int mDay = c.get(Calendar.DAY_OF_MONTH);
Dialog dialog = new DatePickerDialog(MainActivity.this,
new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear,
int dayOfMonth) {
String date = "";
date += year;
if(monthOfYear < 9) {
date += "-0" + (monthOfYear+1);
} else {
date += "-" + (monthOfYear+1);
}
if(dayOfMonth < 10) {
date += "-0" + dayOfMonth;
} else {
date += "-" + dayOfMonth;
}
dateView.setText(date);
c.getTimeInMillis();
c.set(Calendar.YEAR, year);
c.set(Calendar.MONTH, monthOfYear);
c.set(Calendar.DAY_OF_MONTH, dayOfMonth);
//Selected Date was less than system Date
if(currentDate.getTimeInMillis() > c.getTimeInMillis()) {
Toast.makeText(MainActivity.this, "不能小于当前日期!",Toast.LENGTH_SHORT).show();
final Calendar currentTime = Calendar.getInstance();
final int mYear2 = currentTime.get(Calendar.YEAR);
final int mMonth2 = currentTime.get(Calendar.MONTH);
final int mDay2 = currentTime.get(Calendar.DAY_OF_MONTH);
String tempDate2 = mYear2 + "-" + format(mMonth2+1) + "-" + format(mDay2);
dateView.setText(tempDate2);
}
myCalendar.set(Calendar.YEAR, year);
myCalendar.set(Calendar.MONTH, monthOfYear);
myCalendar.set(Calendar.DAY_OF_MONTH, dayOfMonth);
}
}, mYear, mMonth, mDay);
dialog.show();
}
}
//Time Picker
class showTimePicker implements OnClickListener {
@Override
public void onClick(View v) {
final Calendar c = Calendar.getInstance();
currentTime = Calendar.getInstance();
final int mHour = c.get(Calendar.HOUR_OF_DAY);
final int mMinute = c.get(Calendar.MINUTE);
Dialog dialog = new TimePickerDialog(MainActivity.this,
new TimePickerDialog.OnTimeSetListener() {
@Override
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
String time = "";
if(hourOfDay < 10) {
time = "0" + hourOfDay;
} else {
time = hourOfDay + "";
}
if(minute < 10) {
time += " : 0" + minute;
} else {
time += " : " + minute;
}
timeView.setText(time);
//Selected Time
myCalendar.set(Calendar.HOUR_OF_DAY, hourOfDay);
myCalendar.set(Calendar.MINUTE, minute);
myCalendar.set(Calendar.SECOND, 0);
myCalendar.set(Calendar.MILLISECOND, 0);
//IF Selected Time was less than the syetem Time
if(myCalendar.getTimeInMillis() < currentTime.getTimeInMillis()) {
myCalendar.set(Calendar.DAY_OF_YEAR, myCalendar.get(Calendar.DAY_OF_YEAR)+1);
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.DATE, 1);
int y = calendar.get(Calendar.YEAR);
int m = calendar.get(Calendar.MONTH);
int d = calendar.get(Calendar.DAY_OF_MONTH);
String date2 = "";
date2 += date2 +y;
if(m <9) {
date2 += "-0" + (m+1);
} else {
date2 += "-" +(m+1);
}
if(d < 10) {
date2 += "-0" + d;
} else {
date2 += "-" + d;
}
dateView.setText(date2);
}
}
}, mHour, mMinute, true);
dialog.show();
}
//WebView
myWebView = (WebView)view3.findViewById(R.id.webview);
myWebView.loadUrl("http://lanzc.com/wb"); //跳转到微博页面
myWebView.setWebViewClient(new WebViewClient()); //在WebView中点击链接不另外跳转,在WebView page中打开
WebSettings webSettings = myWebView.getSettings();
webSettings.setJavaScriptEnabled(true);
否则···按返回键将直接跳出Activity···
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// Check if the key event was the Back button and if there's history
if ((keyCode == KeyEvent.KEYCODE_BACK) && myWebView.canGoBack()) {
myWebView.goBack();
return true;
}
// If it wasn't the Back key or there's no web page history, bubble up to the default
// system behavior (probably exit the activity)
return super.onKeyDown(keyCode, event);
}
基本的功能都实现得差不多,然后,xbp2先做到这里吧。
To be continued···
以上。
Oct.31 2013@lanz