Activity.onResume()メソッドを使用して、メインのレイアウトリソースビューを強制的に再描画/更新します。これどうやってするの ?
メインレイアウトビューでは、次のようにActivity.onCreate()で呼び出されるもの(以下のR.layout.mainscreen)を意味します。
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.mainscreen);
}
厳密に質問に答えるには: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つの代替選択肢があります:
getWindow().getDecorView().findViewById(Android.R.id.content).invalidate();
を試す
recreate()
を試すと、このアクティビティが再作成されます。
解決策:
みんな私はあなたの解決策のすべてを試してみたが、それらは私のために働いていなかった、私はVISIBLEに setVisibility を設定しなければならないEditTextは ScrollView に表示されるはずですが、ルートビューを更新して有効にすることができませんでした。 ScrollViewの表示設定をGONEに変更してから再度有効にするためにVISIBLEに設定したため、ビューを更新する必要があるときに、問題を解決しました。これは正確な解決策ではありませんが、それだけでうまくいきました。
private void refreshView(){
mScrollView.setVisibility(View.GONE);
mScrollView.setVisibility(View.VISIBLE);
}
ルートレイアウトでinvalidate()
またはpostInvalidate()
を呼び出しても、子ビューが再描画されることは保証されません。私の特定のケースでは、私のルートレイアウトはTableLayoutであり、クラスTableRowとTextViewのいくつかの子を持っていました。ルートのTableLayoutオブジェクトでpostInvalidate()
、requestLayout()
、さらにはforceLayout()
を呼び出しても、レイアウト内のTextViewが再描画されませんでした。
そのため、最終的にレイアウトを再帰的に解析してそれらのTextViewを探し、次にそれらの各TextViewオブジェクトに対してpostInvalidate()
を呼び出しました。
コードはGitHubで見つけることができます: https://github.com/jkincali/Android-LinearLayout-Parser
そうでなければあなたもこれを試すことができます -
ViewGroup vg = (ViewGroup) findViewById (R.id.videoTitleTxtView);
vg.removeAllViews();
vg.refreshDrawableState();
コンテンツビューをonresumeに設定するだけです
onResume内のsetContentView(R.layout.yourview)..
例:
@Override
public void onResume(){
super.onResume();
setContentView(R.layout.activity_main);
postIncomeTotals();
}
テーマの問題に対してこの回避策を試してください。
@Override
public void onBackPressed() {
NavUtils.navigateUpTo(this, new Intent(this,
MyNeedToBeRefreshed.class));
}
Intent intent = getIntent();
intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
finish();
startActivity(intent);
これにより、テーマの変更をリロードしてアニメーションを非表示にすることができます。
私もこの問題を抱えていましたが、setContentView()
を使うというファルハンの指導に従って、私はちょうどそれをしました。 setContentView()
を単独で使用するだけでは不十分です。私は自分の見解すべてに情報を入れ直す必要があることに気づきました。これを修正するために、私はそのコードのすべてを別のメソッド(私はそれをbuildと呼びます)に取り出し、そして私のonCreate
メソッドの中で私は単にそのbuildと呼びます。イベントが発生したときに自分のアクティビティを「更新」したい場合は、単にbuildと呼び、新しい情報(ビルド用のパラメータとして渡します)を渡してください。更新されたアクティビティがあります。
これは 知られているバグ のようです。
これは私がレイアウトを更新するのに使用した方法です
Intent intent = getIntent();
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_NO_ANIMATION);
finish();
startActivity(intent);
これが安全かどうかはわかりませんが、うまくいきました。私はちょっと私自身がこの問題に遭遇してinvalidate()
とrequestLayout()
を試しましたが、役に立ちませんでした。だから私はちょうど私のonCreate(null)
をもう一度呼び出して、それはうまくいった。これが危険な場合は私に知らせてください。これが誰かに役立つことを願っています。
ViewGroupを拡張するビューをクリアするには、メソッドremoveAllViews()
を使用するだけです
このように(myElement
というViewGroupがある場合):
myElement.removeAllViews()
それが良いアプローチであるかどうかわからないが、私はただこれを毎回呼ぶだけだ:
setContentView(R.layout.mainscreen);