如何强制整个布局视图刷新?

我想强制主布局资源视图重新绘制/刷新,比如 Activity.onResume ()方法。我怎么能这么做?

在主布局视图中,我指的是在 Activity.onCreate ()中调用的那个(下面的‘ R.layout.mainscreen’) ,如下所示:-

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.mainscreen);
}
438351 次浏览

试试 getWindow().getDecorView().findViewById(android.R.id.content).invalidate();

要严格回答这个问题,请使用无效() :

公共空白无效() 自: API 级别1

使整个视图无效。如果视图是可见的,那么将在将来的某个时刻调用 onDrawas (Canvas)。这必须从 UI 线程中调用。若要从非 UI 线程调用,请调用 postInvalid()。

ViewGroup vg = findViewById (R.id.mainLayout);
vg.invalidate();

现在,当活动恢复时,它让每个视图自己绘制。不需要调用废止()。要应用主题,请确保在绘制任何视图之前,即在 setContentView(R.layout.mainscreen);之前进行

Public void setTheme (int resid) 自: API 级别1

为此上下文设置基本主题。请注意,应该在上下文中实例化任何视图之前调用这个函数(例如,在调用 setContentView (View)或充气(int,ViewGroup)之前)。

API 文档参考在这里: http://developer.android.com/reference/android/view/ContextThemeWrapper.html#setTheme%28int%29

因为 onDraw ()方法可以在已经实例化的视图上工作,所以 setTheme 不能工作。我自己对主题没有经验,但我认为有两种选择:

  1. 调用 onCreate ()中的 setTheme,或者
  2. 重做 setContentView (R.layout.mainscreen) ; 以强制重新实例化所有布局。

否则你也可以试试这个-

ViewGroup vg = (ViewGroup) findViewById (R.id.videoTitleTxtView);
vg.removeAllViews();
vg.refreshDrawableState();

这看起来像是 已知窃听器

在简历中设置你的内容视图

OnResume 中的 setContentView (R.layout.yourview) . 。

例如:

@Override
public void onResume(){
super.onResume();
setContentView(R.layout.activity_main);
postIncomeTotals();
}

对于主题化问题,请尝试下面的解决方案:

@Override
public void onBackPressed() {
NavUtils.navigateUpTo(this, new Intent(this,
MyNeedToBeRefreshed.class));
}

我也有这个问题,但是跟随 Farhan 使用 setContentView()的领导,我做到了。然而,仅仅使用 setContentView()本身是不够的。我发现我必须用信息重新填充我的所有视图。为了解决这个问题,我只是将所有代码提取到另一个方法中(我称之为 build) ,在我的 onCreate方法中,我只调用 build。现在,每当我的事件发生时,我希望我的活动“刷新”,我只需要调用 build,给它新的信息(我将其作为要构建的参数传递给它) ,然后我就有了一个刷新的活动。

尝试 recreate()它将导致这个活动被重新创建。

在根布局上调用 invalidate()postInvalidate()显然不能保证子视图将被重绘。在我的具体案例中,我的根布局是 TableLayout,并且有几个 TableRow 和 TextView 类的子类。在根 TableLayout 对象上调用 postInvalidate()requestLayout()甚至 forceLayout()都不会导致重绘布局中的任何 TextView。

所以,我最后做的是递归地解析布局,寻找那些 TextView,然后在每个 TextView 对象上调用 postInvalidate()

代码可以在 GitHub 上找到: Https://github.com/jkincali/android-linearlayout-parser

我不知道这是否安全,但它为我工作。我自己也遇到了这个问题,试了 invalidate()requestLayout(),但没有用。所以我重新调用了我的 onCreate(null),它起作用了。如果这不安全,请告诉我。希望这能帮到别人。

解决方案:

伙计们,我尝试了你们所有的解决方案,但他们没有为我工作,我必须设置 SetVisiability 可见性的编辑文本为 看得见,这个编辑文本应该是可见的,然后在 ScrollView,但我无法刷新根视图生效。 当我需要刷新视图时,我解决了我的问题,所以我将 ScrollView 可见性改为 GONE,然后再次将其设置为 VISIBLE 以生效,这对我很有效。这不是确切的解决方案,但它只有工作。

 private void refreshView(){
mScrollView.setVisibility(View.GONE);
mScrollView.setVisibility(View.VISIBLE);
}
Intent intent = getIntent();
intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
finish();
startActivity(intent);

这允许您重新加载主题更改并隐藏动画。

我以前就是这样刷新布局的

Intent intent = getIntent();
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_NO_ANIMATION);
finish();
startActivity(intent);

不知道这是不是个好办法,但我每次都这么说:

setContentView(R.layout.mainscreen);

只需使用意图再次调用活动本身。 例如,要刷新 MainActivity 的布局,可以这样做:

startActivity(new Intent(MainActivity.this, MainActivity.class));

要清除视图扩展 ViewGroup,只需使用方法 removeAllViews()

就像这样(如果你有一个叫做 myElement的 ViewGroup) :

myElement.removeAllViews()

试试这个

view.requestLayout();

如果要创建自定义视图,请确保它正在扩展 SurfaceView,然后可以使用方法 getHolder().lockCanvas()重新绘制它。这里有一个例子:

Canvas c = getHolder().lockCanvas();
c.drawText("Text", x, y, paint);
getHolder().unlockCanvasAndPost(c);

无效()在没有 Parent.requestLayout ()的情况下无法工作

parent.invalidate()
container.requestLayout()