2014-09-12 4 views
2

Я все новичок в разработке Android, но уже в большой беде. Я прочитал несколько потоков как здесь, так и на других сайтах относительно аналогичной или даже той же проблемы. Но все ответы, которые я нашел, не соответствуют моим потребностям или вообще не работают для меня.Android - Повторное раздувание фрагмента приводит к «Ошибка раздувания фрагмента класса»

Итак, вот что. У меня есть одно действие с самодельным слоем «меню», включающим 3 кнопки внизу действия и ScrollView выше. Теперь по нажатию одной из этих кнопок я просто надуть фрагмент в ScrollView используя

svContent.removeAllViews(); 
getLayoutInflater().inflate(R.layout.fragment_xyz, (ScrollView) findViewById(R.id.svContent)); 

который накачивают прекрасно.

Теперь надутый фрагмент содержит еще один фрагмент для Карт Google (API 2), который выглядит следующим образом.

<fragment 
    android:id="@+id/fMap" 
    android:name="com.google.android.gms.maps.MapFragment" 
    android:layout_width="fill_parent" 
    android:layout_height="150dp" /> 

Этот фрагмент также заполнен так, как я хочу, при инфляции его родительского фрагмента, и карта работает нормально.

Теперь я нажимаю на другую кнопку меню, чтобы надуть другой фрагмент. Но право, когда я нажимаю кнопку для первого фрагмента снова, я получаю следующее сообщение об ошибке:

Duplicate id xxxxx, tag null, or parent id xxxxx with another fragment for com.google.android.gms.maps.MapFragment

Как я уже сказал, я попробовал несколько решения, которое я нашел в Интернете, включая

  • переход от простирающегося фрагмента к FragmentActivity
  • с использованием SupportMapFragment вместо фрагмента
  • раздувания суб-фрагмент (в Google Maps один) из кода вместо XML

Все это было несколько недостатков, я не могу принять в данный момент (по крайней мере, я думаю) или «не работает» для меня или в моем созвездии

Любая помощь очень ценится. И, пожалуйста, я знаю, если вам нужна дополнительная информация.

С уважением, D.

+0

Почему вы «не можете принять», создавая фрагмент кодом? Это 4 строки кода, это ничего не меняет, и это будет работать отлично. –

+2

Попробуйте переместиться в другое созвездие. Андромеда ... возможно? – Emmanuel

+0

@StephaneMathis Создание фрагмента из кода - это то, что я мог бы прекрасно принять, но, к сожалению, не работал для меня - по крайней мере, не примеры, которые я нашел, а также просматривая api docs. Я не помню точной проблемы, с которой я столкнулся, у меня было слишком много попыток решения за последние 2 дня. Но, конечно, я могу попробовать еще раз, у вас есть не устаревший рабочий пример? – tetzlaff

ответ

1

Чтобы заменить фрагмент в вашем ScrollView:

SupportMapFragment mapFragment = MapFragment.newInstance(); 
    FragmentTransaction ft = getChildFragmentManager().beginTransaction(); 
    ft.replace(R.id.svContent, _mapFragment); 
    ft.commit(); 

Если вы хотите, чтобы вернуться к предыдущему frgament с кнопкой назад, добавьте ft.addToBackStack(null); перед фиксацией.

И все. Кстати, вы, вероятно, не должны иметь ScrollView в качестве контейнера ваших фрагментов. Если содержимое необходимо прокручивать, поместите прокрутку в свой фрагмент и поместите фрагмент в LinearLayout/FrameLayout/RelativeLayout.

+1

Отлично, этот намек в сочетании с комментарием Code-Apprentice подтолкнул меня в правильном направлении. Моя проблема была структурной: смешивание ручного инфляции с FragmentManager и регулярными фрагментами с поддержкой Fragments. Ваш ввод заставил меня переделать обработку фрагментов, и, очевидно, теперь я сделал это правильно. – tetzlaff

1

Для обработки фрагментов, вы должны использовать FragmentManager. Это означает, что вы должны не раздуть фрагмент напрямую. Скорее, вы должны разрешить FragmentManager сделать это за вас.

0

вам необходимо сделать карту нулевой, когда пользователь перейдет на другой экран.

уничтожить экземпляр карты Google, когда onDestroy метод.

@Override 
    protected void onDestroyView() { 
Fragment fragment = getFragmentManager().findFragmentById(R.id.fMap); 
     getFragmentManager().beginTransaction().remove(fragment); 
     gMap.clear(); 
gMap = null; 
     super.onDestroy(); 
    }