上色

Code Block

2015年6月17日 星期三

[Android] commit()與apply()

SharedPreferences.Editor中的commit()與apply()都是向SharedPreferences寫入數據,差別如下︰

commit()︰立刻同步寫入數據到磁碟中的SharedPreferences,並且具有回傳值(boolean)表示成功或失敗

apply()︰API 9之後加入的method,會將欲寫入的數據暫存於記憶體中,進行一個非同步寫入,因此速度較commit()快,但是不具有傳回值

因此假如不需要傳回值的時候,建議使用apply()取代commit()

Android Developer的解釋如下︰
As SharedPreferences instances are singletons within a process, it's safe to replace any instance of commit() with apply() if you were already ignoring the return value.
You don't need to worry about Android component lifecycles and their interaction with apply() writing to disk. The framework makes sure in-flight disk writes from apply() complete before switching states.
 Reference: http://developer.android.com/reference/android/content/SharedPreferences.Editor.html

2015年6月13日 星期六

[Windows] Windows 7 / Windows 8破解使用者密碼

若是連Administrator都被密碼鎖住無法登入,可依照以下方法破解︰

1. 使用任何可開機裝置進入系統(Windows安裝光碟->修復主控台、Windows PE、MS-DOS with NTFS support、Linux),只要可以操作檔案系統即可

2. 輸入以下命令將放大鏡工具改為命令提示字元(Command Prompt)︰

    c: (或是你安裝windows的硬碟代號,不一定是c)
    cd windows\system32
    ren Magnify.exe Magnify1.exe (將原本的放大鏡程式改名)
    ren cmd.exe Magnify.exe (將命令提示字元改名為放大鏡)

3. 重新開機,進入Windows 7登入畫面

4. 點選左下角的「輕鬆存取」,勾選「讓螢幕上的項目放大一些(放大鏡)」,按下「確定」,即可開啟命令提示字元(Command Prompt)

5. 輸入以下命令,創建一個具有系統管理員身份的帳戶︰

    net user test123 /add
    net localgroup administrators test123 /add

    以上兩行命令代表創建一個test123的帳戶,並賦予系統管理員權限

6. 以剛剛創立的test123帳戶即可成功登入系統

7. 輸入以下命令,還原放大鏡工具︰
 
    ren Magnify.exe cmd.exe
    ren Magnify1.exe Magnify.exe

8. 進入「控制台」->「使用者帳戶」-> [原本的使用者] -> 「移除密碼」

9. 登入後即可以原本的使用者登入(不需密碼)

2015年6月10日 星期三

[Android] Custom ListView with SimpleAdapter

若要以SimpleAdapter建立包含RadioButton或是CheckBox的Custom ListView,可依照以下方法︰ 1. 將ListView中將各元件設定為以下屬性
android:focusable="false"
android:focusableInTouchMode="false"
android:clickable="false"

2. 建立一個變數以管理RadioButton或是CheckBox的狀態 

3. 建立ListView的OnItemClickListener方法以管理RadioButton或是CheckBox的狀態

Example:
//Create data
private ArrayList<<HashMap<String, Object>> itemList;

依照以下格式設定資料來源
Title: 主標題
Content: 副標題(內容)
Checked: 核取狀態(true / false)

final SimpleAdapter simpleAdapter = new SimpleAdapter(this,itemList,R.layout.customListView,new String[]{"Title","Content","Checked"},new int[]{R.id.TextView1,R.id.TextView2,R.id.RadioButton1});
simpleAdapter.setViewBinder(new SimpleAdapter.ViewBinder() {
 @Override
 public boolean setViewValue(View view, Object data, String textRepresentation) {
  //Hide empty textView
  if (data == null) {
   view.setVisibility(View.GONE);
   return true;
  }
  view.setVisibility(View.VISIBLE);
  return false;
 }
});
ListView listview = (ListView) findViewById(R.id.ListView1);
listview .setAdapter(simpleAdapter);
listview .setOnItemClickListener(new AdapterView.OnItemClickListener() {
 @Override
 public void onItemClick(AdapterView parent, View view, int position, long id) {
  RadioButton radiobutton1 = (RadioButton) findViewById(R.id.RadioButton1);
  //Save position
  for (HashMap<String, Object> data : itemList)
   data.put("Checked", false); //Clear state
  itemList.get(position).put("Checked", true); //Set current radio button to checked
  simpleAdapter.notifyDataSetChanged();
 }
});

最後需要取得資料時,直接判斷ArrayList中HashMap的Checked欄位即可得知被選取的資料

[Android] 避免ListView高度過高,遮蓋下方元件

在LinearLayout中設定
android:layout_weight="0.9"
即可避免遮蓋下方元件

[Android] 將App從「最近App列表」中隱藏

1. 在AndroidManifest.xml中加入以下屬性
<activity>
  ...
  android:excludeFromRecents="true"
  ...
</activity>
或是以intent啟動activity時加入以下屬性
intent.setFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
2. 在AndroidManifest.xml中加入以下屬性
<activity>
  ...
  android:label=""
  ...
</activity>