Как заставить весь макет View обновить? - PullRequest
161 голосов
/ 13 мая 2011

Я хочу принудительно перерисовать / обновить основное представление ресурсов макета, скажем, методом Activity.onResume (). Как я могу это сделать ?

Под основным представлением макета я имею в виду тот («R.layout.mainscreen» ниже), который вызывается в моем Activity.onCreate (), например: -

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

Ответы [ 16 ]

147 голосов
/ 13 мая 2011

Чтобы строго ответить на вопрос: используйте invalidate ():

public void invalidate () С тех пор: Уровень API 1

Признать недействительным весь вид. Если представление является видимым, onDraw (Canvas) будет вызван в какой-то момент в будущем. Это должно быть вызвано из потока пользовательского интерфейса. Для вызова из не-пользовательского потока вызовите postInvalidate ().

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

Теперь, когда действие возобновляется, он заставляет каждый вид рисовать сам. Не нужно вызывать invalidate (). Чтобы применить тему, убедитесь, что вы делаете это до того, как будет нарисован любой вид, т.е. до setContentView(R.layout.mainscreen);

публичный void setTheme (int остаток) Начиная с: Уровень API 1

Установите базовую тему для этого контекста. Обратите внимание, что это следует вызывать до того, как будут созданы какие-либо представления в контексте (например, перед вызовом setContentView (View) или inflate (int, ViewGroup)).

Справочная информация по API приведена здесь: http://developer.android.com/reference/android/view/ContextThemeWrapper.html#setTheme%28int%29

Поскольку метод onDraw () работает с уже созданными экземплярами Views, setTheme работать не будет. У меня нет опыта работы с темами, но я могу подумать о двух альтернативных вариантах:

  1. вызовите setTheme в onCreate () вместо этого или
  2. повторить setContentView (R.layout.mainscreen); заставить восстановить все макет.
37 голосов
/ 13 мая 2011

Попробуйте getWindow().getDecorView().findViewById(android.R.id.content).invalidate();

31 голосов
/ 07 мая 2014

Попробуйте recreate(), это приведет к воссозданию этого занятия.

23 голосов
/ 03 ноября 2015

Решение:

Ребята, я перепробовал все ваши Решения, но они не сработали для меня, я должен установить setVisibility EditText на VISIBLE , и этот EditText должен быть виден тогда в ScrollView , но мне не удалось обновить корневой вид для вступления в силу. Я решил свою проблему, когда мне нужно обновить вид, поэтому я изменил видимость ScrollView на GONE, а затем снова установил его на VISIBLE, чтобы он вступил в силу, и это сработало для меня. Это не точное решение, но оно сработало.

 private void refreshView(){
    mScrollView.setVisibility(View.GONE);
    mScrollView.setVisibility(View.VISIBLE);
}
8 голосов
/ 30 ноября 2014

Вызов invalidate() или postInvalidate() в корневом макете явно НЕ гарантирует, что дочерние представления будут перерисованы.В моем конкретном случае мой корневой макет был TableLayout и имел несколько дочерних классов класса TableRow и TextView.Вызов postInvalidate(), или requestLayout(), или даже forceLayout() для корневого объекта TableLayout не привел к перерисовке каких-либо TextViews в макете.

Итак, в результате я рекурсивно анализировал макетдля этих TextView, а затем вызывая postInvalidate() для каждого из этих объектов TextView.

Код можно найти на GitHub: https://github.com/jkincali/Android-LinearLayout-Parser

7 голосов
/ 13 мая 2011

В противном случае вы можете попробовать это также -

ViewGroup vg = (ViewGroup) findViewById (R.id.videoTitleTxtView);
 vg.removeAllViews();
 vg.refreshDrawableState();
4 голосов
/ 27 февраля 2013

Попробуйте этот обходной путь для проблемы с темой:

@Override
public void onBackPressed() {
    NavUtils.navigateUpTo(this, new Intent(this,
            MyNeedToBeRefreshed.class));
}
4 голосов
/ 06 ноября 2011

Просто установите представление вашего контента в onresume

setContentView (R.layout.yourview) внутри onResume ..

Пример:

@Override
public void onResume(){
super.onResume();
setContentView(R.layout.activity_main); 
postIncomeTotals();
}
3 голосов
/ 06 января 2016
Intent intent = getIntent();
intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
finish();
startActivity(intent);

Это позволяет перезагрузить с изменениями темы и скрывает анимацию.

2 голосов
/ 07 мая 2014

У меня тоже была эта проблема, но, следуя указаниям Фархана по использованию setContentView(), я так и сделал.однако использование setContentView() само по себе было недостаточно.Я обнаружил, что должен был заселить все свои взгляды информацией.Чтобы исправить это, я просто извлек весь этот код в другой метод (я назвал его сборкой), а в своем методе onCreate я просто вызываю эту сборку.Теперь, когда происходит мое событие, я хочу, чтобы моя деятельность «обновлялась», я просто вызываю сборку, сообщаю ей новую информацию (которую я передаю в качестве параметров для сборки), и у меня появляется обновленная активность.

...