我在Android中面临两个片段问题。
我的MainActivity中有一个带有导航抽屉片段的应用。当我单击此导航抽屉上的项目时,将在主活动内的“fragment_placeholder”上加载一个新片段。很简单。
创建MainActivity时,我在fragment_placeholder中加载“homeFragment”。这个片段有一个带有两个选项卡的SlidingTabLayout,每个选项卡都加载了相应的片段。这个Home Fragment是我应用程序的“主要”部分。
当我点击导航抽屉中的另一个项目时,主页片段将替换为另一个片段,例如,当我点击“我的帐户”时,“我的帐户片段”将加载到fragment_placeholder上。我在导航抽屉里有3个itens。
我想将Home Fragment(及其中的两个标签/片段)保留在后台堆栈上,这样我就可以浏览任何片段(我的帐户,配置等),当我按下后退按钮时,我我回到Home Fragment。
我尝试在MainActivity的onCreate中添加ToBackStack Home Fragment(在我提交之前),但是无法正常工作。如果我按导航抽屉上的“我的帐户”项,然后按回来,应用程序再次加载“我的帐户”片段,如果我再次按下,应用程序将关闭。另一种情况:如果我按“Home”项,然后按回来,应用程序返回到相同的主片段但没有任何标签(它没有加载属于他的两个片段)。
这是我的应用:
这是我的代码: MainActivity
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);
}
谢谢你,对不起我的英语。
答案 0 :(得分:0)
我找到了一个解决方案,基于这个答案https://stackoverflow.com/a/14588642/1959257
我将代码更改为:
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();
}
}