【问题标题】:Pressing back does not return to previous fragment按返回不会返回上一个片段
【发布时间】:2014-09-25 20:58:03
【问题描述】:

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

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();
    }
}

}

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

【问题讨论】:

  • 尝试添加而不是替换 trans.add(R.id.frag_container, new BasicSettingsFragment());
  • 另外,我只是注意到在旋转屏幕时,菜单片段根本没有被删除,只是被隐藏了。当我旋转手机时,它出现在BasicSettingsFragment 上。 @GeorgianBenetatos 添加只将新片段放在前一个片段之上。
  • 你应该发布完整的 MainMenuFragment 代码,一切看起来都很好。
  • frag_container 是 activity_main 中的框架布局吗?
  • @GeorgianBenetatos 我刚刚用完整的代码更新了帖子。 frga_container 确实是在 activity_main 的 XML 文件中定义的 FrameLayout。

标签: android android-fragments back-stack


【解决方案1】:

在您的 Activity 中覆盖:

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

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

FragmentTransaction.addToBackStack(null);

【讨论】:

    【解决方案2】:

    您的代码是一个混淆,您使用来自 appcompat 的 ActionBarActivity 而不是使用 getSupportFragmentManager() 并且如果您决定使用它,片段导入应该是 appcompat 的。如果没有,请使用 Activity 而不是 ActionBarActivity 和使用 FragmentManager 的简单 Fragment 导入

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

    【讨论】:

    • 你应该鼓励 OP 发布一个新问题。
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      当你用FragmentManager添加或替换一个fragment时,你需要在调用commit()之前手动将旧的fragment用addToBackStack()添加到backstack中。

      【讨论】:

      • 这就是我正在做的。问题是当我使用replace 时,它不会删除旧片段,因为当我旋转屏幕时,它会出现在旋转前的顶部。
      猜你喜欢
      • 2020-06-08
      • 1970-01-01
      • 2014-10-10
      • 1970-01-01
      • 2021-06-17
      • 1970-01-01
      • 1970-01-01
      • 2015-08-26
      相关资源
      最近更新 更多