использовать идентификатор content_frame для activity_main в классе Frag1

адаю от вложенных фрагментов. У меня есть mainacctivity, которое вызывает фрагмент 1, который в свою очередь вызывает фрагмент через кнопку. Фрагмент frag2 хорошо создан, но экран пуст. Есть ли что-то очевидное в моем коде?

Основное занятие

import android.app.FragmentManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        FragmentManager fragmentManager;
        Frag1 f1 = new Frag1();
        fragmentManager = getFragmentManager();
        fragmentManager.beginTransaction().replace(R.id.content_frame,
                f1).commit();
    }
}

mainacctivity xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.narb.nestedfragments.MainActivity">


    <FrameLayout
        android:id="@+id/content_frame"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        />

</RelativeLayout>

Фрагмент 1 и его формат XML:

import android.app.FragmentTransaction;
import android.content.Context;
import android.os.Bundle;
import android.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.RelativeLayout;


/**
 * A simple {@link Fragment} subclass.
 */
public class Frag1 extends android.app.Fragment {
    Context context;
    private Button back1;
    RelativeLayout rl1;

    public Frag1() {
        // Required empty public constructor
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View rootview = null;
        rootview = inflater.inflate(R.layout.fragment_frag1, container, false);
        return rootview;
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        context = getActivity().getApplicationContext();

        initFindView();

        back1.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                Log.i("frag1","createdview");
                //getActivity().getFragmentManager().popBackStackImmediate();
                rl1.setVisibility(View.INVISIBLE);
                FragmentTransaction ft = getFragmentManager().beginTransaction();
                Frag2 f2 = new Frag2();
                ft.replace(R.id.fl1, f2);
                ft.addToBackStack(null);
                ft.commit();
            }
        });

    }

    private void initFindView(){
        back1 = (Button) getActivity().findViewById(R.id.btn1);
        rl1 = (RelativeLayout) getActivity().findViewById(R.id.rl1);
    }
}

Это нормально, что мне нужно сделать мой макет frag 1 невидимым перед вызовом frag2?

и наконец мой фрагмент 2 и его макет. Я вижу журнал для фраг 2, но экран пуст:

import android.app.Fragment;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;


public class Frag2 extends Fragment {
    Context context;
    private Button btn2;

    public Frag2() {
        // Required empty public constructor
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View rootview;
        rootview = inflater.inflate(R.layout.fragment_frag2, container, false);
        Log.i("frag2","createdview");
        return rootview;
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        context = getActivity().getApplicationContext();
        Log.i("frag2","onactivitycreated");

        btn2 = (Button) getActivity().findViewById(R.id.btn2);
        btn2.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                Log.i("frag2","onactivitycreated");
            }
        });

    }
}

<RelativeLayout 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"
    tools:context="com.narb.nestedfragments.Frag2">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="Test 2" />

    <Button
        android:id="@+id/btn2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="60dp"
        android:text="back"
        />
</RelativeLayout>
 Selvin06 сент. 2017 г., 17:09
Это нормально, что мне нужно сделать мой макет frag 1 невидимым перед вызовом frag2? нет ... вложенный? так почему ты не использовалgetChildFragmentManager ?
 Ashish Kumar06 сент. 2017 г., 17:37
фрагмент_фрагмент xml не прикреплен ..
 dharmx06 сент. 2017 г., 17:11
фрагмент2 - высота текстового обзора равна match_parent, заменяется на wrap_con, палатка

Ответы на вопрос(3)

RelativeLayout (rl1) ваш родительский макет и у вас естьFrameLayout (fl1) внутриrl1, Вы делаете родительский макет невидимым. Таким образом, фрагмент2 не может быть виден.

Если вы не хотите показывать фрагмент1 при показе, нет необходимости во вложенном фрагменте.

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

getFragmentManager().beginTransaction()
                .replace(R.id.content_frame ,new Frag2());
                .addToBackStack(null);
                .commit();
 narb06 сент. 2017 г., 17:57
упс. но вы поняли это правильно. Благодарю.
Решение Вопроса

FrameLayout где вы заменяете фрагмент 2, то вместоgetFragmentManager(), использованиеgetChildFragmentManager() во фрагменте 1

в противном случае вы передаете неправильный идентификатор контейнера вreplace() методR.id.fl1 внутри фрагмент1. ты должен пройтиR.id.content_frame там.

 narb06 сент. 2017 г., 17:53
Понял. То, что я хотел сделать, это именно то, что вы descibe. Это работает сейчас. Вдобавок к этому я добавил popBackStack, который тоже работает. Для моего любопытства, в каком сценарии вы бы использовали getChildFragmentManager? Я начал тянуть свои волосы. Этот фрагмент не легко понять. Большое спасибо!
 Sandip Soni06 сент. 2017 г., 17:58
например, если у вашего фрагмента есть ViewPager, где каждая страница будет фрагментом, вам нужно будет использовать getChildFragmentManager (), поскольку они являются фрагментами внутри фрагмента.

ag1

back1.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            Log.i("frag1", "createdview");
            //getActivity().getFragmentManager().popBackStackImmediate();
            rl1.setVisibility(View.INVISIBLE);
            FragmentTransaction ft = getFragmentManager().beginTransaction();
            Frag2 f2 = new Frag2();
            ft.replace(R.id.content_frame, f2);
            ft.addToBackStack(null);
            ft.commit();
        }
    });

Ваш ответ на вопрос