2013/01/05

Android - DatePicker:如何取得"日期"的資料


資料取得上,除一般透過輸入的資料外,也常會使用到時間的紀錄。
而時間的取得就可以透過 TimePicker 或 DatePicker 來即時取的當下的時間。
當然這時間可以再另做設定,只是透過這樣的方法,使用者在輸入資料的時候。
可以避免資料的輸入手誤或錯誤等等。

範例:
軟體一開啟時,使用 Calendar 取得當下的年月日,並顯示在textDate1。
之後更改 Datepicker 顯示的年月日,系統會觸發 OnDateChangedListener,
產生出年月日三個數值是,由於這數值屬性為 int,所以我們另用 DateFix 方法將時間更改為 String。
當然若數字小於 10 ,在數字前面我們就多加個 0。
將取得字串在設定到 TextView1。
另外,透過Button取得 DatePicker 送出來的資料,顯示在另一個 另一個 textDate2 上。


圖示:




main_layout.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/LinearLayout2"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".Date" >

    <DatePicker
        android:id="@+id/DatePicker"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <TextView
        android:id="@+id/textData1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Large Text" />

    <Button
        android:id="@+id/BtnGetDate"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="63dp"
        android:text="取得日期" />

    <TextView
        android:id="@+id/textData2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Large Text" />

</LinearLayout>

date.java
package com.data;

import java.util.Calendar;

import android.os.Bundle;
import android.app.Activity;
import android.view.View;
import android.widget.Button;
import android.widget.DatePicker;


import android.widget.TextView;

public class Date extends Activity {

    String Year,Mon,Day;
    private DatePicker DatePicker;
    private TextView textData1;
    private TextView textData2;
    private Button BtnGetDate;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_layout);
        
        Calendar TodayDate = Calendar.getInstance();    //透過Calendar取的資料
        int sYear = TodayDate.get(Calendar.YEAR);       //一開啟軟體即取得年的數值
        int sMon  = TodayDate.get(Calendar.MONTH) + 1;  //一開啟軟體即取得月的數值
                                                        //月的起始是0,所以+1.
        int sDay = TodayDate.get(Calendar.DAY_OF_MONTH);//一開啟軟體即取得日的數值
        //將取得的數字轉成String.
        Year = DateFix(sYear);    
        Mon  = DateFix(sMon);
        Day  = DateFix(sDay);
        
        textData1     = (TextView)findViewById(R.id.textData1);
        textData2    = (TextView)findViewById(R.id.textData2);
        BtnGetDate    = (Button)findViewById(R.id.BtnGetDate);
        //一開始就將年月日寫入 textDate1
        textData1.setText( Year + "/" + Mon + "/" + Day );
        
        BtnGetDate.setOnClickListener(GDListener);
        
        DatePicker     = (DatePicker)findViewById(R.id.DatePicker);        
        DatePicker.init(TodayDate.get(Calendar.YEAR),TodayDate.get(Calendar.MONTH),
                        TodayDate.get(Calendar.DAY_OF_MONTH),    
        //DatePicker年月日更改後,會觸發作以下的事情。
        new DatePicker.OnDateChangedListener() {
            @Override
            public void onDateChanged(DatePicker view, int year, int monthOfYear, 
                    int dayOfMonth) {
                Year = DateFix(year);
                Mon  = DateFix(monthOfYear + 1); //月的初始是0,所以先加 1。
                Day  = DateFix(dayOfMonth);
                textData1.setText( Year + "/"+Mon+"/"+Day);
            }
        });   
    }  
    
    //按下Button,將年月日的值,設定到 textData2
    private Button.OnClickListener GDListener = new Button.OnClickListener(){

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            textData2.setText(Year+"/"+Mon+"/"+Day);
        }
    };        
    //方法DateFix:將傳送進來的年月日轉成String,在判斷是否前面需要加0。
    private static String DateFix(int c){
        if (c >= 10)
            return String.valueOf(c);
        else
            return "0" + String.valueOf(c);
    }
}

2013/01/04

Blog 貼上程式碼:程式碼外圍加框框

http://cw1057.blogspot.tw/2012/07/blogger-format-sample-codes-in-blogs.html?spref=bl



直接在Blog貼上程式碼常有長短不一,格式跑掉的情況。
現在有幾個方法可以改善這樣的情況。

http://formatmysourcecode.blogspot.tw/
將程式加個框框。這樣程式碼就不會亂跑啦~

步驟:
在第一個框框內貼上程式碼,點選Format Text。
第二個框框就出現了套用好的html格式,直接將這格式複製到你自己的Blog上,並在 html 格式上面貼上你也顯示的位置。
第三個框框就是示意圖啦。

