在我的主要活动中,我定义了两个视图和一个菜单:
浏览次数:
1.自定义视图游戏
2.按钮btn
菜单:
1. 打开项目用于打开文件
菜单布局在不同的活动中定义
基本上,当主活动启动时,它会绘制没有任何内容的自定义视图和按钮。然后我使用菜单中的“打开”加载文件。它会显示 /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 个活动,所以我猜postInvalidate()
可能就是您正在寻找的。
http://developer.android.com/reference/android/view/View.html#invalidate%28%29 http://developer.android.com/reference/android/view/View.html#invalidate%28%29
http://developer.android.com/reference/android/view/View.html#postInvalidate%28%29 http://developer.android.com/reference/android/view/View.html#postInvalidate%28%29
Edit:
为什么 view.invalidate 不立即重绘我的 Android 游戏中的屏幕 https://stackoverflow.com/questions/1458047/why-isnt-view-invalidate-immediately-redrawing-the-screen-in-my-android-game这里有一个有趣的话题,你看过吗?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)