Вызов фрагмента из другого фрагмента и затем замена его макета. - PullRequest
0 голосов
/ 13 мая 2018

Я довольно новичок в разработке для Android и имею проблему с вызовом / заменой фрагментов.Моя проблема очень похожа на эту: Android - фрагмент .replace () не заменяет контент - ставит его поверх .Однако «решением» этого было то, что фрагмент должен был быть создан в коде, а не в xml-файле.

У меня сейчас та же проблема, но мой фрагмент создается динамически в коде (MainActivity.java):

public void selectDrawerItem(MenuItem menuItem) {

    Fragment fragment = null;
    Class fragmentClass;
    switch(menuItem.getItemId()) {
        case R.id.nav_first_fragment:
            fragmentClass = FirstFragment.class;
            break;
        case R.id.nav_second_fragment:
            fragmentClass = SecondFragment.class;
            break;
        case R.id.nav_third_fragment:
            fragmentClass = ThirdFragment.class;
            break;
        default:
            fragmentClass = FirstFragment.class;
    }

    try {
        fragment = (Fragment) fragmentClass.newInstance();
    } catch (InstantiationException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e){
        e.printStackTrace();
    }

    FragmentManager fragmentManager = getSupportFragmentManager();
    fragmentManager.beginTransaction().replace(R.id.flContent, fragment).addToBackStack(null).commit();

    menuItem.setChecked(true);
    setTitle(menuItem.getTitle());

    mDrawer.closeDrawers();
}

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

My FirstFragment.java:

public class FirstFragment extends Fragment {

private View v;

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

private void configureImageButton() {
    // TODO Auto-generated method stub
    ImageButton btn = (ImageButton) v.findViewById(R.id.imageButton1);

    btn.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            Toast.makeText(getActivity(), "You Clicked the button!", Toast.LENGTH_LONG).show();

            Fragment f1 = null;
            Class c;
            c = FirstFirstFragment.class;

            try {
                f1 = (Fragment) c.newInstance();
            } catch (IllegalAccessException e){
                e.printStackTrace();
            } catch (java.lang.InstantiationException e){
                e.printStackTrace();            }


            FragmentTransaction fragmentTransaction = getActivity().getSupportFragmentManager().beginTransaction();
            fragmentTransaction.replace(R.id.tableLayout1, f1);
            fragmentTransaction.addToBackStack(null);
            fragmentTransaction.commit();

        }
    });

}

И мой FirstFirstFragment.java:

public class FirstFirstFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

    View view = inflater.inflate(R.layout.content_first_first, container, false);
    return view;
}

My activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<!-- This DrawerLayout has two children at the root  -->
<android.support.v4.widget.DrawerLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <!-- This LinearLayout represents the contents of the screen  -->
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <!-- The ActionBar displayed at the top -->
        <include
            layout="@layout/toolbar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

        <!-- The main content view where fragments are loaded -->
        <FrameLayout
            android:id="@+id/flContent"
            app:layout_behavior="@string/appbar_scrolling_view_behavior"
            android:layout_width="match_parent"
            android:layout_height="match_parent" >

            <Switch
                android:id="@+id/switch1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"/>
        </FrameLayout>
    </LinearLayout>

    <!-- The navigation drawer that comes from the left -->
    <!-- Note that `android:layout_gravity` needs to be set to 'start' -->
    <android.support.design.widget.NavigationView
        android:id="@+id/nvView"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:background="@android:color/white"
        app:menu="@menu/drawer_view"
        app:headerLayout="@layout/nav_header"/>
</android.support.v4.widget.DrawerLayout>

В ответах к статье, на которую я ссылался в начале, я читал, что у кого-то была именно эта проблема, и она была решена с помощью того же FragmentManager.Как и я, он раньше использовал getSupportFragmentManager () в своей Activity и getFragmentManager () в своем Fragment.

Но Fragment не знает getSupportFragmentManager (), так как это должно работать?

Я перепробовал все, что знаю, но решить ничего не получилось.Затем я читаю это

Насколько я знаю, вы не можете добавлять фрагменты в фрагменты. В проектном документе написано, что «Фрагмент всегда должен быть встроен в действие, и жизненный цикл фрагмента напрямую зависит отжизненный цикл хоста ".Таким образом, ваш дизайн сейчас кажется невозможным для разработки.

по аналогичному вопросу по stackoverflow, и теперь я задаюсь вопросом: Можно ли даже позволить фрагменту вызывать другой фрагмент, который затем заменяет первыйодин? (а не просто добавляет его ниже)

Я действительно надеюсь, что этот вопрос является разумным, а не ошибкой какого-то глупого новичка, потому что я искал весь интернет и не нашел правильного ответа.

Заранее спасибо за добрые ответы:).

1 Ответ

0 голосов
/ 13 мая 2018

Чтобы получить фрагментМангер во фрагменте, используйте

getActivity().getSupportFragmentManager()

Как уже упоминалось Вы должны использовать R.id.flContent в качестве хоста макета фрейма, поэтому используйте

fragmentTransaction.replace(R.id.flContent, f1);

вместо

fragmentTransaction.replace(R.id.tableLayout1, f1); 
...