2013年7月14日 星期日

android - layout (暫時存放)

[Android]Android Layout元件

[Android] layout_weight的妙用-讓View的大小以百分比率顯示(proportionate size)

mssql - 刪除或編輯現有資料時出現 "沒有刪除任何資料列。 嘗試刪除資料列3時發生問題....."


參考:資料重複無法修改或刪除
今天使用ms-sql時遇到個問題,刪除某些現有的資料列與編輯,都會出現下列錯誤:

沒有刪除任何資料列。
嘗試刪除資料列3時發生問題。
錯誤來源:Microsoft VisualStudio.DataTools。
錯誤訊息:已更新或刪除的資料列值不會使資料列成為唯一,而是會修改多個資料列(2個資料列)。

解答是:應該要設定PK,這樣在編輯/刪除全部相同的資料列時,資料庫才不會因為無法識別修改而產生錯誤

2013年7月13日 星期六

android - 如何在目標頁面有redirect的情形下判斷頁面是否確實loading finished?

參考:How can I know that my WebView is loaded 100%?

遇到一個需求:需要在頁面讀取完成後通知使用者(使用Alert或是Toast)

一開始只是很簡單的implement WebViewClinet中的:
@Override
public void onPageFinished(WebView view, String url)

onPageFinished()可以在Page 讀取完畢後獲得通知,但發現一個問題,若這個頁面進行多次(1次以上)的redirect,那麼,每redirect一次,就會notify一次onPageFinished(),這似乎無法達成我想要的動作。

假設我的頁面的流程如下:
  1. 開啟 http://DNS/app/test.jsp
  2. redirect to http://DNS/app/afterTest.jsp       
直接以Logcat Log進行流程如下:
  1. onPageStarted() http://DNS/app/test.jsp
  2. shouldOverrideUrlLoading()  http://DNS/app/afterTest.jsp 
  3. onPageFinished() http://DNS/app/afterTest.jsp
  4. onPageStarted()  http://DNS/app/afterTest.jsp
  5. onPageFinished() http://DNS/app/afterTest.jsp
因此原先只有直接implement  onPageFinished()的作法會導致還沒進行到最後的afterTest.jsp就直接通知使用者;網路上找到建議作法如下,我自己也順利成功:

 
boolean loadingFinished = true;
boolean redirect = false;

mWebView.setWebViewClient(new WebViewClient() {

   @Override
   public boolean shouldOverrideUrlLoading(WebView view, String urlNewString) {
       if (!loadingFinished) {
          redirect = true;
       }

   loadingFinished = false;
   webView.loadUrl(urlNewString);
   return true;
   }

   @Override
   public void onPageStarted(WebView view, String url) {
        loadingFinished = false;
        //SHOW LOADING IF IT ISNT ALREADY VISIBLE  
    }

   @Override
   public void onPageFinished(WebView view, String url) {
       if(!redirect){
          loadingFinished = true;
       }

       if(loadingFinished && !redirect){
         //HIDE LOADING IT HAS FINISHED
       } else{
          redirect = false; 
       }

    }
});



利用redirect前會先notify shouldOverrideUrlLoading()來判定是否為redirect,若是,則在onPageFinished()時就不代表結束;而在每一次onPageFinished()時reset redirect flag;因此,上述範例的流程的flag變化如下:

loadingFinished=true, redirect=false
  1. onPageStarted() http://DNS/app/test.jsp 
    loadingFinished=false  , redirect=false
  2. shouldOverrideUrlLoading()  http://DNS/app/afterTest.jsp
    loadingFinished=false  , redirect=true
  3. onPageFinished() http://DNS/app/afterTest.jsp
    loadingFinished=false  , redirect=false
  4. onPageStarted()  http://DNS/app/afterTest.jsp
    loadingFinished=false  , redirect=false
  5. onPageFinished() http://DNS/app/afterTest.jsp
    loadingFinished=true  , redirect=false
解決^^

android - 使用WebViewClient時一直 onReceivedError() :-1,發生網路錯誤


檢查希望執行的url並沒有任何問題,後來發現是AndroidManifest.xml中忘記開啟permission:

