Как заставить весь макет просмотреть обновление?
Я хочу заставить представление ресурса основного макета перерисовать/обновить, скажем, метод 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);
Это позволяет перезагружать изменения темы и скрывать анимации.
Ответ 10
Это, по-видимому, известная ошибка.
Ответ 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));