Blogcat

Blogcat

View the Project on GitHub hanaarena/blogcat

XB系列第二弹 - 航海记录 BlogCat

这是一份关于个人「项目」xbp2.apk开发过程的记录

综述

所以我选择了另一种方法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之类的监听接口.

Tab two

第二屏中通过点击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同理~)


下一步要先实现的是自定义`Toast`内容,即将`EditText`中的内容传输到`Toast`控件中,并用`SharedPreferenced`保存。

调用Noitification.Builder(More about Notification.Builder)

顶部显示notification,下拉查看自定义的提醒内容。这里使用JSPSession来代替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();
    }   

Tab three
    //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);
关于WebView中back button事件

否则···按返回键将直接跳出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);
}

END

基本的功能都实现得差不多,然后,xbp2先做到这里吧。

To be continued···

以上。

Oct.31 2013@lanz