Android 旋转后未获取活动默认状态
我正在创建一个导航抽屉,一切都很顺利:我成功地创建了它,但当我旋转方向时,我当前选择的片段在旋转后自动附加到活动 我没有维护saveInstanceState上的Android 旋转后未获取活动默认状态,android,Android,我正在创建一个导航抽屉,一切都很顺利:我成功地创建了它,但当我旋转方向时,我当前选择的片段在旋转后自动附加到活动 我没有维护saveInstanceState上的onSaveInstanceState 例如:在垂直方向上,如果我从 fragmentA->fragmentB->fragmentC并旋转方向 我得到了片段c 我没有保存活动状态。结果应该是fragmentA 为什么会这样 BaseFragment.java public abstract class BaseFragment exte
onSaveInstanceState
例如:在垂直方向上,如果我从
fragmentA
->fragmentB
->fragmentC
并旋转方向
我得到了片段c
我没有保存活动状态。结果应该是fragmentA
为什么会这样
BaseFragment.java
public abstract class BaseFragment extends Fragment {
protected static final String ARG_SECTION_NUMBER = "section_number";
abstract public int getFragmentSectionNumber();
}
FragmentA.java
public class FragmentA extends BaseFragment {
public final static String TAG = FragmentA.class.getSimpleName();
public static FragmentA newInstance(int sectionNumber){
FragmentA fragmentA = new FragmentA();
Bundle bundle = new Bundle();
bundle.putInt(ARG_SECTION_NUMBER,sectionNumber);
fragmentA.setArguments(bundle);
return fragmentA;
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
int sectionNumber = getFragmentSectionNumber();
((MainActivity)getActivity()).onSectionAttached(sectionNumber);
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View root = inflater.inflate(R.layout.layout_a, null, false);
return root;
}
@Override
public int getFragmentSectionNumber() {
return getArguments().getInt(ARG_SECTION_NUMBER);
}
}
MainActivity.java
public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener {
private FragmentManager fragmentManager;
private ActionBarDrawerToggle toggle;
private DrawerLayout drawer;
private Toolbar toolbar;
private NavigationView navigationView;
private String mTitle;
private int mCurrentPosition;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
}
});
drawer.setDrawerListener(toggle);
toggle.syncState();
navigationView = (NavigationView) findViewById(R.id.nav_view);
if (savedInstanceState == null) {
setFragment(FragmentA.newInstance(R.id.a));
} else {
// int id = savedInstanceState.getInt(Constants.SELECTED_NAVIGATION_ID);
// onSectionAttached(id);
}
navigationView.setNavigationItemSelectedListener(this);
}
private void init() {
toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
fragmentManager = getSupportFragmentManager();
drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
toggle = new ActionBarDrawerToggle(
this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
}
private void setFragment(BaseFragment baseFragment) {
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.replace(R.id.fragment_container, baseFragment);
transaction.addToBackStack(null);
transaction.commit();
}
@Override
public void onBackPressed() {
/*DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
if (drawer.isDrawerOpen(GravityCompat.START)) {
drawer.closeDrawer(GravityCompat.START);
return;
} else {
super.onBackPressed();
}
if (fragmentManager.getBackStackEntryCount() <= 0) {
super.onBackPressed();
return;
}
BaseFragment baseFragment = (BaseFragment) fragmentManager.getFragments().get(fragmentManager.getBackStackEntryCount() - 1);
if (baseFragment != null) {
mCurrentPosition = baseFragment.getFragmentSectionNumber();
onSectionAttached(mCurrentPosition);
}*/
}
@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) {
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
@SuppressWarnings("StatementWithEmptyBody")
@Override
public boolean onNavigationItemSelected(MenuItem item) {
// Handle navigation view item clicks here.
int id = item.getItemId();
switch (id) {
case R.id.a:
if (mCurrentPosition != R.id.a) {
setFragment(FragmentA.newInstance(R.id.a));
item.setChecked(true);
}
break;
case R.id.b:
if (mCurrentPosition != R.id.b) {
setFragment(FragmentB.newInstance(R.id.b));
item.setChecked(true);
}
break;
case R.id.c:
if (mCurrentPosition != R.id.c) {
setFragment(FragmentC.newInstance(R.id.c));
item.setChecked(true);
}
break;
case R.id.d:
if (mCurrentPosition != R.id.d) {
setFragment(FragmentD.newInstance(R.id.d));
item.setChecked(true);
}
break;
case R.id.e:
if (mCurrentPosition != R.id.e) {
setFragment(FragmentE.newInstance(R.id.e));
item.setChecked(true);
}
break;
default:
break;
}
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
drawer.closeDrawer(GravityCompat.START);
return true;
}
public void onSectionAttached(int number) {
switch (number) {
case R.id.a:
mTitle = "Fragment A";
mCurrentPosition = R.id.a;
break;
case R.id.b:
mTitle = "Fragment B";
mCurrentPosition = R.id.b;
break;
case R.id.c:
mTitle = "Fragment C";
mCurrentPosition = R.id.c;
break;
case R.id.d:
mTitle = "Fragment D";
mCurrentPosition = R.id.d;
break;
case R.id.e:
mTitle = "Fragment E";
mCurrentPosition = R.id.e;
break;
default:
return;
}
if (mTitle != null && getSupportActionBar() != null) {
getSupportActionBar().setTitle(mTitle);
navigationView.getMenu().findItem(mCurrentPosition).setChecked(true);
}
}
private static class Constants {
final static String SELECTED_NAVIGATION_ID = "selected_navigation_id";
}
}
公共类MainActivity扩展AppCompative实现NavigationView.OnNavigationItemSelectedListener{
私人碎片管理器碎片管理器;
私有操作BarDrawerToggle切换;
私人抽屉;
专用工具栏;
私有导航视图导航视图;
私有字符串mTitle;
私人国际货币头寸;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
FloatingActionButton fab=(FloatingActionButton)findViewById(R.id.fab);
fab.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
Snackbar.make(查看“替换为您自己的操作”,Snackbar.LENGTH\u LONG)
.setAction(“Action”,null).show();
}
});
抽屉。设置抽屉定位器(开关);
toggle.syncState();
navigationView=(navigationView)findViewById(R.id.nav_视图);
如果(savedInstanceState==null){
setFragment(FragmentA.newInstance(R.id.a));
}否则{
//int id=savedInstanceState.getInt(常量.选定的\u导航\u id);
//附件(id);
}
navigationView.setNavigationItemSelectedListener(此);
}
私有void init(){
toolbar=(toolbar)findviewbyd(R.id.toolbar);
设置支持操作栏(工具栏);
fragmentManager=getSupportFragmentManager();
抽屉=(抽屉布局)findViewById(R.id.抽屉布局);
toggle=新动作bardrawertoggle(
这,抽屉,工具栏,R.string.navigation\u drawer\u open,R.string.navigation\u drawer\u close);
}
私有void setFragment(BaseFragment BaseFragment){
FragmentTransaction=fragmentManager.beginTransaction();
事务.replace(R.id.fragment\u容器,baseFragment);
transaction.addToBackStack(空);
commit();
}
@凌驾
public void onBackPressed(){
/*抽屉布局抽屉=(抽屉布局)findViewById(R.id.抽屉布局);
if(抽屉isDrawerOpen(重力压缩机启动)){
抽屉。关闭抽屉(重力压缩机启动);
返回;
}否则{
super.onBackPressed();
}
如果(fragmentManager.getBackStackEntryCount(),我猜是super.onSaveInstanceState()。它本身会保存一些状态。尝试在onCreate(Bundle savedInstanceState)中记录savedInstanceState,假设super.onSaveInstanceState()保存状态,但我没有从Bundley片段的onCreated onViewStateRestored、活动的onSaveInstanceState、OnRestoreInstanceState获取状态数据正如您所建议的,我重写了这些方法,并发现在方向更改onCreate()之后我选择的每个片段都会一直调用,上次选择的onViewStateRestored只调用了一次。我没有选择的片段的onCreate()方法不会一次调用。你能告诉我为什么onCreate()会自动调用我得到了为什么onCreate()的答案吗每次调用,但保存状态有一些混乱。android是否在内部保存视图层次结构状态我猜是super.onSaveInstanceState()。它本身保存一些状态。尝试在onCreate(Bundle savedInstanceState)中记录savedInstanceState。假设super.onSaveInstanceState())保存状态,但我没有从Bundley片段的onCreated onViewStateRestored、活动的onSaveInstanceState、OnRestoreInstanceState获取状态数据正如您所建议的,我重写了这些方法,并发现在方向更改onCreate()之后我选择的每个片段都会一直调用,上次选择的onViewStateRestored只调用了一次。我没有选择的片段的onCreate()方法不会一次调用。你能告诉我为什么onCreate()会自动调用我得到了为什么onCreate()的答案吗每次调用,但在保存状态中有一些混乱。android是否在内部保存视图层次结构状态