顯示具有 Android 標籤的文章。 顯示所有文章
顯示具有 Android 標籤的文章。 顯示所有文章

2012年7月17日 星期二

Making ListView Scrolling Smooth

1.不要在UI Thread中作太吃重的工作
2.若要存取儲存裝置、讀取網路資料、執行SQL時建議建立Thread去執行
3.使用AsyncTask 官方範例如下

// Using an AsyncTask to load the slow images in a background thread
new AsyncTask<ViewHolder, Void, Bitmap>() {
    private ViewHolder v;

    @Override
    protected Bitmap doInBackground(ViewHolder... params) {
        v = params[0];
        return mFakeImageLoader.getImage();
    }

    @Override
    protected void onPostExecute(Bitmap result) {
        super.onPostExecute(result);
        if (v.position == position) {
            // If this item hasn't been recycled already, hide the
            // progress and set and show the image
            v.progress.setVisibility(View.GONE);
            v.icon.setVisibility(View.VISIBLE);
            v.icon.setImageBitmap(result);
        }
    }
}.execute(holder);
4.Hold View Objects in a View Holder

static class ViewHolder {
  TextView text;
  TextView timestamp;
  ImageView icon;
  ProgressBar progress;
  int position;
}
5.keep View

ViewHolder holder = new ViewHolder();
holder.icon = (ImageView) convertView.findViewById(R.id.listitem_image);
holder.text = (TextView) convertView.findViewById(R.id.listitem_text);
holder.timestamp = (TextView) convertView.findViewById(R.id.listitem_timestamp);
holder.progress = (ProgressBar) convertView.findViewById(R.id.progress_spinner);
convertView.setTag(holder);

2012年7月7日 星期六

Android overridePendingTransition animation

幫activity加入換場效果~
    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.post_detail);
        
        //version should upper than 5
        int version = Integer.valueOf(android.os.Build.VERSION.SDK);
        if(version >= 5) 
        {
         //use your animation XML
         //overridePendingTransition(R.anim.zoomin, R.anim.zoomout);
         
         //overridePendingTransition(android.R.anim.fade_in,android.R.anim.fade_out);
         overridePendingTransition(android.R.anim.slide_in_left,android.R.anim.slide_out_right);
        }
    }

幫eclipse加上自動提示(Intellisense)程式碼功能

