我对android编程很新,所以请耐心等待。我已经尝试过搜索SO,tutorialspoint,大书呆子牧场等等,但我没有找到/理解这一点:在用户按下主页或概述按钮后,如何使片段保持不变?例如:
我在活动中有两个片段A和B,其中有一个切换按钮可在两个片段之间切换。默认情况下,创建活动时,片段A会在屏幕上加载。如果我切换到片段B并按下主页或概述然后返回到应用程序,则会显示片段A.我理解它为什么显示,但我不明白的是如何显示片段B.
我已经阅读过backstack,savedInstanceState和setRetainInstance(以及其他几个),但是还没有弄明白。
我在两个片段中都覆盖了onAttach(Context context)
,onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState)
和onViewCreated(View view, Bundle savedInstanceState)
,并在我的活动中覆盖了onStart()
和onCreate(Bundle savedInstanceState)
。
片段:
@Override
public void onAttach(Context context) {
this.context = context;
faContext = (FragmentActivity) context;
super.onAttach(context);
}// end onAttach(Activity activity)
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) {
Bundle bundle = this.getArguments();
if(bundle != null) {
String bundleAdminId = getString(R.string.bundle_admin_name);
adminName = bundle.getString(bundleAdminId);
}
else {
Log.d("BUNDLE_Profile", "bundle is null");
}
// Defines the xml file for the fragment
return inflater.inflate(R.layout.fragment_profile, parent, false);
}// end onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState)
onViewCreated
只有按钮事件处理程序
活性:
@Override
public void onStart() {
super.onStart();
// start the home fragment
createFragment(new HomeFragment(), R.id.frag_container);
// update the local storage
}// end onStart()
private void createFragment(Fragment fragment, int fragContainerId) {
// make sure the passed fragment isn't null
if(fragment != null) {
FragmentTransaction ft = faContext.getSupportFragmentManager().beginTransaction();
ft.replace(fragContainerId, fragment);
ft.commit();
}
}// end createFragment(Fragment fragment)`
onCreate
也有按钮处理程序
答案 0 :(得分:2)
使用标签打开片段。尝试此功能
public void openNewFragment(Fragment f, String tag) {
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
Fragment fragment = getSupportFragmentManager().findFragmentByTag(tag);
{
if (fragment != null) {
if (currentFragment != null) {
if (fragment.getClass().equals(currentFragment.getClass())) {
drawerLayout.closeDrawers();
return;
}
}
ft.show(fragment);
ft.hide(currentFragment);
currentFragment = fragment;
} else {
if (currentFragment != null)
ft.hide(currentFragment);
ft.add(R.id.container, f, tag);
currentFragment = f;
}
ft.commit();
}
}
在此功能中,您必须提供片段名称及其标记。
答案 1 :(得分:1)
显然,活动进入停止模式并在一段时间后从家返回活动时开始。可能是因为资源从内存中释放出来。
要更好地了解这一点,只需尝试使用片段b并立即进行主页按下并再次通过最近的应用部分返回应用并查看行为。
此外,如果问题是我上面所说的那么..试试
像这样......
onStart(){
if(fragmentManager.getFragmentByTag("String tag")== null){
createFragment();
}
}
尝试告诉我这是否有用。
答案 2 :(得分:1)
除非存储,否则在重新启动应用程序时无法保留片段位置。因此,有一种方法可以在片段之间切换时,将片段的当前位置存储在共享首选项中。重新启动应用程序时,读取先前存储的片段位置并在切换时更新SharedPreferences值。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
sharedPreferences = getSharedPreferences("fragmentPosition",MODE_PRIVATE);
if(sharedPreferences.getInt("position",0)==1) loadFragmentOne();
else loadFragmentTwo();
}
public void onToggleMethod(){
if(currentToggle ==1){
LoadFragmentTwo();
UpdateSharedPreference();
}
else{
loadFragmentOne();
UpdateSharedPreference();
}
}
答案 3 :(得分:1)
尝试更改onStart方法,如下所示,
@Override
public void onStart() {
super.onStart();
// start the home fragment
if(faContext.getSupportFragmentManager().findFragmentById(R.id.frag_container) == null) {
createFragment(new HomeFragment(), R.id.frag_container);
}
// update the local storage
}// end onStart()