web-dev-qa-db-ja.com

レイアウト全体を強制的に更新する方法

Activity.onResume()メソッドを使用して、メインのレイアウトリソースビューを強制的に再描画/更新します。これどうやってするの ?

メインレイアウトビューでは、次のようにActivity.onCreate()で呼び出されるもの(以下のR.layout.mainscreen)を意味します。

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

厳密に質問に答えるには:invalidate()を使用します。

public void invalidate()導入日:APIレベル1

ビュー全体を無効にします。ビューが表示されている場合は、将来的にonDraw(Canvas)が呼び出されます。これはUIスレッドから呼び出す必要があります。非UIスレッドから呼び出すには、postInvalidate()を呼び出します。

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

これで、アクティビティが再開すると、すべてのビューが自分自身を描画するようになります。 invalidate()を呼び出す必要はありません。テーマを適用するには、ビューを描画する前、つまりsetContentView(R.layout.mainscreen);の前に必ずテーマを適用してください。

public void setTheme(int resid)導入日:APIレベル1

このコンテキストの基本テーマを設定してください。これは、コンテキスト内でビューがインスタンス化される前に(たとえば、setContentView(View)またはinflate(int、ViewGroup)を呼び出す前に)呼び出される必要があることに注意してください。

APIドキュメントの参照先はこちらです。 http://developer.Android.com/reference/Android/view/ContextThemeWrapper.html#setTheme%28int%29

OnDraw()メソッドはすでにインスタンス化されているビューに対して機能するため、setThemeは機能しません。私は自分自身でテーマに関する経験がありませんが、私が考えることができる2つの代替選択肢があります:

  1. 代わりにonCreate()でsetThemeを呼び出してください。
  2. setContentView(R.layout.mainscreen)をやり直します。すべてのレイアウトを強制的に再インスタンス化します。
146
Aleadam

getWindow().getDecorView().findViewById(Android.R.id.content).invalidate();を試す

37
keyboardsurfer

recreate()を試すと、このアクティビティが再作成されます。

31

解決策:

みんな私はあなたの解決策のすべてを試してみたが、それらは私のために働いていなかった、私はVISIBLE setVisibility を設定しなければならないEditTextは ScrollView に表示されるはずですが、ルートビューを更新して有効にすることができませんでした。 ScrollViewの表示設定をGONEに変更してから再度有効にするためにVISIBLEに設定したため、ビューを更新する必要があるときに、問題を解決しました。これは正確な解決策ではありませんが、それだけでうまくいきました。

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

ルートレイアウトでinvalidate()またはpostInvalidate()を呼び出しても、子ビューが再描画されることは保証されません。私の特定のケースでは、私のルートレイアウトはTableLayoutであり、クラスTableRowとTextViewのいくつかの子を持っていました。ルートのTableLayoutオブジェクトでpostInvalidate()requestLayout()、さらにはforceLayout()を呼び出しても、レイアウト内のTextViewが再描画されませんでした。

そのため、最終的にレイアウトを再帰的に解析してそれらのTextViewを探し、次にそれらの各TextViewオブジェクトに対してpostInvalidate()を呼び出しました。

コードはGitHubで見つけることができます: https://github.com/jkincali/Android-LinearLayout-Parser

8
jkincali

そうでなければあなたもこれを試すことができます -

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

コンテンツビューをonresumeに設定するだけです

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

例:

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

テーマの問題に対してこの回避策を試してください。

@Override
public void onBackPressed() {
    NavUtils.navigateUpTo(this, new Intent(this,
            MyNeedToBeRefreshed.class));
}
4
Krilivye
Intent intent = getIntent();
intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
finish();
startActivity(intent);

これにより、テーマの変更をリロードしてアニメーションを非表示にすることができます。

3
Codeversed

私もこの問題を抱えていましたが、setContentView()を使うというファルハンの指導に従って、私はちょうどそれをしました。 setContentView()を単独で使用するだけでは不十分です。私は自分の見解すべてに情報を入れ直す必要があることに気づきました。これを修正するために、私はそのコードのすべてを別のメソッド(私はそれをbuildと呼びます)に取り出し、そして私のonCreateメソッドの中で私は単にそのbuildと呼びます。イベントが発生したときに自分のアクティビティを「更新」したい場合は、単にbuildと呼び、新しい情報(ビルド用のパラメータとして渡します)を渡してください。更新されたアクティビティがあります。

2
user3612162

これは 知られているバグ のようです。

2
Ben Williams

これは私がレイアウトを更新するのに使用した方法です

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

これが安全かどうかはわかりませんが、うまくいきました。私はちょっと私自身がこの問題に遭遇してinvalidate()requestLayout()を試しましたが、役に立ちませんでした。だから私はちょうど私のonCreate(null)をもう一度呼び出して、それはうまくいった。これが危険な場合は私に知らせてください。これが誰かに役立つことを願っています。

0
Cai

ViewGroupを拡張するビューをクリアするには、メソッドremoveAllViews()を使用するだけです

このように(myElementというViewGroupがある場合):

myElement.removeAllViews()
0
Jack'

それが良いアプローチであるかどうかわからないが、私はただこれを毎回呼ぶだけだ:

setContentView(R.layout.mainscreen);
0
Krzysztof Tkacz