Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/184.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 返回到上一个片段无法正常工作_Android_Android Fragments_Back - Fatal编程技术网

Android 返回到上一个片段无法正常工作

Android 返回到上一个片段无法正常工作,android,android-fragments,back,Android,Android Fragments,Back,我正在使用一个导航抽屉,当我选择一个项目时,它会正确地将上一个片段替换为我选择的片段,但是如果我打开另一个片段,然后单击“上一步”按钮,它会转到上一个活动而不是上一个片段,它这样做有什么不对 private void selectItem(int position) { Fragment newFragment; FragmentTransaction transaction = getFragmentManager().beginTransaction(); switc

我正在使用一个导航抽屉,当我选择一个项目时,它会正确地将上一个片段替换为我选择的片段,但是如果我打开另一个片段,然后单击“上一步”按钮,它会转到上一个活动而不是上一个片段,它这样做有什么不对

private void selectItem(int position) {
    Fragment newFragment;
    FragmentTransaction transaction = getFragmentManager().beginTransaction();
    switch (position){
        case 0:
            //Update
            newFragment = new UpdateFragment();
            transaction.replace(R.id.content_frame, newFragment);
            transaction.addToBackStack(null);
            transaction.commit();
            listView.setItemChecked(position, true);
            setTitle(navigationDrawerItems[position]);
            break;
        case 1:
            //Maps
            newFragment = new TimetableFragment();
            transaction.replace(R.id.content_frame, newFragment);
            transaction.addToBackStack(null);
            transaction.commit();
            listView.setItemChecked(position, true);
            setTitle(navigationDrawerItems[position]);
            break;
        case 2:
            //Timetables
            newFragment = new TimetableFragment();
            transaction.replace(R.id.content_frame, newFragment);
            transaction.addToBackStack(null);
            transaction.commit();
            listView.setItemChecked(position, true);
            setTitle(navigationDrawerItems[position]);
            break;
        case 3:
            //Notes
            newFragment = new TimetableFragment();
            transaction.replace(R.id.content_frame, newFragment);
            transaction.addToBackStack(null);
            transaction.commit();
            listView.setItemChecked(position, true);
            setTitle(navigationDrawerItems[position]);
            break;
        case 4:
            //About
            newFragment = new AboutFragment();
            transaction.replace(R.id.content_frame, newFragment);
            transaction.addToBackStack(null);
            transaction.commit();
            listView.setItemChecked(position, true);
            setTitle(navigationDrawerItems[position]);
            break;
        case 5:
            //Settings
            newFragment = new SettingsFragment();
            transaction.replace(R.id.content_frame, newFragment);
            transaction.addToBackStack(null);
            transaction.commit();
            listView.setItemChecked(position, true);
            setTitle(navigationDrawerItems[position]);
            break;
    }
    //listView.setItemChecked(position, true);
    //setTitle(navigationDrawerItems[position]);
    drawerLayout.closeDrawer(listView);
}

您正在将null添加到backbackback-

transaction.addToBackStack(null);
将此空值替换为片段的标记名


它会起作用。

您可以在
onBackPressed
中使用
getFragmentManager().popBackStack()
方法:

@Override
public void onBackPressed() {
    if (getFragmentManager().getBackStackEntryCount() > 0) {
         getFragmentManager().popBackStack();
         getFragmentManager().beginTransaction().commit();
    }
    else {
        super.onBackPressed();
    }
}
不要忘记在BackStack中添加片段,如:

transaction.addToBackStack(null);
编辑: 要在actionbar中显示当前片段名称,您可以在FragmentActivity的
onResume
上获取它:

@Override
protected void onResume() {
    // TODO Auto-generated method stub
    super.onResume();

    FragmentManager fragManager = this.getSupportFragmentManager();
    int count = this.getSupportFragmentManager().getBackStackEntryCount();

    // Fetch last fragment
    Fragment fragment = fragManager.getFragments().get(count>0?count-1:count);

    // Check with your possible Fragment class
    if( fragment instanceof OneFragment)
    {
        setTitle("OneFragment");
    }
    else if(fragment instanceof TwoFragment)
    {
        setTitle("TwoFragment");
    }
}

希望能有帮助ツ

不,您可以将null设置为该方法。不管它是否为空。根据文档,为了记住交易,我们将把它添加到backstack-如果你在这里设置为空,它将向backstack添加片段,如果你设置字符串,它也将向backstack添加片段。这很好,尽管当我按下后退按钮时,我的活动标题确实反映了从Backback加载的当前片段?@MysticMagic这很好,尽管当我按下back按钮时,“我的活动”的标题确实反映了从后台加载的当前片段?是否要反映名称?我希望在再次加载旧片段时更改工具栏标题。我通常使用这个设置标题(导航[position]);但那是在交换机内部,所以它不会被调用@sweetwiser您可以在
onResume
中获取当前片段,并相应地设置标题