【问题标题】:How to use Android Invalidate()如何使用 Android Invalidate()
【发布时间】:2018-03-21 20:10:38
【问题描述】:

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

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

菜单: 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

}

【问题讨论】:

  • 您找到解决方案了吗?

标签: android


【解决方案1】:

【讨论】:

  • 我在自定义视图所在的同一个活动中调用 invalidate()。所以我可能不需要 postInvalidate()。如果我错了,请纠正我。
  • 发布了来自 StackOverflow 的链接。 repaint() 方法看起来很有趣。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-31
    • 1970-01-01
    相关资源
    最近更新 更多