Androidアプリケーションでは、DBからTableView
内部にデータをロードしていますFragment
。しかし、リロードするFragment
と、以前のデータが表示されます。Fragment
以前のデータの代わりに現在のデータを再入力できますか?
Androidアプリケーションでは、DBからTableView
内部にデータをロードしていますFragment
。しかし、リロードするFragment
と、以前のデータが表示されます。Fragment
以前のデータの代わりに現在のデータを再入力できますか?
回答:
私はあなたがdbの更新時にフラグメントの内容を更新したいと思います
その場合は、フラグメントをデタッチして再アタッチします
// Reload current fragment
Fragment frg = null;
frg = getSupportFragmentManager().findFragmentByTag("Your_Fragment_TAG");
final FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.detach(frg);
ft.attach(frg);
ft.commit();
Your_Fragment_TAGは、フラグメントを作成したときにフラグメントに付けた名前です
このコードはサポートライブラリ用です。
古いデバイスをサポートしていない場合は、getSupportFragmentManagerではなくgetFragmentManagerを使用してください。
[編集]
このメソッドでは、フラグメントにタグが必要です。
持っていない場合は、@ Hammerのメソッドが必要です。
これにより、現在のフラグメントが更新されます。
FragmentTransaction ft = getFragmentManager().beginTransaction();
if (Build.VERSION.SDK_INT >= 26) {
ft.setReorderingAllowed(false);
}
ft.detach(this).attach(this).commit();
フラグメントタグがない場合は、次のコードがうまく機能します。
Fragment currentFragment = getActivity().getFragmentManager().findFragmentById(R.id.fragment_container);
if (currentFragment instanceof "NAME OF YOUR FRAGMENT CLASS") {
FragmentTransaction fragTransaction = (getActivity()).getFragmentManager().beginTransaction();
fragTransaction.detach(currentFragment);
fragTransaction.attach(currentFragment);
fragTransaction.commit();}
}
getActivity()
アクティビティで使用できないようです。使用する必要がありますActivity.this...
か?
ユーザーに表示されているときにフラグメントを更新できます。フラグメントにこのコードを追加するだけで、表示されているときにフラグメントが更新されます。
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser) {
// Refresh your fragment here
getFragmentManager().beginTransaction().detach(this).attach(this).commit();
Log.i("IsRefresh", "Yes");
}
}
フラグメントを更新しても、回答はNougat以降のバージョンでは機能しません。すべてのOSで機能させるには、次のようにします。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
fragmentManager.beginTransaction().detach(this).commitNow();
fragmentManager.beginTransaction().attach(this).commitNow();
} else {
fragmentManager.beginTransaction().detach(this).attach(this).commit();
}
「Fragment Already Added
」例外が発生するアクティビティに接続されている間は、フラグメントを再ロードできません。
したがって、フラグメントは最初にそのアクティビティから切り離され、次に接続される必要があります。すべて1行でFluent APIを使用して実行できます。
getFragmentManager().beginTransaction().detach(this).attach(this).commit();
更新: これは、API 26以上に加えられた変更を組み込むためのものです。
FragmentTransaction transaction = mActivity.getFragmentManager()
.beginTransaction();
if (Build.VERSION.SDK_INT >= 26) {
transaction.setReorderingAllowed(false);
}
transaction.detach(this).attach
(this).commit();
アップデートの詳細については、https://stackoverflow.com/a/51327440/4514796を参照してください。
MyFragment fragment = (MyFragment) getSupportFragmentManager().findFragmentByTag(FRAGMENT_TAG);
getSupportFragmentManager().beginTransaction().detach(fragment).attach(fragment).commit();
これはFragmentManager
、フラグメントの初期化に使用した場合にのみ機能します。<fragment ... />
XML としてそれを持っている場合、それはonCreateView
再び呼び出されません。これを理解するために私の30分を無駄にしました。
ここで私がやったことと私のために働いた私はfirebaseを使用しています、そしてユーザーがログインしているとき私は最初に現在のフラグメントをリフレッシュしたいと思いました私が使用してKotlin言語で作業したコードは、Javaクラスでも同じように使用できると思います
override fun setUserVisibleHint(isVisibleToUser: Boolean) {
super.setUserVisibleHint(isVisibleToUser)
val context = requireActivity()
if (auth.currentUser != null) {
if (isVisibleToUser){
context.supportFragmentManager.beginTransaction().detach(this).attach(this).commit()
}
}
}
を使用ContentProvider
し、「CursorLoader」を使用してデータをロードします。このアーキテクチャでは、データベースの変更時にデータが自動的に再ロードされます。あなたのためにサードパーティのフレームワークを使用してくださいContentProvider
-あなたは本当に自分でそれを実装したくありません...
私は同じ問題を抱えていましたが、上記のどれも私のものではうまくいきませんでした。バックスタックの問題があったか(ユーザーが押したときにロードした後、同じフラグメントに再び移動する可能性があります)またはそれを呼び出しませんでしたonCreaetView
最後に私はこれをしました:
public void transactFragment(Fragment fragment, boolean reload) {
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
if (reload) {
getSupportFragmentManager().popBackStack();
}
transaction.replace(R.id.main_activity_frame_layout, fragment);
transaction.addToBackStack(null);
transaction.commit();
}
良い点は、フラグメントのタグやIDも必要ないことです。リロードしたい場合
フラグメントアクティビティとフラグメントを保持するアクティビティの両方でonResumeメソッドを使用します。
getActivity().getSupportFragmentManager().beginTransaction().replace(GeneralInfo.this.getId(), new GeneralInfo()).commit();
GeneralInfo
それは私のFragmentクラスです GeneralInfo.java
私はそれをフラグメントクラスのメソッドとして配置しました。
public void Reload(){
getActivity().getSupportFragmentManager().beginTransaction().replace(LogActivity.this.getId(), new LogActivity()).commit();
}
最も簡単な方法
viewpager.setAdapterを含むpublic staticメソッドを作成します
アダプターとビューページャーを静的にする
public static void refreshFragments(){
viewPager.setAdapter(adapter);
}
どこでも、どんな活動でも、どんな断片でも呼んでください。
MainActivity.refreshFragments();