У меня есть Activity (MainActivity
) с DrawerLayout с использованием NavigationDrawerFragment
в качестве меню навигации. В этом NavigationDrawerFragment
при щелчке по элементу навигации startActivity(intent to MainActivity with extra)
вызывается для отправки намерения, полученного в onNewIntent
, на MainActivity
; android:launchMode="singleTop"
в манифесте; для отображения соответствующего фрагмента. В onCreate, если saveInstanceState не равен нулю, транзакция фрагмента не выполняется, потому что текущий фрагмент будет автоматически восстановлен.
Проблема в следующем: для одного фрагмента (а не для других): DashboardFragment
, тот, который запущен по умолчанию, при ориентации экрана фрагмент восстанавливается, но затем создается заново.
Я вижу это с помощью отладчика: вызывается обычный процесс: действие воссоздано, фрагмент восстановлен правильно, затем фрагмент воссоздан. Я также вижу это в журналах FragmentManager (сравнивая поведение с другим фрагментом): фрагмент восстанавливается правильно, но затем я вижу фиксацию, заменяющую фрагмент новым экземпляром DashboardFragment
. В коде я не вижу, откуда взялся этот коммит (я поставил точки останова во все коммиты в коде, и ни одна не вызывается).
Вы хоть представляете, почему это происходит?
Я могу разместить код по запросу, это сложное приложение, не с открытым исходным кодом, и я не уверен, какую часть здесь разместить.
Упрощенная MainActivity:
public class MainActivity extends MeerkatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
MeerkatApplication.get(this).getAppComponent().inject(this);
setContentView(R.layout.base_activity_layout_withdrawer);
setSupportActionBar(toolbar);
navigationDrawerFragment = (NavigationDrawerFragment) getSupportFragmentManager().findFragmentById(R.id.navigationMenu);
drawerToggle = new ActionBarDrawerToggle(this, drawerLayout,
toolbar,
R.string.open_drawer,
R.string.close_drawer);
drawerLayout.addDrawerListener(drawerToggle);
drawerLayout.setStatusBarBackground(R.color.primaryDarkColor);
drawerToggle.syncState();
final ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setDisplayShowTitleEnabled(true);
}
//first calling before onNewIntent :
if (savedInstanceState == null) {
openFirstOpenableSection();
}
if (paneContainer != null) {
// Enable animation
LayoutTransition transition = new LayoutTransition();
transition.enableTransitionType(LayoutTransition.CHANGING);
paneContainer.setLayoutTransition(transition);
}
}
private void openFirstOpenableSection() {
int dc_id = -1;
if(getIntent() != null){
dc_id = getIntent().getIntExtra(EXTRA_DATACENTER_ID,-1);
}
int sectionToOpen = findFirstOpenableSection(sessionInformations
.getOrganizationInformations());
eventBus.post(new NavigationChangedEvent(sectionToOpen));
switch (sectionToOpen) {
case R.id.dashboard:
if(dc_id != -1){
IntentStarter.showDashAfterRequest(this,dc_id);
}else{
IntentStarter.showDashboard(this);
}
break;
...
default:
IntentStarter.showNoSectionAvailable(this);
}
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);
Bundle extras = intent.getExtras();
if (extras != null) {
String showAction = intent.getStringExtra(EXTRA_SHOW_ACTION);
if (rightPane != null) {
rightPane.setVisibility(View.GONE);
}
switch (extras.getInt(EXTRA_MENU_ITEM, -1)) {
case EXTRA_MENU_ITEM_DASHBOARD:
getSupportFragmentManager().beginTransaction()
.replace(R.id.container, DashboardFragmentBuilder
.newDashboardFragment(sessionInformations.getUser().getId(),
getResources().getString(R.string.dashboard_personalDashboard),
"pda"), "DASHBOARD")
.commit();
}
drawerLayout.closeDrawer(GravityCompat.START);
break;
...
case EXTRA_MENU_ITEM_LOGOUT:
logout();
break;
default:
break;
}
}
}
IntentStarter:
public final class IntentStarter {
public static void showDashboard(Context context) {
Intent intent = new Intent(context, MainActivity.class);
intent.putExtra(MainActivity.EXTRA_MENU_ITEM, MainActivity.EXTRA_MENU_ITEM_DASHBOARD);
context.startActivity(intent);
}
}
NavigationDrawerFragment:
public class NavigationDrawerFragment extends MeerkatFragment {
@OnClick({R.id.dashboard, ... R.id.logout})
public void onMenuItemSelected(View view) {
switch (view.getId()) {
case R.id.dashboard:
desactivateAllViews();
IntentStarter.showDashboard(getActivity());
view.setActivated(true);
break;
case R.id.logout:
IntentStarter.logout(getActivity());
view.setActivated(true);
break;
...
}
}
}
startActivity()
, чтобы начать хостингActivity
от ребенкаFragment
? Вы можете использовать обратные вызовы - это простая навигация внутри одногоActivity
с несколькими дочернимиFragments
? Если это так, вам никогда не нужно звонитьstartActivity
Также ваш комментарий:I can put code on request, this is a complex app,
- нам нужен только СООТВЕТСТВУЮЩИЙ код. - person Mark Keen   schedule 23.02.2017