2017年3月26日 星期日

Android在Thread中改變外部類別的View元件


  • 準備一個handler來接收呼叫,然後在handler中改變View元件:
Handler mHandler = new Handler() {
    @Override    public void handleMessage(Message msg) {
        if(msg.what == 1)
        {
            status.setText(response);
        }
        super.handleMessage(msg);
    }
};

  • Thread中要改變View元件處改為呼叫handler:

Message msg = mHandler.obtainMessage();
msg.what = 1;
msg.sendToTarget();

Android對URL的Get與Post


  • 首先,我們要注意的是:Android使用網路資源必須使用Thread!
     示範的Thread的寫法,是使用匿名內部類別+匿名物件的方式:

    (new Thread(){
        public void run() {
            //使用網路資源的程式寫在這裡!
        }
    }).start();
    
   因為使用了匿名類別,所以如果有建立變數,他的生存空間只在run裡面哦,但是run裡面可以存取外部類別的屬性!
  • POST的寫法:
        
         try {
            // Create a URL for the desired page        
            String response = "";
            URL url = new URL([要POST的網址]);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setReadTimeout(3000);
            conn.setConnectTimeout(5000);
            conn.setRequestMethod("POST");
            conn.setDoInput(true);
            conn.setDoOutput(true);
            HashMap postDataParams = new HashMap();
            postDataParams.put("[參數名稱一]",[參數字串一]);
            postDataParams.put("[參數名稱二]",[]);
            OutputStream os = conn.getOutputStream();
            BufferedWriter writer = new BufferedWriter(
            new OutputStreamWriter(os, "UTF-8"));
            writer.write(getPostDataString(postDataParams));
            writer.flush();
            writer.close();
            os.close();
            int responseCode=conn.getResponseCode();
            if (responseCode == HttpsURLConnection.HTTP_OK) {
                 String line;
                 BufferedReader br=new BufferedReader(new InputStreamReader(conn.getInputStream()));
                 while ((line=br.readLine()) != null) {
                        response+=line;
                 }
             }
             else {
                 response="";
    
             }
         }
         catch (Exception e) {
                Log.d("Debug", e.toString());
         }
  • GET的寫法:

  • 跟POST一樣,只差在: 1.網址可以直接帶GET字串(?[參數名稱一]=[參數字串一]&[參數名稱二]=[參數字串二]) 2.conn.setRequestMethod("POST");改成conn.setRequestMethod("GET");

2016年5月14日 星期六

Android自訂返回鍵並且實作連續按兩下返回鍵退出程式

在MainActivity中增加以下程式:

 private static Boolean isExit = false;
private static Boolean hasTask = false;
Timer tExit;
TimerTask task;

@Overridepublic boolean onKeyDown(int keyCode, KeyEvent event)
{
    if (keyCode == KeyEvent.KEYCODE_BACK)
    {
        mAppWebView.loadUrl(mMenuURL); //自訂返回鍵按下後做的事情
        if(isExit==false)
        {
            isExit=true;
            Toast.makeText(this, "再按一次後退鍵退出應用程式",Toast.LENGTH_SHORT).show();
            if(!hasTask)
            {
                hasTask = true;
                tExit = new Timer();
                task = new TimerTask()
                {
                    @Override                    
                    public void run()
                    {
                        isExit = false;
                        hasTask = false;
                    }
                };
                tExit.schedule(task, 1000);
            }
        }
        else       
        {
            finish();
            System.exit(0);
        }
        return false;
    }
    return super.onKeyDown(keyCode, event);
}

Android webView 中的網址連結轉處理方式(呼叫開啟Assets中的檔案,開啟外部網址)

建立一個MyWebViewClient的Class file
在裡面的shouldOverrideUrlLoading方法中可以攔截到<a href="XXXXXX">中href指向的位址=>放在url!
檔案內容如下:

import android.content.Context;
import android.content.Intent;
import android.content.res.AssetManager;
import android.net.Uri;
import android.util.Log;
import android.webkit.WebView;
import android.webkit.WebViewClient;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;


/** * Created by ray on 2016/5/14. */
public class MyWebViewClient extends WebViewClient {

    private Context context;

    public MyWebViewClient(Context context) {
        this.context = context;
    }

