搜尋此網誌

2014年11月25日 星期二

【Android】動態Menu - onPrepareOptionsMenu

ref:
[Android]Android動態menu選單之實作演練(onPrepareOptionsMenu)
Change options menu during runtime - invalidateOptionsMenu()
Android Developer- Menus


在運行時改變menu item的狀態 
onCreateOptionsMenu()此方法是控制進入該頁面之後首次點擊Menu時會出現的選單項目,此方法只會被呼叫一次。而onPrepareOptionsMenu()此方法是每次點擊Menu時都會被呼叫一次,所以在此方法中,判斷事件的發生後將需要變化的選單加入便可以達到動態menu選單的效果。

Where the items in your options menu appear on the screen depends on the version for which you've developed your application:
  • If you've developed your application for Android 2.3.x (API level 10) or lower, the contents of your options menu appear at the bottom of the screen when the user presses the Menu button, as shown in figure 1. When opened, the first visible portion is the icon menu, which holds up to six menu items. If your menu includes more than six items, Android places the sixth item and the rest into the overflow menu, which the user can open by selecting More.
  • If you've developed your application for Android 3.0 (API level 11) and higher, items from the options menu are available in the action bar. By default, the system places all items in the action overflow, which the user can reveal with the action overflow icon on the right side of the action bar (or by pressing the device Menu button, if available). To enable quick access to important actions, you can promote a few items to appear in the action bar by adding android:showAsAction="ifRoom" to the corresponding <item> elements (see figure 2).

2014年11月20日 星期四

【Java】Arraylist移除問題

ref:http://www.javaworld.com.tw/jute/post/view?bid=29&id=232314

想請問一下大家
我想要用arraylist裡的remove去移除內容
卻發現用一般的想法好像不行

1
2
3
4
5
6
7
8
9
10
11
12
13
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(2);
list.add(2);
list.add(3);
list.add(1);
list.add(2);
System.out.println(list);
    
for (int i=0;i<list.size();i++){
  if(list.get(i)<3);
  list.remove(i);
}
System.out.println(list);


實際上這個list應該還保有3, 但是好像不能用list.size去判斷Arraylist的大小
(因為一刪除size就會改變?, 位置好像也跟著改???)

還是要怎麼處理呢?? 


解決辦法:使用Iterator
1
2
3
4
5
for( java.util.Iterator<Integer> allElements=list.listIterator(); allElements.hasNext(); ){
  Integer currentElement = allElements.next();
  if( currentElement < 3 )
    allElements.remove();
}

2014年11月19日 星期三

【Android】反組譯.apk


  • 需要工具
  1. http://apps.evozi.com/apk-downloader/
  2. dex2jar
  3. Java Decompiler
  • 使用1.將google play的檔案轉換成[.apk]檔,並下載下來。
  • 將此[.apk]檔副檔名更換成[.zip]或[.rar],並解壓縮,如下圖。
  • 將classes.dex複製到和2.將壓縮後同個資料夾。
  • 在cmd下,反組譯classes.dex成[.jar]檔,輸入dex2jar classes.dex,如下圖。
  • 此時,在資料夾會出現classes_dex2jar.jar
  • 使用3.開啟classes_dex2jar.jar ,就可以看到所有原始的java檔
那xml檔要如何decompiler


因為這些xml檔都是二進制的檔要在解回來一次才看得懂。這時候就是需要apktool 這個程式了(在cmd下apktool.jar d xxx.apk "folder" 他就會把它解到folder這個資料夾下
這時候你只要把你要的xml拿出來就好

其實不管是你解回來的xml檔或是java檔都會跟原來的有些的不一樣,例如變數命名之類的。他的一些配置會稍微的變動,不過只要你有寫過android app 你會看的出來那些東西被移到其他檔案去了,稍微在自己整理一下還是都會回來的。

2014年11月18日 星期二

【Android】sorting listview

ref:sorting listview in android

public class Team {
   private int points;
   private String name;

public Team(String n, int p) {
    name = n;
    points = p;
}

public int getPoints() {
    return points;
}

public String getName() {
    return name;
}

public static void main(String[] args) {
    List<Team> lteams = new ArrayList<Team>();

    lteams.add(new Team("FC Barcelona", 0));
    lteams.add(new Team("Arsenal FC", 2));
    lteams.add(new Team("Chelsea", 3));

    Collections.sort(lteams, new MyComparator());

    for (Team lteam : lteams) {
        System.out.println(lteam.name + ": " + lteam.points + " points");
    }
}
}
class MyComparator implements Comparator<Team> {
@Override
public int compare(Team o1, Team o2) {
    if (o1.getPoints() > o2.getPoints()) {
        return -1;
    } else if (o1.getPoints() < o2.getPoints()) {
        return 1;
    }
    return 0;
}}
Output:
Chelsea: 3 points
Arsenal FC: 2 points
FC Barcelona: 0 points

【Android】Menu菜單使用

ref: 【Android 開發】:UI控件之 Menu 菜單的的使用(一)

2014年11月3日 星期一

【Android】Log info!

    
// 顯示此Log的Class
private static final String DEBUG_CLASS = Thread.currentThread().getStackTrace()[3].getClassName(); 

// 顯示Log的Method
private static final String DEBUG_METHOD = Thread.currentThread().getStackTrace()[3].getMethodName(); 
// 顯示此Log的行號  
private static int DEBUG_LINE_NUMBER = Thread.currentThread().getStackTrace()[3].getLineNumber(); 





//
private static String DEBUG_LOG="["+DEBUG_CLASS + "][" + DEBUG_METHOD +"][" + DEBUG_LINE_NUMBER + "]";   

【Android】Refresh Listview ?

ref:http://stackoverflow.com/questions/2250770/how-to-refresh-android-listview




I want to refresh an Android ListView after adding/deleting dynamic data.
Can any one tell me how to achieve this?

 Method
  1. Call notifyDataSetChanged() on your Adapter object once you've modified the data in that adapter.  
  2. Also you can use this:
    myListView.invalidateViews();