Android 旋转后未获取活动默认状态

Android 旋转后未获取活动默认状态,android,Android,我正在创建一个导航抽屉,一切都很顺利:我成功地创建了它,但当我旋转方向时,我当前选择的片段在旋转后自动附加到活动 我没有维护saveInstanceState上的onSaveInstanceState 例如:在垂直方向上,如果我从 fragmentA->fragmentB->fragmentC并旋转方向 我得到了片段c 我没有保存活动状态。结果应该是fragmentA 为什么会这样 BaseFragment.java public abstract class BaseFragment exte

我正在创建一个导航抽屉,一切都很顺利:我成功地创建了它,但当我旋转方向时,我当前选择的片段在旋转后自动附加到活动

我没有维护saveInstanceState上的
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是否在内部保存视图层次结构状态