2

У меня есть следующие файлы 2 макета:findFragmentById возвращает фрагмент, который не существует

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical"> 

    <fragment android:id="@+id/list_fragment" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_weight="1" 
     class="MyListFragment"/> 

</LinearLayout> 

(w900dp)

<fragment android:id="@+id/list_fragment" 
    android:layout_width="0dp" 
    android:layout_height="match_parent" 
    android:layout_weight=".3" 
    class="MyListFragment"/> 

<fragment android:id="@+id/content_fragment" 
    android:layout_width="0dp" 
    android:layout_height="match_parent" 
    android:layout_weight=".7" 
    class="MyContentFragment"/> 

Тогда в моей деятельности I имеют:

public class ReportActivity extends ActionBarActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.report); 
     getSupportActionBar().setDisplayHomeAsUpEnabled(true); 

     // Get the content fragment 
     MyContentFragment contentFragment = (MyContentFragment) getSupportFragmentManager().findFragmentById(R.id.content_fragment); 
     if (contentFragment != null) { 
      // sometimes I get a handle to this fragment when I should not 
      contentFragment.updateContent(//some content); 
     } 
    } 

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

Почему getFragmentById возвращает фрагмент, который существует, но больше не существует после поворота устройства?

ответ

0

Я подозреваю, что проблема заключается в том, что ваш вызов getFragmentById() возвращает исходный фрагмент - тот, который создается при запуске приложения в ландшафте. Может быть, когда ваша деятельность воссоздается во время ротации, этот фрагмент отсоединяется (но не разрушается), а затем к активности добавляется новый экземпляр. Ваш getFragmentById() работает, но (исходный) фрагмент, который он возвращает, был отсоединен, поэтому он не имеет раздутых макетов, поэтому вызов содержимого обновления завершается с ошибкой.

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

.... 
Fragment frag = fragmentManager.findFragById(id); 
if (frag == null) { 
    frag = MyFrag.newInstance(); 
} 
fragmentManager.replace(...,frag,...)... 

Я бы на самом деле использовать findFragmentByTag(), потому что я считаю, что легче отслеживать, какой фрагмент, который затем. Просто установите уникальный тег при замене фрагмента.

+1

Спасибо. Однако я не программировал создание фрагментов, android делает это для меня, как они есть в моем файле макета. И.Е. причина, по которой я не размещал больше кода операции, заключается в том, что их больше нет. Когда вы используете тег фрагмента в файле макета xml, файл android создает/уничтожает фрагмент. – lostintranslation

+0

Возможно, вам захочется попробовать вручную обработать его, поскольку структура, похоже, не очень хорошая работа. – athingunique

Смежные вопросы