按下后不会返回上一个片段

时间:2014-09-25 20:58:04

标签: android android-fragments back-stack

我将片段事务添加到后台堆栈时遇到问题。我有一个Main活动,我在其中使用菜单片段填充我的布局:

public class MainActivity extends ActionBarActivity{

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    getFragmentManager().beginTransaction().add(R.id.frag_container, new MainMenuFragment()).commit();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();
    if (id == R.id.action_settings) {
        return true;
    }
    return super.onOptionsItemSelected(item);
}

}

然后,在MainMenuFragment中,用户选择一些选项,导致用其他片段替换菜单片段:

public class MainMenuFragment extends Fragment implements OnItemClickListener{
    GridView grid;
    FragmentManager manager;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View root = inflater.inflate(R.layout.main_menu_fragment, container, false);

    manager = getActivity().getFragmentManager();
    grid = (GridView) root.findViewById(R.id.gridView1);

    grid.setAdapter(new MenuTileAdapter(getActivity()));
    grid.setOnItemClickListener(this);

    return root;
}

@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
    FragmentTransaction trans = manager.beginTransaction();
    if (position == 0){
        trans.replace(R.id.frag_container, new BasicSettingsFragment());
        trans.addToBackStack(null);
        trans.commit();
    }
}

}

根据我的理解,这应该是这样的,当用户按下设备上的后退按钮时,它们将被带回菜单片段,但这会退出应用程序。我做错了什么?

4 个答案:

答案 0 :(得分:5)

活动覆盖:

@Override
public void onBackPressed() {
    if (getFragmentManager().getBackStackEntryCount() > 0) {
        getFragmentManager().popBackStack();
    } else {
        super.onBackPressed();
    }
}

可能你需要在每个提交的片段事务中使用:

FragmentTransaction.addToBackStack(null);

答案 1 :(得分:2)

您的代码是混合,您使用appcompat中的ActionBarActivity而不使用getSupportFragmentManager(),如果您决定使用它,则片段导入应该是appcompat。如果没有,请使用Activity而不是ActionBarActivity,并使用FragmentManager

导入简单的Fragment

将此添加到您的活动android:configChanges="keyboardHidden|orientation|screenSize" 这将阻止您的活动在旋转时重新启动。 在片段上使用setRetainInstance(true)

答案 2 :(得分:1)

您没有将MainMenuFragment添加到后台堆栈。您可以在活动中尝试这个:

getFragmentManager().beginTransaction().add(
R.id.frag_container, new MainMenuFragment()).
addToBackStack(null).commit();

答案 3 :(得分:0)

使用FragmentManager添加或替换片段时,您需要在调用addToBackStack()之前手动将旧片段添加到带有commit()的Backstack。