0

Я добавил фоновое обслуживание к моему приложению, которое создает заметку при добавлении нового элемента в мое приложение. При нажатии уведомления пользователь вводится в приложение, и цель передает объект, который позволяет приложению выбирать вновь добавленный элемент.Фрагмент Android не отображается

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

В основном действии onCreate Я проверяю намерение и проверяю, прошел ли элемент и отобразите его, если он есть. Это нормально работает на телефоне, но на планшете правый фрагмент не отображается и, следовательно, элемент не может быть показан.

Это то, что я называю в конце OnCreate (я пробовал в OnStart и onResume)

Bundle data = queryIntent.getExtras(); 
    if (data!=null){ 
     Deal deal = data.getParcelable("notificationDeal"); 
     if (deal!=null){ 
      onDealSelected(deal); 
     } 
    } 

Метод onDealSeletced делает следующий

public void onDealSelected(Deal deal) { 
    if (!mDualFragments){ 
     Intent showDealDetails = new Intent(getApplicationContext(), DealDetailsActivity.class); 
     showDealDetails.putExtra("Deal", deal); 
     showDealDetails.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
     startActivity(showDealDetails); 
     Log.d("OnDealSelected", "1"); 
    } 
    else{ // must be tablet 
     if (dealDetailsFragment == null) 
      dealDetailsFragment = (DealDetailsFragment) getFragmentManager().findFragmentByTag("dealDetailsFragment"); 
     if (!dealDetailsFragment.isVisible()){ 
      FragmentTransaction transaction = getFragmentManager().beginTransaction(); 
      transaction.replace(R.id.right_fragment_container, dealDetailsFragment); 
      transaction.setTransitionStyle(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
      transaction.commit(); 
      getFragmentManager().executePendingTransactions(); // ensure it is done before we call update deal! 
      Log.d("OnDealSelected", "2"); 
     } 
     if (dealDetailsFragment.isVisible()) { 
      dealDetailsFragment.updateDeal(deal); 
      Log.d("OnDealSelected", "3"); 
     } 
    } 
} 

на смартфоне mDualFragments ложна и, следовательно, он показывает сделку в новой деятельности и работает, как ожидалось. Когда на планшете он переходит в другое, однако он никогда не попадает в финал, если в качестве фрагмента не видно.

При запуске приложения на планшете он переходит во второй, если после него фрагмент все еще не отображается.

Тот же метод используется в других точках приложения (когда сделка не проходит через намерение) и работает должным образом.

ответ

3

Вы можете использовать setArguments(Bundle bundle) для передачи данных фрагменту до его прикрепления (перед действием фиксации). Таким образом, когда Фрагмент инициализирует себя, он может вызвать getArguments и разобрать пакет. Таким образом, вам не нужно беспокоиться о том, что фрагмент все еще видимый, он может создавать свои представления при готовности. В Фрагменте есть полный пример: Docs

+0

Из документации - Аргументы, предоставленные здесь, будут сохранены через уничтожение фрагмента и создание. Означает ли это, что пакет сохраняется до тех пор, пока приложение не будет убито? Скажем, например, много уведомлений, которые пользователь нажимает, будут также сохранены все связки? – bencallis

+0

Если вы удалите фрагмент с помощью операции удаления или замены, фрагмент будет уничтожен (так что пакет потерян), но если вы повернете устройство, и фрагмент будет снова подключен, то пакет будет сохранен. setArguments можно вызывать только один раз для каждого фрагмента, поэтому для обработки нескольких уведомлений вы можете просто заменить старый фрагмент на новый. – smith324

+0

Спасибо. Мне удалось заставить его работать после вашего совета. – bencallis

0

Попробуйте метод transaction.add() и скройте предыдущий фрагмент. Полагаю, теперь ваш фрагмент будет виден.

 transaction.add(R.id.right_fragment_container, dealDetailsFragment); 
+0

Я пробовал это, к сожалению, эта же проблема все еще встречается. – bencallis