Как заставить весь макет просмотреть обновление?

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

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

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

Ответ 1

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

public void invalidate() Поскольку: Уровень API 1

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

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

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

public void setTheme (int остаток) Поскольку: Уровень API 1

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

Ссылка на документ API приведена здесь: http://developer.android.com/reference/android/view/ContextThemeWrapper.html#setTheme%28int%29

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

  • вызов setTheme в onCreate() вместо этого или
  • redo setContentView (R.layout.mainscreen); чтобы принудительно восстановить все макеты.

Ответ 2

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

Ответ 3

Попытайтесь recreate() это вызовет воссоздание этого Действия.

Ответ 4

Решение:

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

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

Ответ 5

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

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

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

Ответ 6

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

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

Ответ 7

Просто настройте просмотр содержимого в onresume

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

Пример:

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

Ответ 8

Попробуйте обходной путь для проблемы тематики:

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

Ответ 9

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

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

Ответ 11

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

Ответ 12

Я не знаю, безопасно это или нет, но это сработало для меня. Я сам столкнулся с этой проблемой и попробовал invalidate() и requestLayout(), но безрезультатно. Поэтому я просто позвонил мне onCreate(null) снова и снова. Если это небезопасно, пожалуйста, дайте мне знать. Надеюсь, это поможет кому-то там.

Ответ 13

Вот как я использовал Refresh my layout

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

Ответ 14

Не уверен, что это хороший подход, но я просто называю это каждый раз:

setContentView(R.layout.mainscreen);

Ответ 15

Чтобы очистить представление, расширяющее ViewGroup, вам просто нужно использовать метод removeAllViews()

Точно так же (если у вас есть ViewGroup под названием myElement):

myElement.removeAllViews()

Ответ 16

ответ: Вы можете обновить и заново создать мероприятие и сохранить данные, отправив их с помощью намерения.

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")

Ответ 17

Просто снова вызовите само действие, используя намерение. Например, чтобы обновить макет MainActivity, сделайте так:

startActivity(new Intent(MainActivity.this, MainActivity.class));