在我的主要活动中,我定义了两个视图和一个菜单:
查看: 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
}
答案 0 :(得分: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 这是一个有趣的话题,你见过吗?
答案 1 :(得分:0)
而不是myView.invalidate()
尝试v.invalidate()
,因为我猜您的按钮视图将作为参数传递给onclick()
方法。