如何使用Android Invalidate()

时间:2012-03-18 15:46:26

标签: android

在我的主要活动中,我定义了两个视图和一个菜单:

查看: 1.自定义视图游戏 2.按钮btn

菜单: 1.打开打开文件的项目

菜单布局在不同的活动中定义

基本上,当主要活动开始时,它会绘制没有任何内容的自定义视图和按钮。然后我使用菜单中的open打开文件。它会在/ sdcard目录中显示一个文件列表,然后从列表中选择该文件。然后onListItemClick()解析该文件并更新自定义视图中的数据结构。然后我按回去返回主要活动。现在我希望在按下按钮后看到重绘,但它似乎没有做任何事情。我已经为按钮实现了OnClickListener()并调用了game.invalidate()。但是,单击按钮后,它似乎不会立即重绘自定义视图。我必须退出应用程序(后退按钮),然后重新打开应用程序以查看重绘。我已经阅读了有关invalidate()的其他帖子没有立即重新绘制视图。它只会将其推送到队列中,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

}

2 个答案:

答案 0 :(得分:6)

答案 1 :(得分:0)

而不是myView.invalidate()尝试v.invalidate(),因为我猜您的按钮视图将作为参数传递给onclick()方法。