You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android中从其他页面返回时如何刷新Fragment数据?

问题:从其他页面返回时仅刷新Fragment数据而非重建整个Fragment

当前代码中,SettingsHomepageActivity仅在onCreate()中调用showFragment()加载TopLevelSettings Fragment。当SupportPreferenceController的数据更新后,用户返回该页面时,Activity进入onStart(),但Fragment未触发数据刷新逻辑。之前在onRestart()中调用recreate()会导致整个页面重建,不符合仅刷新数据的需求。


解决方案

方法1:利用Fragment生命周期方法触发刷新

Fragment从后台返回时会触发onStart()或onResume(),直接在这些方法中添加数据刷新逻辑即可:

public class TopLevelSettings extends Fragment {
    private SupportPreferenceController preferenceController;

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        preferenceController = use(SupportPreferenceController.class);
        preferenceController.setActivity(getActivity());
    }

    @Override
    public void onStart() {
        super.onStart();
        // 调用自定义的刷新方法
        refreshPreferenceData();
    }

    private void refreshPreferenceData() {
        // 执行数据刷新逻辑,比如重新加载控制器数据
        preferenceController.reloadData();
        
        // 如果是PreferenceFragmentCompat,可更新UI列表
        // if (getPreferenceScreen() != null) {
        //     getPreferenceScreen().notifyDataSetChanged();
        // }
    }
}

方法2:在Activity中主动调用Fragment刷新方法

在Activity的onResume()中获取已加载的Fragment实例,调用其公开的刷新方法:

修改Activity代码:

public class SettingsHomepageActivity extends FragmentActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        showFragment(new TopLevelSettings(), R.id.main_content);
    }
    
    @Override
    protected void onResume() {
        super.onResume();
        // 获取已加载的Fragment实例
        TopLevelSettings settingsFragment = (TopLevelSettings) getSupportFragmentManager().findFragmentById(R.id.main_content);
        if (settingsFragment != null) {
            settingsFragment.refreshPreferenceData();
        }
    }
    
    private void showFragment(Fragment fragment, int id) {
        final FragmentManager fragmentManager = getSupportFragmentManager();
        final FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        final Fragment showFragment = fragmentManager.findFragmentById(id);

        if (showFragment == null) {
            fragmentTransaction.add(id, fragment);
        } else {
            fragmentTransaction.show(showFragment);
        }
        fragmentTransaction.commit();
    }
}

在Fragment中公开刷新方法:

public class TopLevelSettings extends Fragment {
    private SupportPreferenceController preferenceController;

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        preferenceController = use(SupportPreferenceController.class);
        preferenceController.setActivity(getActivity());
    }

    // 公开给Activity调用的刷新方法
    public void refreshPreferenceData() {
        preferenceController.reloadData();
        // 根据需求更新对应的UI元素
    }
}

方法3:用LiveData实现数据驱动刷新(推荐)

通过LiveData监听SupportPreferenceController的数据变化,自动触发Fragment UI更新,无需依赖生命周期手动调用:

修改SupportPreferenceController:

public class SupportPreferenceController {
    // 用LiveData包装需要观察的数据
    private MutableLiveData<PreferenceData> preferenceData = new MutableLiveData<>();

    // 数据更新时调用此方法
    public void updatePreferenceData(PreferenceData newData) {
        preferenceData.setValue(newData);
    }

    public LiveData<PreferenceData> getPreferenceData() {
        return preferenceData;
    }

    // 原有业务方法...
}

在Fragment中观察数据变化:

public class TopLevelSettings extends Fragment {
    private SupportPreferenceController preferenceController;

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        preferenceController = use(SupportPreferenceController.class);
        preferenceController.setActivity(getActivity());
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        // 监听数据变化,自动刷新UI
        preferenceController.getPreferenceData().observe(getViewLifecycleOwner(), newData -> {
            updatePreferenceUI(newData);
        });
    }

    private void updatePreferenceUI(PreferenceData data) {
        // 根据新数据更新UI,比如修改Preference的摘要、值等
        // Preference examplePref = findPreference("example_key");
        // if (examplePref != null) {
        //     examplePref.setSummary(data.getExampleSummary());
        // }
    }
}

内容的提问来源于stack exchange,提问作者Shadow

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 20:05:10