2016年3月25日 星期五

[Android] Layout增加上下捲動的捲軸

在畫畫面時,我們通常會用Layout框住物件,並且依照需求使用LinearLayout或RelativeLayout。
但Layout並沒有捲軸功能,若要增加捲軸則可在Layout前增加ScrollView即可解決。

xml範例如下

原xml:
    <RelativeLayout android:id="@+id/contentLayout"
        android:layout_height="fill_parent"
        android:layout_width="fill_parent">

        ...

    </RelativeLayout>



新xml:
    <ScrollView android:id="@+id/contencrollView"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content">

        <RelativeLayout android:id="@+id/contentLayout"
            android:layout_height="fill_parent"
            android:layout_width="fill_parent">

            ...

        </RelativeLayout>
    </ScrollView>

2016年3月15日 星期二

[Android] Android Studio新增多語系

在開發App時,可能需要因應使用者設定多語系(或稱多語言別),下方示範新增語系的作法。

Step 1:在src > main > res 點選右鍵,選擇New>Android resource file。


Step 2:在File Name輸入strings、Resource type選擇Values,Available qualifiers選擇Locale或Language(左邊icon為地球圖示的選項)後點選">>"按鈕。


Step 3:依照自己所需要的語系選擇。在此以繁體中文為例,Language選擇"zh: Chinese",Specific Region Only選擇"TW: Taiwan"後點選"OK"。


Step 4:點選確認後,即可在res資料夾底下看到新增的語系,後續開發程式時請一併維護此語系的strings.xml即可。



常用語系列表:

LanguageSpecific Region Only
英文en: EnglishAny Region
日文ja: JapaneseAny Region
韓文ko: KoreanKR: South Korea
簡體中文zh: ChineseCN: China
香港zh: ChineseHK: Hong Kong SAR China


2015年12月28日 星期一

[Android] JSONObject 及 JSONArray 的區別

分法很簡單,就是依照括號區分
JSONObject = {}
JSONArray = []

{
    "id":"1",
    "title":"52週階梯式存錢法",
    "note":
    [
        "step 1:開啟附件檔案。",
        "step 2:設定起始金額為10元,輸入完後下方會自動產生每週儲蓄金額。",
        "step 3:將此表印出並貼在手帳、行事曆、桌曆上,當週儲蓄完就填上日期。",
        "step 4:若確實執行,年底就會有一筆獎勵金嘍!"
    ],
    "name":"test01"
}



使用方式如下:

{
    ...

    String str = "";  // 此範例預設str為上述JSON字串
    JSONObject jsonObject = new JSONObject(str);
    String strId = jsonObject.getString("id");        // 取得id的文字。
    String strTitle = jsonObject.getString("title");  // 取得title的文字。
    String strName = jsonObject.getString("name");    // 取得title的文字。
    JSONArray jsonArray = new JSONArray(jsonObject.getString("note"));  // 取得note的陣列。
    String[] strNote;
    for(int i = 0; i < jsonArray.length(); i++)
    {
        strNote[i] = jsonArray.getString(i);
    }

    ...

}

2015年9月17日 星期四

[Android] 遇到android.os.NetworkOnMainThreadException的解決方法

操作步驟:
1.掃描QR Code取得隱藏在QR Code內的token資料。
2.將token值透過HTTP Post傳至Server端,並取得Server回傳的資料。
3.取得回傳資料後做解析。

問題:
在要取得Server回傳資料時顯示錯誤訊息android.os.NetworkOnMainThreadException

解決方法:
自行新增一個Thread,本次使用的是AsyncTask。

原程式:
public class IndexGivePresentsQRCodeActivity extends Activity {

    ...

    // QR Code傳回結果  
    protected void onActivityResult(int requestCode, int resultCode, Intent intent)
    {
        // ...處理方法...
    
        sendPostDataToInternet();
    
        // ...處理方法...
    }

    private void sendPostDataToInternet()
    {
        // 建立HTTP Post連線
        HttpPost httppost = new HttpPost(getResources().getString(R.string.PhpData));
        // Post運作傳送變數 必需用NameValuePair陣列儲存
        List nameValuePairs = new ArrayList(1);
        // 新增變數(Key,value)
        nameValuePairs.add(new BasicNameValuePair("token", tokenStr));
        try
        {
            // 發送HTTP Request
            httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs,HTTP.UTF_8));  // 此行會出現錯誤
            // 取得HTTP Respense (Execute HTTP Post Request)
            HttpResponse response = new DefaultHttpClient().execute(httppost);
            // 取得回傳字串
            HttpEntity entity = response.getEntity();
            sendResult = EntityUtils.toString(entity);

            // ...資料處理...
        }
        catch(Exception e)
        {
            //  ...Error處理...
        }
    }

    ...

}

修改後程式:
public class IndexGivePresentsQRCodeActivity extends Activity {

    ...

    // QR Code傳回結果  
    protected void onActivityResult(int requestCode, int resultCode, Intent intent)
    {
        // ...處理方法...
    
        new Connection().execute();
    
        // ...處理方法...
    }

    private class Connection extends AsyncTask
    {
        @Override
        protected Object doInBackground(Object... params) {
            // TODO Auto-generated method stub
            sendPostDataToInternet();
            return null;
        }
    }

    private void sendPostDataToInternet()
    {
        // 建立HTTP Post連線
        HttpPost httppost = new HttpPost(getResources().getString(R.string.PhpData));
        // Post運作傳送變數 必需用NameValuePair陣列儲存
        List nameValuePairs = new ArrayList(1);
        // 新增變數(Key,value)
        nameValuePairs.add(new BasicNameValuePair("token", tokenStr));
        try
        {
            // 發送HTTP Request
            httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs,HTTP.UTF_8));  // 此行會出現錯誤
            // 取得HTTP Respense (Execute HTTP Post Request)
            HttpResponse response = new DefaultHttpClient().execute(httppost);
            // 取得回傳字串
            HttpEntity entity = response.getEntity();
            sendResult = EntityUtils.toString(entity);

            // ...資料處理...
        }
        catch(Exception e)
        {
            //  ...Error處理...
        }
    }

    ...

}

2015年9月11日 星期五

[Android] Eclipse無法產生R.java可能的原因及解決方法

在Eclipse執行Clear後無法產生R.java的原因可能有以下幾點:

1. xml中有誤:
有可能是設定值不對或是有其他錯誤,會在畫面下方提示錯誤訊息。

2. 程式中寫了不存在的物件:
例如在drawable中沒有abc.png,但在程式中宣告了R.drawable.abc,
此時就會無法重新產生R.java。

(目前只遇過這幾種狀況... 若有新的案例會再補上!

只要排除以上問題後重新Clear就能重新產生R.java了!



2015年9月9日 星期三

[Android] 設定TextView的Scrolbars

若TextView需要顯示多行資料,就有可能會用到卷軸!
而TextView有內建的Scrollbars,透過以下幾個步驟就能叫出來嘍!

[xml]
在TextView中增加下方屬性
android:scrollbars="vertical" <!-- 卷軸設定為縱向 -->
android:singleLine="false"    <!-- 資料為多行 -->

[java]
程式中也需要呼叫捲軸的方法
TextView text = (TextView) findViewById(R.id.textview1);
text.setMovementMethod(ScrollingMovementMethod.getInstance());