<uses-permission android:name="android.permission.INTERNET" />

加上後OK順利運作

android - R.java沒有自動產生

就算使用project->clean依然無自動產生,
這時需要檢查res下的.xml或是AndroidManifest.xml的配置是否有錯誤,例如<activity>下的android:name的package是否有錯誤

AndroidManifest.xml的錯誤會顯示於Console中

2013年7月12日 星期五

android - eclipse debug時出現 INSTALL_PARSE_FAILED_NO_CERTIFICATES

[2013-07-12 19:35:48 - XXXProject] Installation error: INSTALL_PARSE_FAILED_NO_CERTIFICATES
[2013-07-12 19:35:48 - XXXProject] Please check logcat output for more details.
[2013-07-12 19:35:48 - XXXProject] Launch canceled!

若有include 3rd的.jar 有可能是因為.jar中有與現有專案重複名稱的檔案存在(ex: resource file)

2013年7月10日 星期三

android初體驗 - 如何將lib打包為.jar後還能存取到其中的activity與resource


繼上一篇的使用Lib
前情提要:
最近因為案子需要開始接觸android,完全沒碰過android的我只能硬者頭皮上架,第一個就遇到問題:
因為我的lib有activity,所以如果直接做成.jar供Client呼叫,如下方式:

 
Intent intent = new Intent(v.getContext(),  LibMainActivity.class);
intent.putExtra("userid", "breeze");
intent.putExtra("facextra", "server_1");
startActivity(intent);

會在執行時出現 classdefnotfound exception!
後來找了一下文章,官方提到以下面的方式使用lib:(看友方(?)的使用文件也是一樣方式)
Setting up a Library Project

但很明顯的..這個等於完全將我的垃圾Code 曝露給其他人看到了啊!!(雖然說直接給jar照樣能反組...但至少沒那麼蠢....0rz..)

然後後來看到facebook sdk也是一樣這樣做法,心想可能真的就得如此做了吧,再加上隔天就要交差實在找不到解法的情況下,第二天只好這樣子交給廠商了,結果......

第二天廠商表明他們使用U3D開發,不是純android project,所以無法這樣include Lib,但是因為我真的不懂要怎麼弄成jar還能順利將activity成功啟動...因此他就自己做掉了,厚者臉皮詢問下他跟我說只要將R.id.xxx的resource拿掉改成如下方式:

 
 public static int getLayoutId(Context ctx,String paramString){
  return ctx.getResources().getIdentifier(paramString, "layout", ctx.getPackageName());
 }
 
就可以了,我照者試做,的確把所有的R.id.xxx的引用點改掉,原先為:

 
TextView text = (TextView) findViewById(R.id.noticeText);

改為:
 
  int rid = ResourceUtil.getId(LibMainActivity.this,"noticeText");
  TextView text = (TextView) findViewById(rid);

的確可以運作成功,可是!!!打包成.jar一樣會有錯誤阿!!!
找了半天終於找到解答了,簡單說明就是(明明打了很多廢話還簡單說明...)

  1. 將所有R.id.xxx的引用方式改為上述使用
  2. 所有資源檔的名字不能重複:例如預設的activity_main.xml就最好不要使用,因為使用的client也有可能很偷懶用了預設名稱
  3. 將所有lib會使用到的activity在Client的AndroidManifest.xml中也一併宣告,請參考下方的Declaring library components in the manifest file
  4. lib打包成jar時,除了選擇src以外其他都不能選擇
  5. 將打包好的jar置放(貼)於client project的 libs/ 底下
  6. 將所有會引用到的resource一併手動複製貼到client端的resource對應位置(資料夾下),例如res/layout/...
所以這麼一來雖然每次release時都要給出lib.jar與resource,但的確感覺比直接給出整個lib project要來的好得多了。
詳細圖文請參考Android将Activity打成jar包供第三方调用(解决资源文件不能打包的问题)

p.s剛剛才發現這篇文章是2013/7/6發布的耶!!!今天是2013/7/10,我真要感謝他剛好在我有問題前幾天發文...