2012-03-18 57 views
2

在我的主要活動我已經定義了兩個視圖和一個菜單:如何使用Android的Invalidate()

瀏覽: 1.自定義視圖遊戲 2.按鈕BTN

菜單: 1.打開項目打開文件

菜單佈局在不同的活動

基本上,主要活動開始時,它繪製不具有任何自定義視圖,並且按鈕的定義。然後我使用菜單中的打開來加載文件。它調出/ sdcard目錄中的文件列表,並從列表中選擇文件。然後onListItemClick()解析文件並更新自定義視圖中的數據結構。然後我按回來回到主要活動。現在我希望看到按下按鈕後重新繪製,但它似乎沒有做任何事情。我已經實現了按鈕的OnClickListener()並調用game.invalidate()。但它似乎並沒有立即重新繪製自定義視圖按鈕點擊。我必須退出應用程序(後退按鈕),然後重新打開應用程序以查看重繪。我讀過關於invalidate()的其他文章,不立即重畫視圖。它只會將其推送到隊列中,一旦Android可以自由採取行動,Android就會採取行動。我想我不明白的是,在我的應用程序中,讓Android無法採取行動。代碼

//Main Activity 
public class someActivity extends Activity { 

someView myView; 

@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    LinearLayout layout = new LinearLayout(this); 
    layout.setOrientation(LinearLayout.VERTICAL); 
    Button btn1 = new Button(this); 
    btn1.setOnClickListener(forward); 
    myView = new someView(this); 
    layout.addView(myView); 
    layout.addView(btn1); 
    setContentView(layout); 
} 
@Override 
public boolean onCreateOptionsMenu(Menu menu) 
{ 
    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.menu, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) 
{ 
    switch (item.getItemId()) 
    { 
    case R.id.open: 
     Intent myIntent = new Intent(); 
     myIntent.setClass(this, DirectoryBrowser.class); 
     startActivityForResult(myIntent,0); 
     return true; 
    case R.id.save: 
     return true; 
    default: 
     return super.onOptionsItemSelected(item); 

    } 
} 

private OnClickListener forward = new OnClickListener() 
{ 
    public void onClick(View v) 
    { 
     myView.invalidate(); 

    } 
}; 

//DirectoryBrowser Activity 
public class DirectoryBrowser extends ListActivity 
{ 
private List<String> items = null; 

@Override 
public void onCreate(Bundle icicle) { 
    super.onCreate(icicle); 
    setContentView(R.layout.open); 
    getFiles(new File("/sdcard").listFiles()); 
} 

@Override 
protected void onListItemClick(ListView l, View v, int position, long id){ 
    int selectedRow = (int)id; 
    if(selectedRow == 0){ 
     getFiles(new File("/sdcard").listFiles()); 
    }else{ 
     File file = new File(items.get(selectedRow)); 
     if(file.isDirectory()){ 
      getFiles(file.listFiles()); 
     }else{ 
       try 
       { 
             //Parse file and update myView.data 
            } 
       catch (FileNotFoundException e) 
       { 
        Log.e("ERROR","File Not Found"); 
       } 
     } 
    } 
} 

//Custom View someView 
//... 

@Override 
public void onDraw(Canvas canvas) 
{ 
     //Redraw view here 

} 
+0

您是否得到了解決方案? – ViVekH 2014-08-20 08:59:53

回答

6
+0

我在自定義視圖所在的同一活動中調用invalidate()。所以我可能不需要postInvalidate()。如果我錯了,請告訴我。 – kvzrock 2012-03-18 18:25:07

+0

從StackOverflow發佈了一個鏈接。 repaint()方法看起來很有趣。 – sschrass 2012-03-19 07:36:09

0

而不是myView.invalidate()嘗試v.invalidate(),因爲我猜你的按鈕視圖將作爲參數傳遞給onclick()方法。

相關問題