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

Фрагмент не отображается

У меня возникла проблема, когда я могу создать фрагмент, его представление создается, но оно не отображается. Сам фрагмент создается, и любой код внутри работает без проблем, но он просто невидим. Кнопка "Назад" также взаимодействует с ней просто отлично (она "закрывает" ее), она просто физически не отображается на экране (отображается только основной макет).

Из моего FragmentActivity:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main_view);

    // some logic here that sets a button listener that calls openAddNamePane() when pressed
}

public void openAddNamePane(){
    AddNamePane addNamePane = new AddNamePane();
    FragmentManager fragmentManager = getSupportFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    fragmentTransaction.replace(R.id.layout_root, addNamePane, "AddnamePane");
    fragmentTransaction.addToBackStack(null);
    fragmentTransaction.commit();
}

Это макет для представления, которое сначала отображается (activity_main_view.xml aka мой "корневой макет" ):

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"

    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"

    android:orientation="vertical"

    android:background="@color/white"
    android:id="@+id/layout_root">

    <LinearLayout 
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <Button android:id="@+id/addPlayerButton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Add Player" />

        <Button android:id="@+id/button2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/buttonLabel" />
    </LinearLayout>


    <ListView android:id="@+id/playerListView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:cacheColorHint="@color/white"
        android:entries="@array/testStringArray" >
    </ListView>

</LinearLayout>

Это мой класс фрагмента:

public class AddNamePane extends Fragment {
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
    }

    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        System.out.println("AddNamePane.onCreateView()");

        View view = inflater.inflate(R.layout.add_player_pane_layout, container, false);

        return view;
    }

    // a few other methods here, onAttach(), onStop(), onPause(), etc
    // all are empty of logic with just a println to see if they are being called correctly (in which they are)
}

Это макет для этого фрагмента "AddNamePane":

<?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:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"

    android:orientation="vertical" >

    <EditText
        android:id="@+id/editText1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10" 
        android:text="test name here"
        android:hint="Name here" >
        <requestFocus />
    </EditText>

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button" />

</LinearLayout>

Я новичок в использовании фрагментов, не слишком уверен, что моя проблема в коде или что-то связано с макетами. Моя цель - добавить "AddNamePane" в "корневой макет", временно заменяющий основной вид. То, что я сделал, чтобы попытаться сделать это, - дать мой корневой макет id и использовать его в FragmentTransaction. Если это имеет значение, уровень api, который я использую, - 8 (Android 2.2), таким образом, используя вещи из пакета android.support.v4.app.

4b9b3361

Ответ 1

Вы пытаетесь программно заменить LinearLayout, также ожидая, что у него будут жестко закодированные дети. Это не сработает. Вы должны использовать FrameLayout для вашего FragmentTransaction, который также является дочерним элементом вашего layout_root.

Если вы обновите свой пост с помощью фактического xml, я могу показать вам, как это сделать.

Ответ 2

У меня была аналогичная проблема, когда фрагмент не показывался. Проблема заключалась в том, что я удалил AndroidAnnotations, но забыл переместить код из методов onViewCreated и onCreate в onCreateView. Я нашел эту ошибку, сравнив код двух фрагментов - один, который появился, а другой - нет. Итак, если у вас есть подобные проблемы, попробуйте проверить код фрагментов. На первый взгляд это может не отображать ошибки, но из-за этих ошибок они не будут работать или появляться.

В частности, убедитесь, что у вас есть этот метод и что вы раздуваете представление:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

    View v = inflater.inflate(R.layout.your_fragment_layout, container, false);
    return v;

}