Android - TimePicker:如何取得時間的資料

資料取得上,除一般透過輸入的資料外,也常會使用到時間的紀錄。
而時間的取得就可以透過TimePicker來即時取的當下的時間。
當然這時間可以再另做設定,只是透過這樣的方法,使用者在輸入資料的時候。
可以避免資料的輸入手誤或錯誤等等。

範例:
使用 Timepicker 顯示的時間,當我們更改時間即會觸發 setOnTimeChangedListener。
產生出來的數值是 int,所以我們另用 TimeFix 將時間更改為 String。
當然若數字小於 10 ,在數字前面我們就多加個 0。
將取得字串在設定到 TextView1。
另外,透過Button取得 TimePicker 送出來的資料,顯示在另一個 TextView 上。

圖示:一個是在 Android 2.3的樣式,一個是 4.1 的樣式。

main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".Time" >

    <TimePicker
        android:id="@+id/timePicker"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true" />

    <Button
        android:id="@+id/BtnGetTime"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/textTime1"
        android:layout_marginTop="31dp"
        android:text="Button" />

    <TextView
        android:id="@+id/textTime1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/timePicker"
        android:text="Large Text"
        android:textAppearance="?android:attr/textAppearanceLarge" />

    <TextView
        android:id="@+id/textTime2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/BtnGetTime"
        android:layout_toRightOf="@+id/BtnGetTime"
        android:text="Large Text"
        android:textAppearance="?android:attr/textAppearanceLarge" />

</RelativeLayout>

time.java
package com.example.time;

import android.os.Bundle;
import android.app.Activity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.TimePicker;
import android.widget.TimePicker.OnTimeChangedListener;

public class Time extends Activity {
    private TimePicker timePicker;
    private TextView textTime1,textTime2;
    private Button     BtnGetTime;
    String H;
    String M;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_layout);
        
        textTime1    =    (TextView)findViewById(R.id.textTime1);        //自動取得時間
        textTime2    =    (TextView)findViewById(R.id.textTime2);        //透過按鈕取得時間
        BtnGetTime   =    (Button)findViewById(R.id.BtnGetTime);
        BtnGetTime.setOnClickListener(GTimeListener);
        
        timePicker    =    (TimePicker)findViewById(R.id.timePicker);
        //timepicker時間更改時,執行下面的動作。
        timePicker.setOnTimeChangedListener(new OnTimeChangedListener(){
            @Override
            public void onTimeChanged(TimePicker view, int hourOfDay, int minute) {
                // TODO Auto-generated method stub
                //取得 hour的值,透過TimeFix方法。轉換成String.並初始H。
                H = TimeFix(hourOfDay);
                //取得 minute的值,透過TimeFix方法。轉換成String.並初始M。
                M = TimeFix(minute);
                //將取得的資料設定到 textTime1
                textTime1.setText(H + ":" +M);
            }
        });
    }
    
    private Button.OnClickListener GTimeListener = 
            new Button.OnClickListener(){
        //按下按鈕後將先前Timepicker取得的值 H和M,
        //設定到 textTime2
        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            switch (v.getId())
            {
                case R.id.BtnGetTime:
                {
                    textTime2.setText(H + ":" +M);
                    break;
                }
            }
        }
    };
        
    //Timepicker取得的資料為int,但時間數字小於10,是不會有像06這樣的情況。
    //所以透過TimeFix這個方法將送過來的數字轉換成String,在判斷是否需要加0。
    private static String TimeFix(int c){
        if (c >= 10)
            return String.valueOf(c);
        else
            return "0" + String.valueOf(c);
    }    
}

Blog 圖片大小 寬600像素

Blog 圖片大小 寬600像素

2013/01/03

FileZilla Server 外部網路的設定方式。

由於FileZilla Server FTP 是使用Passive Mode,所以除了一般知道的 20,21 port之外。
也需要另外設定資料傳輸要走的 port。

FileZilla Server設定方式如下:
假設我設定了固定的port 範圍 8000 ~ 8100。
那在對外的Router或防火牆,也需要做這些設定。





不想花錢,家裡剛好用的是中華電信附的ZyXEL
那就照著做就對了。
在Port Forwarding上設定對外的 port 編號。如圖式~


如果你剛好用的是Windows 內建的防火牆,那務必記得設定FileServer的程式可以通過網路喔。
C:\Program Files\FileZilla Server\FileZilla server.exe


很簡單吧。

VoiceHero 九折優惠碼

  用我的優惠碼 v_t9msjy 購買 Hero 或 Vclass 課程,都能享有 9 折優惠 ! 馬上報名:https://bit.ly/34w3dif