Jam*_*ter 8 android android-fragments back-stack
我将片段事务添加到后台堆栈时遇到问题.我有一个Main活动,我在其中使用Menu Fragment填充我的布局:
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);
}
Run Code Online (Sandbox Code Playgroud)
}
然后,在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();
}
}
Run Code Online (Sandbox Code Playgroud)
}
根据我的理解,这应该使得当用户按下设备上的后退按钮时,它们将被带回菜单片段,但是这会退出应用程序.我究竟做错了什么?
在您的活动覆盖中:
@Override
public void onBackPressed() {
if (getFragmentManager().getBackStackEntryCount() > 0) {
getFragmentManager().popBackStack();
} else {
super.onBackPressed();
}
}
Run Code Online (Sandbox Code Playgroud)
并且可能需要在每个提交的片段事务中使用:
FragmentTransaction.addToBackStack(null);
Run Code Online (Sandbox Code Playgroud)
您的代码是一种混合,您使用 appcompat 中的 ActionBarActivity 而不是使用 getSupportFragmentManager() ,如果您决定使用它,片段导入应该是 appcompat 的。如果没有,请使用 Activity 而不是 ActionBarActivity 并使用 FragmentManager 进行简单的 Fragment 导入
将其添加到您的活动中android:configChanges="keyboardHidden|orientation|screenSize"
这将阻止您的活动在轮换时重新启动。用于setRetainInstance(true)碎片。
| 归档时间: |
|
| 查看次数: |
6355 次 |
| 最近记录: |