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

我想要强制主要的布局资源视图重绘/刷新,说Activity.onResume()方法。 我该怎么做?

通过主布局视图,我的意思是在我的Activity.onCreate()中调用的一个(下面的“R.layout.mainscreen”),如下所示: –

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

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

public void invalidate()从以下版本开始:API Level 1

使整个视图无效。 如果视图是可见的,onDraw(Canvas)将在未来某个时候被调用。 这必须从UI线程调用。 要从非UI线程调用,请调用postInvalidate()。

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

现在,当活动恢复时,它使每个视图自己绘制。 不需要调用invalidate()。 要应用主题,请确保在绘制View之前,即在setContentView(R.layout.mainscreen);之前执行此操作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将不起作用。 我自己没有主题的经验,但我能想到的两个备选scheme是:

  1. 在onCreate()中调用setTheme来代替,或者
  2. 重做setContentView(R.layout.mainscreen); 强制重新实现所有的布局。

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

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

解:

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

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

否则,你可以试试这个 –

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

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

所以,我最终做的是recursionparsing布局寻找这些TextViews,然后调用每个这些TextView对象的postInvalidate()

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

尝试此主题问题的解决方法:

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

只需在onresume中设置你的内容视图

setRestentView(R.layout.yourview)里面的onResume ..

例:

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

这似乎是一个已知的错误 。

我也遇到了这个问题,但遵循Farhan的使用setContentView()的主angular我就是这么做的。 然而,使用setContentView()本身是不够的。 我发现我不得不用信息重新填充所有的观点。 为了解决这个问题,我把所有的代码都放到了另一个方法中(我称之为构build),并在我的onCreate方法中调用构build。 现在每当我的事件发生,我想我的活动“刷新”,我只是调用构build,给它新的信息(我传入参数构build),我有一个刷新的活动。

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

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

我不知道这是否安全,但它对我有用。 我有点碰到这个问题,并尝试invalidate()requestLayout()但无济于事。 所以我只是再次调用我的onCreate(null) ,它的工作。 如果这是不安全的,请让我知道。 希望这可以帮助那里的人。

这是我用来刷新我的布局

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