做法如下:
Windows -> Preferences -> Java -> Editor -> Content Assist
在Auto activation triggers for Java 中輸入 .abcdefghijklmnopqrstuvwxyz(,
(預設只有 . 才會檢查提示)

2012年7月5日 星期四

Android modify View's properties in Code

we sometimes need to change View's properties in Code.
try this demo code.
//change color
colorBtn.setTextColor(0xFF000000);

//change text size
sizeBtn.setTextSize(14);

//change gravity
gravityBtn.setGravity(android.view.Gravity.BOTTOM);

Android Button onClick Control

Simple onClick control
In XML
    <Button
        android:id="@+id/btn_color"
        android:layout_width="80dp"
        android:layout_height="match_parent"
        android:onClick="onClick"
        android:gravity="center"
        android:text="BLACK"
        android:textColor="#FF000000" />

    <Button
        android:id="@+id/btn_size"
        android:layout_width="80dp"
        android:layout_height="match_parent"
        android:onClick="onClick"
        android:text="small"
        android:gravity="center"
        android:textSize="8sp" />

    <Button
        android:id="@+id/ok"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:onClick="onClick"
        android:gravity="center"
        android:text="OK"
        />

In Android Code
 public void onClick(View view) 
    {
  switch (view.getId()) 
  {
   case R.id.ok:
   {
    //do something...
   }
   break;
   case R.id.btn_color:
   {
    
   }
   break;
   case R.id.btn_size:
   {
    
   }
   default:
   break;
  }
    }

2012年7月3日 星期二

Crystal ToDo 透明待辦

軟體名稱
Crystal ToDo 透明待辦

功能簡介
可以將待辦事項條列在桌面上

特色
程式檔案小不佔空間,無多餘複雜功能,透明背景不會遮住您心愛的桌布。

Google Play QRCode
QRCode

Android get date

Android中取得時間日期的方式跟java是用一樣的方式
 private void setDateTextView() 
 {
        TitleView = (TextView)findViewById(R.id.titleText); 
        
        Calendar rightNow = Calendar.getInstance();
        String[] months = {"1月", "2月", "3月", "4月",
                "5月", "6月", "7月", "8月",
                "9月", "10月", "11月", "12月"};
        
        TitleView.setText(months[rightNow.get(Calendar.MONTH)] + rightNow.get(Calendar.DATE) + "日" + "\n"
        + rightNow.get(Calendar.HOUR) + ":" + rightNow.get(Calendar.MINUTE));   
  
 }

Android read and parse .csv

在Android上簡易的const data建立與讀取方式
一、使用google文件的試算表建立資料表格
二、將檔案下載為csv檔
三、將檔案放到Android方案中的assets目錄
四、使用Android的InputStream讀入csv檔
五、使用BufferedReader來parse

       try 
        {
   InputStream is = getResources().getAssets().open("score.csv");
   BufferedReader reader = new BufferedReader(new InputStreamReader(is));
      try 
      {
          String line;
          while ((line = reader.readLine()) != null) 
          {
               String[] RowData = line.split(",");
               Log.e("TAG", RowData[0]);
               Log.e("TAG", RowData[1]);
               Log.e("TAG", RowData[2]);
              // do something with "data" and "value"
          }
      }
      catch (IOException ex) 
      {
          // handle exception
      }
      finally 
      {
          try 
          {
              is.close();
          }
          catch (IOException e) 
          {
              // handle exception
          }
      }
  } 
        catch (IOException e) 
        {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }  

2012年7月2日 星期一

2012年7月1日 星期日

Android screen Orientation 螢幕方向控制

Android 程式在開發時, 若沒特殊指定顯示的方式
則開發好的程式, 是會隨著使用者的拿法而自動切換成直式或是橫式
若要指定螢幕的顯示方向, 可在 AndroidManifest.xml 裡的 Activity 標籤上
加入參數
// 直式顯示: portrait
// 橫式顯示: landscape
// 自動切換: sensor
android:screenOrientation="portrait"

或是由程式直接控制
import android.content.pm.ActivityInfo;

// 橫式: SCREEN_ORIENTATION_LANDSCAPE
// 直式: SCREEN_ORIENTATION_PORTRAIT
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

2012年6月30日 星期六

Android AsyncTask 讀取圖片

為了不影響閱讀,故使用AsyncTask從http下載圖片,在更新到介面上。

使用:

// show The Image
new DownloadImageTask((ImageView) findViewById(R.id.imageView1))
            .execute("http://java.sogeti.nl/JavaBlog/wp-content/uploads/2009/04/android_icon_256.png");



AsyncTask:
private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {
    ImageView bmImage;

    public DownloadImageTask(ImageView bmImage) {
        this.bmImage = bmImage;
    }

    protected Bitmap doInBackground(String... urls) {
        String urldisplay = urls[0];
        Bitmap mIcon11 = null;
        try {
            InputStream in = new java.net.URL(urldisplay).openStream();
            mIcon11 = BitmapFactory.decodeStream(in);
        } catch (Exception e) {
            Log.e("Error", e.getMessage());
            e.printStackTrace();
        }
        return mIcon11;
    }

    protected void onPostExecute(Bitmap result) {
        bmImage.setImageBitmap(result);
    }
}

Android 取得screen長寬的幾種方法

一、API level 13以前的版本作法
Display display = getWindowManager().getDefaultDisplay(); 
int width = display.getWidth();  // deprecated
int height = display.getHeight();  // deprecated
二、目前的作法
Display display = getWindowManager().getDefaultDisplay(); 
int width = display.getWidth();
int height = display.getHeight();
三、沒有Activity時的作法
WindowManager wm = (WindowManager) ctx.getSystemService(Context.WINDOW_SERVICE);
Display display = wm.getDefaultDisplay();
四、其他作法 在實機使用會當掉,用模擬器不會。
Display display = getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getSize(size);
int width = size.x;
int height = size.y;
原文

2012年6月29日 星期五

JAVA 解析JSON範例

/////////////範例
//  {  
//      "phone" : ["12345678", "87654321"], // 數組  
//      "name" : "yuanzhifei89", // 字符串  
//      "age" : 100, // 數值  
//      "address" : { "country" : "china", "province" : "jiangsu" }, // 對象  
//      "married" : false // 布爾值  
//  }  
  
private static final String JSON =   
"{" +  
    "   \"phone\" : [\"12345678\", \"87654321\"]," +  
    "   \"name\" : \"yuanzhifei89\"," +  
    "   \"age\" : 100," +  
    "   \"address\" : { \"country\" : \"china\", \"province\" : \"jiangsu\" }," +  
    "   \"married\" : false," +  
"}";  
  
try {  
    JSONTokener jsonParser = new JSONTokener(JSON);  
    // 此時還未讀取任何json文本,直接讀取就是一個JSONObject對象。  
    // 如果此時的讀取位置在"name" : 了,那麼nextValue就是"yuanzhifei89"(String)  
    JSONObject person = (JSONObject) jsonParser.nextValue();  
    // 接下來的就是JSON對象的操作了  
    person.getJSONArray("phone");  
    person.getString("name");  
    person.getInt("age");  
    person.getJSONObject("address");  
    person.getBoolean("married");  
} catch (JSONException ex) {  
    // 異常處理代碼  
}  

Android AsyncTask Template/Demo

AsyncTask Android包好方便使用的多緒物件,extends並改寫@Override部分,可以簡單做到多緒並可更新UI。 下面只在doInBackground中加入Thread.sleep(5000);其他需求再自行調整。 PS:JAVA正統多緒寫法請參考Runable相關內容。
  //////////////////////
  //sleep 5000 to close intro
  //////////////////////
     class CloseIntro extends AsyncTask<Void, Void, Void>
      {     
    @Override
    protected void onPreExecute() 
    {
     // 做doInBackground之前要做的事
     super.onPreExecute();
    }

    @Override
    protected Void doInBackground(Void... arg0) 
    {
     // 把花時間的工作放這裡
     try {
      Thread.sleep(5000);
     } catch (InterruptedException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
     }
     return null;
    }
    
    @Override
    protected void onProgressUpdate(Void... values) 
    {
     // 進度更新 例如需更新progress bar
     super.onProgressUpdate(values);
    }

    @Override
    protected void onPostExecute(Void result) 
    {
     // doInBackground 完成後call 這裡
     super.onPostExecute(result);
    }

      }

Android 將介面顯示或隱藏

     ImageView intro = (ImageView)findViewById(R.id.intro);
     
     intro.setVisibility(View.GONE);