Intereting Posts
Android: создать уникальную строку для имени файла Сплит-панель действий на Android 5.0 (Lollipop) Android: эмулятор часто отключается (отключен)! Увеличение размера кучи при создании исходного кода Android на Ubuntu 15.10 Отслеживание представления View добавлено в WindowManager (нет функции findViewById ()?) Попытка повторного открытия уже закрытого объекта: SQLiteDatabase Как использовать аппаратное ускорение декодирования видео на Android? После обновления службы Google Play до версии 13 я получил сообщение об ошибке Как изменить цвет панели навигации системы IntentService не будет показывать Toast Как создать временную метку Unix на Android? Этот класс должен быть общедоступным (android.support.v7.internal.widget.ActionBarView.HomeView) Как передать предварительный просмотр камеры на поверхность, созданный MediaCodec.createInputSurface ()? Любые текстовые редакторы с открытым исходным кодом для Android? Android: Воспроизведение mp3-файла из необработанного ресурса при нажатии TextView

Навигационный ящик onNavigationDrawerItemSelected вызывается перед MainActivity onCreate?

У меня есть новый проект с реализацией шаблона фрагмента навигационного ящика и MainActivity.

Он предоставляет мне следующие соответствующие методы:

@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Intent intent = getIntent(); token = intent.getStringExtra(EXTRA_TOKEN); mNavigationDrawerFragment = (NavigationDrawerFragment) getSupportFragmentManager().findFragmentById(R.id.navigation_drawer); mNavigationDrawerFragment.activityMain = this; mTitle = getTitle(); // Set up the drawer. mNavigationDrawerFragment.setUp( R.id.navigation_drawer, (DrawerLayout) findViewById(R.id.drawer_layout)); } 

My MainActivity запускается активностью всплеска, которая получает сохраненный токен доступа через EXTRA_TOKEN.

Это переопределение элемента выбора элемента «Передвижной ящик» в MainAcitivity:

 @Override public void onNavigationDrawerItemSelected(int position) { // update the main content by replacing fragments FragmentManager fragmentManager = getSupportFragmentManager(); onSectionAttached(position + 1); switch(position) { case 0: fragmentManager.beginTransaction() .replace(R.id.container, FeedFragment.newInstance(token, "")) .commit(); break; case 1: fragmentManager.beginTransaction() .replace(R.id.container, PeopleFragment.newInstance("", "")) .commit(); break; case 2: if(qbloggedin) { fragmentManager.beginTransaction() .replace(R.id.container, MessagesFragment.newInstance(token, "")) .commit(); } break; default: break; } } 

Он запускает три разных фрагмента, в зависимости от того, какой элемент выбран в NavDrawer. При создании новых фрагментов token строка передается в ее конструктор, который сохраняется в классе фрагмента для дальнейшего использования.

Однако при первом запуске приложения кажется, что onNavigationDrawerItemSelected вызывается перед onCreate ! Это приводит к тому, что я передаю токен нулевого значения во фрагменты, заставляя их быть испорченными.

Как это возможно? Насколько я понимаю, файл NavigationDrawerFragment еще не был настроен!

Я установил точки останова как onCreate и on onNavigationDrawerItemSelected switch position = 0 . onNavigationDrawerItemSelected действительно попал перед onCreate .

Как я могу убедиться, что сначала получил маркер, прежде чем пытаться обработать onNavigationDrawerItemSelected ?

Любая помощь будет оценена по достоинству.

Solutions Collecting From Web of "Навигационный ящик onNavigationDrawerItemSelected вызывается перед MainActivity onCreate?"

Полагаю, я понял это, поскольку это происходило со мной для всех, кто ищет это и не может найти ответ.

Если вы используете Android Studio DrawerActivity, тогда есть шаблонный код, который они создают для вас. В этом коде в файле activity_main.xml или любом другом XML, который ваш DrawerActivity устанавливает в качестве своего «содержимого», есть тег.

Когда setContentView () вызывается в onCreate (), этот фрагмент создается автоматически, и поэтому технически onCreate () все еще вызывается первым, а затем метод onNavigationDrawerItemSelected () вызывается перед чем-либо еще в create. Поскольку setContentView обычно поддерживается вверху, это создает проблемы при попытке сохранить состояние фрагментов в вашем ящике.

Просто переместите любой код, который проверяет для savedInstanceBundle выше setContentView (), и он устранит проблему.

Пример с комментариями:

 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // THIS IS WHERE YOU CHECK FOR SAVED INSTANCE // Check for frag if (savedInstanceState != null) { Log.i(TAG, "Get QuestionDayFragment"); mQuestionDaysFragment = (QuestionDaysFragment) getSupportFragmentManager().getFragment(savedInstanceState, QUESTION_DAY_FRAGMENT); } // View injection setContentView(R.layout.activity_main); ButterKnife.inject(this); // THIS IS WHERE THE CODE WAS BEFORE // THIS WOULD BE CALLED AFTER onNavigationDrawerItemSelected() // Singleton injection LifeboxApplication.graph().inject(this); // Toolbar setSupportActionBar(mToolbar); // FB uiHelper = new UiLifecycleHelper(this, callback); uiHelper.onCreate(savedInstanceState); // Drawer mNavigationDrawerFragment = (NavigationDrawerFragment) getSupportFragmentManager().findFragmentById(R.id.navigation_drawer); mTitle = getTitle(); mNavigationDrawerFragment.setUp(R.id.navigation_drawer, (DrawerLayout) findViewById(R.id.drawer_layout)); } 

Вы можете перенести намерение на конструктор и сохранить свои жетоны там так:

 Intent i; ...... public FragmentConstructor() { i = getIntent(); token = intent.getStringExtra(EXTRA_TOKEN); } 

Я должен был сделать это, чтобы проверить, загружена ли страница перед выполнением onNavigationDrawerItemSelected

  private Boolean loaded=false; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Your code here this.loaded=true; } public void onNavigationDrawerItemSelected(int position) { if (!this.loaded){ return; } 

Я также согласен с использованием логического элемента, чтобы проверить, завершила ли onCreate () загрузку. Мои другие предложения заключаются в том, что для быстрого исправления вы можете использовать onSectionAttached (int number) для обработки каждого выбранного элемента вместо onNavigationDrawerItemSelected.