Подтвердить что ты не робот

FragmentTransaction.replace() не работает

У меня есть ListFragment, отображающий список элементов, созданных пользователем. У меня есть ListView с идентификатором id, установленным в "@android: id/list" и TextView с идентификатором "@android: id/empty".

У меня есть кнопка панели действий, чтобы отобразить фрагмент, чтобы позволить пользователю создавать больше записей для списка. Вот метод onOptionsItemSelected():

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    Fragment frag = null;

    // Right now I only have code for the addCourse() fragment, will add more soon
    switch (item.getItemId()) {
    case R.id.addCourse:
        frag = new AddCourseFragment();
        break;
    default:
        return super.onOptionsItemSelected(item);
    }

    // The support library is being dumb and replace isn't actually 
    getFragmentManager().beginTransaction()
        .remove(this).add(getId(), frag).addToBackStack(null).commit();
    return true;

}

Код AddCourseFragment выглядит следующим образом:

public class AddCourseFragment extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_addcourse, container, false);
//      if (view.findViewById(R.id.timesFrame)!=null) {
        Fragment timesFrag = new TimesFragment();
        getChildFragmentManager().beginTransaction()
            .add(R.id.timesFrame, timesFrag).commit();
//      }
    return view;
    }
}

Как и ожидалось, когда список не заполнен, андроид показывает текст в TextView. Затем я нажимаю кнопку добавления курса, и это происходит: enter image description here
Он показывает пустой текст, а также новый фрагмент.

4b9b3361

Ответ 1

У меня была аналогичная проблема.

В соответствии с this, когда вам нужно добавить программный код Fragments, вы должны добавить их в существующий ViewGroup.

Итак, я удалил Fragment из xml и использовал компонент FrameLayout в методе replace().

Вы также можете посмотреть здесь.

Надеюсь, это поможет.

Ответ 2

Укажите цвет фона основного макета дочернего фрагмента.

Как android: background = "# FFFFFF"

Это сработало для меня!!!!

Ответ 3

Другая проблема, которая разрешила проблему в моем случае, заключалась в расширении импорта API.

Убедитесь, что вы используете "support.v4" или "оригинальные" реализации из API 11 и не смешиваете их. (это может произойти, в моем случае: TransactionManager был v4, а Activity - более старой версией или наоборот)

Ответ 4

Другим решением является использование LinearLayout Вместо фрагмента

 <Fragment
        android:name="path/to.package.MyClass"
        android:id="@+id/fragmentContainer"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="100dp"
         />

ИСПОЛЬЗУЙТЕ его так:

 <LinearLayout
        android:name="path/to.package.MyClass"
        android:id="@+id/fragmentContainer"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="100dp"
         />

Ответ 5

Я решил изменить RelativeLayout для LinearLayout... Надеюсь, это поможет!

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/windowBackground">


    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/fragment_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />


</LinearLayout>