如何使用Android Invalidate()

如何使用Android Invalidate(),android,Android,在我的主要活动中,我定义了两个视图和一个菜单: 观点: 1.自定义视图游戏 2.按钮btn 菜单: 1.用于打开文件的打开项 菜单布局在不同的活动中定义 基本上,当主活动开始时,它会绘制没有任何内容的自定义视图和按钮。然后我使用菜单中的“打开”按钮加载文件。它在/sdcard目录中显示一个文件列表,我从列表中选择该文件。然后onListItemClick()解析文件并更新自定义视图中的数据结构。然后我按back返回到主要活动。现在我希望在按下按钮后看到重新绘制,但它似乎没有任何作用。我已经为按钮

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

观点: 1.自定义视图游戏 2.按钮btn

菜单: 1.用于打开文件的打开项

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

基本上,当主活动开始时,它会绘制没有任何内容的自定义视图和按钮。然后我使用菜单中的“打开”按钮加载文件。它在/sdcard目录中显示一个文件列表,我从列表中选择该文件。然后onListItemClick()解析文件并更新自定义视图中的数据结构。然后我按back返回到主要活动。现在我希望在按下按钮后看到重新绘制,但它似乎没有任何作用。我已经为按钮实现了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

}
//主要活动
公共类活动扩展了活动{
someView-myView;
@凌驾
创建时的公共void(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
LinearLayout布局=新的LinearLayout(本);
布局。设置方向(线性布局。垂直);
按钮btn1=新按钮(此按钮);
btn1.setOnClickListener(转发);
myView=新的someView(此);
layout.addView(myView);
布局。添加视图(btn1);
setContentView(布局);
}
@凌驾
公共布尔onCreateOptions菜单(菜单)
{
MenuInflater充气机=getMenuInflater();
充气机。充气(右菜单,菜单);
返回true;
}
@凌驾
公共布尔值onOptionsItemSelected(菜单项项)
{
开关(item.getItemId())
{
案例R.id.open:
Intent myIntent=新Intent();
myIntent.setClass(这是DirectoryBrowser.class);
startActivityForResult(myIntent,0);
返回true;
案例R.id.save:
返回true;
违约:
返回super.onOptionsItemSelected(项目);
}
}
private OnClickListener forward=new OnClickListener()
{
公共void onClick(视图v)
{
myView.invalidate();
}
};
//目录浏览器活动
公共类DirectoryBrowser扩展ListActivity
{
私有列表项=空;
@凌驾
创建公共空间(捆绑冰柱){
超级冰柱;
setContentView(R.layout.open);
getFiles(新文件(“/sdcard”).listFiles());
}
@凌驾
受保护的void onListItemClick(列表视图l、视图v、整数位置、长id){
int selectedRow=(int)id;
如果(selectedRow==0){
getFiles(新文件(“/sdcard”).listFiles());
}否则{
File File=新文件(items.get(selectedRow));
if(file.isDirectory()){
getFiles(file.listFiles());
}否则{
尝试
{
//解析文件并更新myView.data
}
catch(filenotfounde异常)
{
Log.e(“错误”,“未找到文件”);
}
}
}
}
//自定义视图someView
//...
@凌驾
公共空白onDraw(画布)
{
//在此重画视图
}

我已经看过两个活动,所以我想
postInvalidate()
可能就是您要找的

编辑:
这是一个有趣的线程,你看到了吗?

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

我正在调用invalidate()在自定义视图所在的同一活动中。因此,我可能不需要postInvalidate()。如果我错了,请更正我。从StackOverflow发布了一个链接。repaint()方法看起来很有趣。您找到解决方案了吗?