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

Mic*_*eyR 167 layout android refresh

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

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

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.mainscreen);
}
Run Code Online (Sandbox Code Playgroud)

Ale*_*dam 148

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

public void invalidate()从:API级别1

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

ViewGroup vg = findViewById (R.id.mainLayout);
vg.invalidate();
Run Code Online (Sandbox Code Playgroud)

现在,当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); 强制重新实例化所有布局.


key*_*fer 39

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

  • 谢谢 !我在上面发布给Aleadam的答案相同.这个invalidate()不会导致活动主题刷新,这是我需要的. (3认同)

Moh*_*ULI 34

尝试recreate()它将导致重新创建此活动.

  • 我尝试了这个线程中的所有选项,这是唯一一个使用最不希望的副作用的选项. (4认同)
  • 如果我需要在 `onResume` 方法中执行此操作怎么办。这给了我无限循环:/ (2认同)

Nav*_*mad 28

解:

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

 private void refreshView(){
    mScrollView.setVisibility(View.GONE);
    mScrollView.setVisibility(View.VISIBLE);
}
Run Code Online (Sandbox Code Playgroud)

  • 哇..我也尝试了所有建议的解决方案,但这似乎是唯一有效的解决方案,但这有点可怕...... (2认同)
  • 该解决方案之所以有效,是因为设置可见性会在视图上调用“requestLayout()”。请参阅[文档](https://developer.android.com/reference/android/view/View#requestLayout())。 (2认同)

jki*_*ali 9

调用invalidate()postInvalidate()根目录布局显然不能保证重绘子视图.在我的特定情况下,我的根布局是一个TableLayout,并有几个TableRow和TextView类的子代.调用postInvalidate(),或者requestLayout()甚至forceLayout()根TableLayout对象没有造成任何布局要TextViews重绘.

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

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


Dat*_*nde 8

否则你也可以试试这个 -

ViewGroup vg = (ViewGroup) findViewById (R.id.videoTitleTxtView);
 vg.removeAllViews();
 vg.refreshDrawableState();
Run Code Online (Sandbox Code Playgroud)

  • 谢谢你!但是,这删除了我所有的视图(TextView,Buttons等),但没有重新绘制它们 - 我的屏幕仍然是空白的... (4认同)

Mil*_*ary 6

尝试这个

view.requestLayout();
Run Code Online (Sandbox Code Playgroud)


Far*_*an 5

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

onResume 内的 setContentView(R.layout.yourview) ..

例子:

@Override
public void onResume(){
super.onResume();
setContentView(R.layout.activity_main); 
postIncomeTotals();
}
Run Code Online (Sandbox Code Playgroud)