    @Override    public boolean shouldOverrideUrlLoading(WebView view, String url)
    {
        if(url.contains(".pdf") || url.contains(".doc"))
        {
            //處理取得純檔名(過濾掉路徑)            
            String[] fa = url.split("/");
            String filename = fa[fa.length-1];
            
            //將檔案從assets複製到SD card或手機內部儲存空間
            InputStream in = null;
            OutputStream out = null;
            AssetManager assetManager = this.context.getAssets();

            try {
                in = assetManager.open("app-land/file/"+filename);
                //注意路徑的前面不要有/
                File outFile = new File(this.context.getExternalFilesDir(null), filename);
                out = new FileOutputStream(outFile);
                copyFile(in, out);
            } catch(IOException e) {
                Log.e("tag", "Failed to copy asset file: " + filename, e);
            }
            finally {
                if (in != null) {
                    try {
                        in.close();
                    } catch (IOException e) {
                        // NOOP                    }
                }
                if (out != null) {
                    try {
                        out.close();
                    } catch (IOException e) {
                        // NOOP                    }
                }
            }
            //呼叫開啟詢問怎麼打開這個文件
            Intent intent = new Intent( Intent.ACTION_VIEW );

            File ff = new File(this.context.getExternalFilesDir(null)+"/"+filename);
            intent.setDataAndType(Uri.fromFile(ff), "application/*" );
            this.context.startActivity(intent);

            return true;
        }
        else if(url.contains("http"))
        {
            //開啟外部網址的處理
            Uri uriUrl = Uri.parse(url);
            Intent launchBrowser = new Intent(Intent.ACTION_VIEW, uriUrl);
            this.context.startActivity(launchBrowser);

            return true;
        }
        return super.shouldOverrideUrlLoading(view, url);
    }

    private void copyFile(InputStream in, OutputStream out) throws IOException
    {
        byte[] buffer = new byte[1024];
        int read;
        while((read = in.read(buffer)) != -1)
        {
            out.write(buffer, 0, read);
        }
    }
}
----------------------------------------------------
在MainActivity.java中的WebView部分程式加入以下的設定:
mAppWebView = (WebView) findViewById(R.id.webView);
mAppWebView.getSettings().setJavaScriptEnabled(true);
mAppWebView.getSettings().setSaveFormData(true);
mAppWebView.getSettings().setDatabaseEnabled(true);
mAppWebView.getSettings().setDomStorageEnabled(true);
mAppWebView.getSettings().setSupportZoom(true);
mAppWebView.getSettings().setAllowFileAccess(true);
mAppWebView.getSettings().setAllowContentAccess(true);
mAppWebView.setWebViewClient(new MyWebViewClient(this));//這一行!
mAppWebView.loadUrl(mAppURL);


---------------------------------------------------


最後是要在AndroidManifest.xml增加permission:



</application> <---放在這一行的後面哦!
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

2016年4月8日 星期五

對mysql的欄位進行split的方法

先宣告原文出處:http://blog.fedecarg.com/2009/02/22/mysql-split-string-function/
我在網路上找到一篇,先建立一個function,然後就可以使用該function達到目的了!
再搭配CONVERT使用就可以把分離出來的字串轉成數字避免排序不如預期的情況了~
例如:CONVERT(SPLIT_STR(week,'-',1),UNSIGNED INTEGER)
以下是function的寫法以及用法
Function
CREATE FUNCTION SPLIT_STR(
  x VARCHAR(255),
  delim VARCHAR(12),
  pos INT
)
RETURNS VARCHAR(255)
RETURN REPLACE(SUBSTRING(SUBSTRING_INDEX(x, delim, pos),
       LENGTH(SUBSTRING_INDEX(x, delim, pos -1)) + 1),
       delim, '');
Usage
SELECT SPLIT_STR(string, delimiter, position)
Example
SELECT SPLIT_STR('a|bb|ccc|dd', '|', 3) as third;

+-------+
| third |
+-------+
| ccc   |
+-------+
最後順帶一提,在mysql中建立的function會跑到哪邊呢?
會在database: mysql     table: proc裡面!


2015年11月15日 星期日

使用jQuery支援所有瀏覽器播放音效

首先要準備音效檔,因為要支援幾乎所有的瀏覽器,所以我們要準備三種格式的音效檔:
music.ogg
music.mp3
music.wav

然後將支援三種音效格式的audio元件注入:
$(function()
{
    $('<audio id="myAudio"><source src="music.ogg" type="audio/ogg"><source src="music.mp3" type="audio/mpeg"><source src="music.wav" type="audio/wav"></audio>').appendTo('body');
});

在要播放的時候執行以下呼叫:
$('#myAudio')[0].play();  //myAudio為注入audio元件時設定的id

使用jQuery遍歷指定Class的DOM

如果我們有一堆表格的內容需要依照規則去處理,我們可以將這些<td>的class設為相同的,然後使用以下當方式遍歷所有的<td>,然後針對每個被讀到的<td>來進行處理,非常好用呢!

$('.classname').filter(
    function()
    {
 //使用 $(this) 可以存取到可以存取到當下讀到的jQuery DOM !
   });