2012-03-18 11 views
2

を使用する方法:私は2つのビューとメニュー定義している私のメインの活動ではAndroidの無効化()

再生回数: 1.カスタムビューゲームを 2.ボタン

BTN

メニュー: 開き主な活動は、起動時にさまざまな活動にメニューのレイアウトが定義されている

をファイル

を開くためのアイテムは基本的に、それは何も持っていないカスタムビュー、およびボタンを描画します。次に、メニューの[開く]を使用してファイルをロードします。/sdcardディレクトリにファイルのリストを表示し、リストからファイルを選択します。その後、onListItemClick()はファイルを解析し、カスタムビューのデータ構造を更新します。それから私はメインの活動に戻るために戻る。今私は、ボタンを押した後に再描画を見たいと思うだろうが、それは何もしていないようだ。ボタンのOnClickListener()を実装し、game.invalidate()を呼び出しています。しかし、ボタンをクリックするとすぐにカスタムビューを再描画するようには見えません。私は、アプリケーションを終了する必要があります(戻るボタン)し、再描画を表示するには、アプリケーションを再度開きます。私はinvalidate()に関する他の記事を読んで、すぐにビューを再描画しませんでした。それを待ち行列にプッシュするだけで、アンドロイドは自由に行動を起こします。私は、私のアプリで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

答えて

6

スニペットは、私は2つの活動を見てきましたので、私はpostInvalidate()は、あなたが探しているものであることが推測します。

http://developer.android.com/reference/android/view/View.html#invalidate%28%29 http://developer.android.com/reference/android/view/View.html#postInvalidate%28%29

編集:ここ Why isn't view.invalidate immediately redrawing the screen in my android game はintrestingのスレッドで、あなたはそれを見たことがありますか?

+0

私は、カスタムビューが配置されているのと同じアクティビティでinvalidate()を呼び出しています。だから私はおそらくpostInvalidate()は必要ありません。私が間違っているなら私を愛してください。 – kvzrock

+0

はStackOverflowからのリンクを投稿しました。 repaint()メソッドはintrestingに見えます。 – sschrass

0

myView.invalidate()の代わりに、ボタンの表示がパラメータとしてonclick()メソッドに渡されるため、v.invalidate()を試してみてください。

関連する問題