我想强制主布局资源视图重绘/刷新,比如Activity.onResume()方法。我怎样才能做到这一点 ?
通过主布局视图,我的意思是在我的Activity.onCreate()中调用的那个('R.layout.mainscreen'),如下所示: -
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.mainscreen);
}
答案 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 :(得分: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));