片段 addToBackStack 行为
Fragment addToBackStack behaviour
我在 Android 中遇到两个片段问题。
我的 MainActivity 中有一个带有 Navigation Drawer Fragment 的应用程序。当我单击此导航抽屉上的一个项目时,一个新片段将加载到 Main Activity 内的 "fragment_placeholder" 上。很简单。
创建 MainActivity 时,我正在 fragment_placeholder 中加载 "homeFragment"。该片段有一个带有两个选项卡的 SlidingTabLayout,每个选项卡加载它对应的片段。这个主页片段是我的 "main" 应用程序的一部分。
当我点击 Navigation Drawer 中的另一个项目时,Home Fragment 被替换为另一个 Fragment,例如,当我点击 "My account" 时,"My account fragment" 加载到 fragment_placeholder.我在导航抽屉中有 3 个项目。
我想将 Home Fragment(以及其中的两个 tabs/fragments)保留在返回堆栈中,这样我就可以在任何片段(我的帐户、配置等)上导航,并在我按下返回键时导航按钮,我要回到 Home Fragment。
我尝试在 MainActivity 的 onCreate 中添加 ToBackStack Home Fragment(在我提交之前),但无法正常工作。如果我按下导航抽屉上的 "My account" 项,然后按下后退,应用程序会再次加载 "My account" 片段,如果我再次按下后退,应用程序将关闭。另一种情况:如果我按下 "Home" 项,然后按下返回,应用程序返回到同一个主页片段但没有任何选项卡(它没有加载属于他的两个片段)。
这是我的应用程序:
这是我的代码:
主要Activity
public class MainActivity extends ActionBarActivity {
private Toolbar mToolbar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setupDrawer();
// Loading home fragment
if (findViewById(R.id.fragment_placeholder) != null) {
if (savedInstanceState != null) {
return;
}
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
HomeFragment homeFragment = new HomeFragment();
homeFragment.setArguments(getIntent().getExtras());
fragmentTransaction.replace(R.id.fragment_placeholder, homeFragment);
fragmentTransaction.addToBackStack(null); // This is not working properly
fragmentTransaction.commit();
}
}
导航抽屉:itemClicked 方法
@Override
public void itemClicked(View view, int position) {
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
switch(position)
{
// Home
case 0:
HomeFragment homeFragment = new HomeFragment();
fragmentTransaction.replace(R.id.fragment_placeholder, homeFragment);
break;
// My account
case 1:
MyAccountFragment myAccountFragment = new MyAccountFragment();
fragmentTransaction.replace(R.id.fragment_placeholder, myAccountFragment);
break;
// Config
case 2:
ConfigFragment configFragment = new ConfigFragment();
fragmentTransaction.replace(R.id.fragment_placeholder, configFragment );
break;
}
fragmentTransaction.commit();
mDrawerLayout.closeDrawer(mDrawerListView);
}
谢谢你,对不起我的英语。
我根据这个答案找到了解决方案
我将代码更改为:
public void onBackPressed() {
HomeFragment homeFragment = new HomeFragment();
displayFragment(homeFragment);
}
private void displayFragment(Fragment pFragment) {
// Fragment currently inside the placeholder view
Fragment fr = (Fragment) getSupportFragmentManager()
.findFragmentById(R.id.fragment_placeholder);
// If this fragment is a HomeFragment, close app
if (fr instanceof HomeFragment) {
finish();
}
else {
// Replace curretly Fragment by HomeFragment
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.fragment_placeholder, pFragment);
ft.commit();
}
}
我在 Android 中遇到两个片段问题。
我的 MainActivity 中有一个带有 Navigation Drawer Fragment 的应用程序。当我单击此导航抽屉上的一个项目时,一个新片段将加载到 Main Activity 内的 "fragment_placeholder" 上。很简单。
创建 MainActivity 时,我正在 fragment_placeholder 中加载 "homeFragment"。该片段有一个带有两个选项卡的 SlidingTabLayout,每个选项卡加载它对应的片段。这个主页片段是我的 "main" 应用程序的一部分。
当我点击 Navigation Drawer 中的另一个项目时,Home Fragment 被替换为另一个 Fragment,例如,当我点击 "My account" 时,"My account fragment" 加载到 fragment_placeholder.我在导航抽屉中有 3 个项目。
我想将 Home Fragment(以及其中的两个 tabs/fragments)保留在返回堆栈中,这样我就可以在任何片段(我的帐户、配置等)上导航,并在我按下返回键时导航按钮,我要回到 Home Fragment。
我尝试在 MainActivity 的 onCreate 中添加 ToBackStack Home Fragment(在我提交之前),但无法正常工作。如果我按下导航抽屉上的 "My account" 项,然后按下后退,应用程序会再次加载 "My account" 片段,如果我再次按下后退,应用程序将关闭。另一种情况:如果我按下 "Home" 项,然后按下返回,应用程序返回到同一个主页片段但没有任何选项卡(它没有加载属于他的两个片段)。
这是我的应用程序:
这是我的代码: 主要Activity
public class MainActivity extends ActionBarActivity {
private Toolbar mToolbar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setupDrawer();
// Loading home fragment
if (findViewById(R.id.fragment_placeholder) != null) {
if (savedInstanceState != null) {
return;
}
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
HomeFragment homeFragment = new HomeFragment();
homeFragment.setArguments(getIntent().getExtras());
fragmentTransaction.replace(R.id.fragment_placeholder, homeFragment);
fragmentTransaction.addToBackStack(null); // This is not working properly
fragmentTransaction.commit();
}
}
导航抽屉:itemClicked 方法
@Override
public void itemClicked(View view, int position) {
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
switch(position)
{
// Home
case 0:
HomeFragment homeFragment = new HomeFragment();
fragmentTransaction.replace(R.id.fragment_placeholder, homeFragment);
break;
// My account
case 1:
MyAccountFragment myAccountFragment = new MyAccountFragment();
fragmentTransaction.replace(R.id.fragment_placeholder, myAccountFragment);
break;
// Config
case 2:
ConfigFragment configFragment = new ConfigFragment();
fragmentTransaction.replace(R.id.fragment_placeholder, configFragment );
break;
}
fragmentTransaction.commit();
mDrawerLayout.closeDrawer(mDrawerListView);
}
谢谢你,对不起我的英语。
我根据这个答案找到了解决方案
我将代码更改为:
public void onBackPressed() {
HomeFragment homeFragment = new HomeFragment();
displayFragment(homeFragment);
}
private void displayFragment(Fragment pFragment) {
// Fragment currently inside the placeholder view
Fragment fr = (Fragment) getSupportFragmentManager()
.findFragmentById(R.id.fragment_placeholder);
// If this fragment is a HomeFragment, close app
if (fr instanceof HomeFragment) {
finish();
}
else {
// Replace curretly Fragment by HomeFragment
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.fragment_placeholder, pFragment);
ft.commit();
}
}