如何强制整个布局查看刷新?

时间:2011-05-13 12:39:45

标签: android layout refresh

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

通过主布局视图,我的意思是在我的Activity.onCreate()中调用的那个('R.layout.mainscreen'),如下所示: -

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

19 个答案:

答案 0 :(得分:145)

严格回答问题:使用invalidate():

  

public void invalidate()   自:API Level 1

     

使整个视图无效。如果视图可见,将在某个时间点调用onDraw(Canvas)。必须从UI线程调用此方法。要从非UI线程调用,请调用postInvalidate()。

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

现在,当Activity恢复时,它会使每个View都自行绘制。不需要调用invalidate()。要应用主题,请确保在绘制任何视图之前(即setContentView(R.layout.mainscreen);

之前)执行此操作
  

public void setTheme(int resid)   自:API Level 1

     

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

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

由于onDraw()方法适用于已经实例化的视图,因此setTheme将不起作用。我自己没有主题经验,但我能想到的两个备选方案是:

  1. 在onCreate()中调用setTheme,或者
  2. redo setContentView(R.layout.mainscreen);强制重新实施所有布局。

答案 1 :(得分:37)

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

答案 2 :(得分:31)

尝试recreate()它会导致重新创建此活动。

答案 3 :(得分:20)

<强>解决方案:

伙计们我尝试了所有的解决方案,但是他们没有为我工作,我必须将EditText的 setVisibility 设置为 VISIBLE ,并且此EditText应该在< strong> ScrollView ,但我无法刷新根视图才能生效。 我解决了我的问题,当我需要刷新视图时,我将ScrollView可见性更改为GONE,然后再次将其设置为VISIBLE以使其生效,它对我有用。这不是确切的解决方案,但它只能起作用。

 private void refreshView(){
    mScrollView.setVisibility(View.GONE);
    mScrollView.setVisibility(View.VISIBLE);
}

答案 4 :(得分:8)

在根布局上调用invalidate()postInvalidate()显然不能保证重绘子视图。在我的特定情况下,我的根布局是一个TableLayout,并有几个TableRow和TextView类的子代。在根TableLayout对象上调用postInvalidate()requestLayout()甚至forceLayout()不会导致重新布局布局中的任何TextView。

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

代码可以在GitHub上找到: https://github.com/jkincali/Android-LinearLayout-Parser

答案 5 :(得分:7)

否则你也可以试试这个 -

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

答案 6 :(得分:4)

只需在onresume中设置内容视图

即可 在onResume ..

中的

setContentView(R.layout.yourview)

示例:

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

答案 7 :(得分:4)

针对主题问题尝试此解决方法:

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

答案 8 :(得分:3)

Intent intent = getIntent();
intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
finish();
startActivity(intent);

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

答案 9 :(得分:2)

这似乎是known bug

答案 10 :(得分:2)

我也遇到了这个问题,但是在Farhan领导使用setContentView()后,我做到了这一点。然而,单独使用setContentView()是不够的。我发现我必须用信息重新填充我的所有观点。为了解决这个问题,我把所有代码都拉到另一个方法(我称之为构建),在我的onCreate方法中我只调用该构建。现在,每当我的事件发生时,我希望我的活动“刷新”,我只需要调用build,给它新的信息(我将其作为参数构建),并且我有一个刷新的活动。

答案 11 :(得分:0)

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

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

答案 12 :(得分:0)

尝试一下

view.requestLayout();

答案 13 :(得分:0)

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

就像这样(如果您有一个名为myElement的ViewGroup):

myElement.removeAllViews()

答案 14 :(得分:0)

不确定这是不是很好,但我每次都会这样说:

Where

答案 15 :(得分:0)

这就是我用来刷新布局的方式

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

答案 16 :(得分:0)

我不知道这是否安全,但它对我有用。我自己遇到了这个问题并尝试了invalidate()requestLayout(),但无济于事。所以我只是再次打电话给我onCreate(null)并且它有效。如果这不安全,请告诉我。希望这可以帮助那些人。

答案 17 :(得分:-1)

answer :您可以通过使用意图发送活动来更新和重新创建活动并保存数据。

public void refresh() {
   Intent intent = getIntent();
   intent.putExtra("extra_id",details);   
   overridePendingTransition(0, 0);
   intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION); 
   finish(); 
   overridePendingTransition(0, 0); 
   startActivity(intent); 
   }

并将其放入onCreate

details=getIntent().getStringExtra("extra_id")

答案 18 :(得分:-6)

只需使用意图再次调用活动。 例如,要刷新MainActivity的布局,请执行以下操作:

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