如何强制整个布局查看刷新?
我想要强制主要的布局资源视图重绘/刷新,说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是:
- 在onCreate()中调用setTheme来代替,或者
- 重做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);