リロード時にフラグメントを更新


110

Androidアプリケーションでは、DBからTableView内部にデータをロードしていますFragment。しかし、リロードするFragmentと、以前のデータが表示されます。Fragment以前のデータの代わりに現在のデータを再入力できますか?


コードを見せてください。データをどこにロードし、どこからフラグメントを開始し、どこに値を格納しますか?
AS

:これはあなたのporly説明し、問題解決する必要がありstackoverflow.com/questions/6503189/...
ベンジャミン・W.

詳細な情報コードスニペットを提供してください
nikvs 2013

アプリをスワイプして更新してみてください。こちらのstackoverflow.com/questions/41469040/fragment-refresh/…を
Imtiaz Mamun

回答:


207

私はあなたが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のメソッドが必要です。


3
これにより、次のエラーが発生します-java.lang.RuntimeException:結果ResultInfo {who = null、request = 2、result = 3、data = null}をアクティビティ{xont.virtusel.v4.controller / xont.virtusel.v4.controllerに配信できませんでした.sale.InvocieBrandActivity}:java.lang.IllegalStateException:onSaveInstanceStateの後でこのアクションを実行できません
Samantha Withanage

1
@Elizabethことを確認してくださいあなたの断片が正しく設定されたタグを持っている
Phantômaxx

1
@Rotwang返信ありがとうございます。長いコードを実行するのではなく、ショートカットを作成しましたが、これにより道が開けました:)
Si8

1
このソリューションは、新しいバージョンのsupport-v4-library(25.1.0)では機能しなくなりました。ここでの説明:stackoverflow.com/questions/41270858/...
BrahimのBouaboud

1
警告:このトリックは、サポートフラグメントを使用している場合にのみ、Oreoで機能します。
2018年

146

これにより、現在のフラグメントが更新されます。

FragmentTransaction ft = getFragmentManager().beginTransaction();
if (Build.VERSION.SDK_INT >= 26) {
   ft.setReorderingAllowed(false);
}
ft.detach(this).attach(this).commit();

1
このコードをどこに配置しますか?内部活動またはフラグメント自体?
Narendra Singh

2
更新する必要のあるフラグメント内に配置します。
Mbengue Assane

1
@SagarChavadaどこにコードを入れましたか?データが更新されるときなど、1回限りのイベントに配置する必要があります。
Mbengue Assane 2016

5
再帰、再帰、無限の呼び出し
zulkarnain shah 2017

2
これを使用すると、フラグメントのonResume内でループが発生します。これを回避するにはどうすればよいですか?
ソウル

32

フラグメントタグがない場合は、次のコードがうまく機能します。

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();}
}

1
フラグメントIDはどうなるか、フラグメントIDはどこにも宣言していません。どこでどのように宣言するのですか?
Narendra Singh、

getActivity()アクティビティで使用できないようです。使用する必要がありますActivity.this...か?
Si8 2016年

@NarendraJiこれはFrameLayout IDであり、フラグメントをコンテナーに配置する場所です。
ロケシュ

その余分なブレースを削除してください。それは私に多くのトラブルを引き起こしました。
アビシェク

9

ユーザーに表示されているときにフラグメントを更新できます。フラグメントにこのコードを追加するだけで、表示されているときにフラグメントが更新されます。

@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");
    }
}

リロードするまでに3秒かかります
オマールボシュラ

これは、viewpagerアダプターでうまく機能しているようです
DragonFire

2
setUserVisibleHintのサポートは終了しました
Sai Aditya

解決策をありがとう、私のために働いた。
hetsgandhi

7

フラグメントを更新しても、回答は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();
    }

5

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を参照してください。


2
明確な説明で回答を提供してください。コードを書かないでください。共有したコードについて説明してください。そうすれば、他の人も理解でき、役に立ちます。Stack Overflowを効果的に使用するために、FAQセクションをお読みください。
Sankar Ganesh 2017

3
   MyFragment fragment = (MyFragment) getSupportFragmentManager().findFragmentByTag(FRAGMENT_TAG);
        getSupportFragmentManager().beginTransaction().detach(fragment).attach(fragment).commit();

これはFragmentManager、フラグメントの初期化に使用した場合にのみ機能します。<fragment ... />XML としてそれを持っている場合、それはonCreateView再び呼び出されません。これを理解するために私の30分を無駄にしました。


1

ここで私がやったことと私のために働いた私は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()
        }
    }

}

0

を使用ContentProviderし、「CursorLoader」を使用してデータをロードします。このアーキテクチャでは、データベースの変更時にデータが自動的に再ロードされます。あなたのためにサードパーティのフレームワークを使用してくださいContentProvider-あなたは本当に自分でそれを実装したくありません...


0

私は同じ問題を抱えていましたが、上記のどれも私のものではうまくいきませんでした。バックスタックの問題があったか(ユーザーが押したときにロードした後、同じフラグメントに再び移動する可能性があります)またはそれを呼び出しませんでした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も必要ないことです。リロードしたい場合



0
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();
}

-2
protected void onResume() {
        super.onResume();
        viewPagerAdapter.notifyDataSetChanged();
    }

viewpagerAdapter.notifyDataSetChanged();と書きます。MainActivityのonResume()で。幸運を :)


-2

最も簡単な方法

viewpager.setAdapterを含むpublic staticメソッドを作成します

アダプターとビューページャーを静的にする

public static void refreshFragments(){
        viewPager.setAdapter(adapter);
    }

どこでも、どんな活動でも、どんな断片でも呼んでください。

MainActivity.refreshFragments();
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.