Replace one fragment with an another fragment

前端 未结 8 1544
再見小時候
再見小時候 2020-12-16 19:37

I want to replace an old Fragment with a new Fragment, but i still get the buttons of the old Fragment that is still visible in the ne

相关标签:
8条回答
  • 2020-12-16 20:12

    The problem was the the container ID that was passing to the replace method was the ID of the fragment that was replacing, not the ID of the fragment container. This seems to explain why some of the original fragment controls were remaining after the replace - that entire fragment wasn't being replaced.

    Please change it to get the fragment container view ID, and it will work! Here's the code:

    transaction.replace(((ViewGroup)(getView().getParent())).getId(), fragment);

    I found the answer for getting the container view ID of a fragment here, Get fragment's container view id.

    0 讨论(0)
  • 2020-12-16 20:13

    In your Activity's onCreate function, you should be calling setContentView(R.layout.main), then when you want to load a Fragment, you choose a ViewParent within R.layout.main. The fragment will become the child of that ViewParent. So the id passed into FragmentTransaction.replace, is the id of the ViewParent in R.layout.main.

    It makes sense that the Button in your allmoods RelativeLayout would remain because the FragmentTransaction.replace function only replaces an existing fragment that is in that container. Everything in R.layout.main will remain. This is how an Activity keeps static content, like drawers or toolbars.

    When you load your "new fragment" you will use the same id. So the "new fragment" replaces the "old fragment" as the new child of the ViewParent within R.layout.main.

    Here is the Fragments API guide.

    Update:

    When you call FragmentTransaction.replace in your Activity's onCreate function, this could be recreating an existing Fragment. Make sure the savedInstanceState (the Bundle passed into onCreate) is null. If the savedInstanceState is not null, then the fragment probably already exists and you can find it like this;

    Fragment f = getFragmentManager().findFragmentByTag(YOUR_FRAGMENT_TAG);
    

    Update 2:

    Here is a guide that should help you. It looks like you could use FragmentPagerAdapter to simplify your fragment transactions.

    0 讨论(0)
  • 2020-12-16 20:14

    To understand the flow of fragment transition, first of all, you have to know about its structure in activity. Let's see: a) Activity: At bottom of everything (MainActivity)

    activity_main.xml :-

    <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">
    
        <FrameLayout
            android:id="@+id/container"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>
    </RelativeLayout>
    

    Here @+id/container is the layout over we do transitions of fragment contents.

    B) FragmentA : Initially added fragment to the container of MainActivity.

    FragmentManager fm = getFragmentManager();
    FragmentTransaction ft = fm.beginTransaction();
    //Instance of fragment
    Fragment newFragment = FragmentA.newInstance("a","b");
    //It will replace the fragment content view to container of main activity
    ft.replace(R.id.container, newFragment);
    //FragmentA is added to back stack with it's name as a tag
    ft.addToBackStack(FragmentA.class.getSimpleName());
    ft.commitAllowingStateLoss();
    

    B) FragmentB : Replace FragmentA with FragmentB

    FragmentManager fm = getFragmentManager();
    FragmentTransaction ft = fm.beginTransaction();
    //Instance of fragment
    Fragment newFragment = FragmentB.newInstance("a","b");
    //It will replace the fragment content view to container of fragment A which     // is previously replaced to main activity container
    ft.replace(R.id.container, newFragment);
    //FragmentB is added to back stack with it's name as a tag
    ft.addToBackStack(FragmentB.class.getSimpleName());
    ft.commitAllowingStateLoss();
    

    So main thing behind this is to replace/add fragment content view to the activity container view.

    0 讨论(0)
  • 2020-12-16 20:16

    Try the following code.

    A) Create Activity as follows :

    MainActivity

    import android.app.FragmentTransaction;
    import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;
    
    public class MainActivity extends AppCompatActivity implements ShowNextFragment{
    
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        FragmentA fragmentA=new FragmentA();
        FragmentTransaction fragmentTransaction=getFragmentManager().beginTransaction();
        fragmentTransaction.replace(R.id.container,fragmentA);
        fragmentTransaction.addToBackStack("A");
        fragmentTransaction.commitAllowingStateLoss();
    
    }
    
    @Override
    public void showFragment() {
        FragmentB fragmentB=new FragmentB();
        FragmentTransaction fragmentTransaction=getFragmentManager().beginTransaction();
        fragmentTransaction.replace(R.id.container,fragmentB);
        fragmentTransaction.addToBackStack("B");
        fragmentTransaction.commitAllowingStateLoss();
    }
    }
    

    B) Create 2 fragments as follows :

    Fragment A

     import android.app.Fragment;
     import android.os.Bundle;
     import android.support.annotation.Nullable;
     import android.util.Log;
     import android.view.LayoutInflater;
     import android.view.View;
     import android.view.ViewGroup;
    
    
    public class FragmentA extends Fragment {
    private ShowNextFragment showNextFragment;
    
    
    
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        try {
    
            showNextFragment=(ShowNextFragment)getActivity();
            Log.e("CAllback","Set");
        }catch (ClassCastException e){
            Log.e("Error","Please Implement ShowFragment Interface");
        }
        return inflater.inflate(R.layout.fragment_a,container,false);
    }
    
    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        view.findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (showNextFragment!=null){
                    showNextFragment.showFragment();
                }
            }
        });
    
    }
    }
    

    Fragment B

    import android.app.Fragment;
    import android.os.Bundle;
    import android.support.annotation.Nullable;
    import android.view.LayoutInflater; 
    import android.view.View;
    import android.view.ViewGroup;
    
    public class FragmentB extends Fragment {
    
    
    
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_b,container,false);
    }
    
    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
    
    
    }
    }
    

    C) Create an interface as follows

    public interface ShowNextFragment {
    void showFragment();
    }
    

    D) create following xmls as :

    i) activity_main

       <?xml version="1.0" encoding="utf-8"?>
       <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >
    
      </RelativeLayout>
    

    ii) fragment_a

    <?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:background="@color/colorcyan"
    android:orientation="vertical">
    
    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Show Fragment B" />
    </LinearLayout>
    

    iii) fragment_b

    <?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"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/colorgreen"
    android:orientation="vertical">
    
    <TextView
    
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Fragment B"
        android:layout_centerVertical="true"
        android:layout_alignRight="@+id/btn_camera"
        android:layout_alignEnd="@+id/btn_camera" />
    
    <android.support.design.widget.FloatingActionButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:backgroundTint="#ffffff"
        android:src="@android:drawable/ic_dialog_email"
        android:id="@+id/btn_camera"
        app:fabSize="mini"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true" />
     </RelativeLayout>
    
    0 讨论(0)
  • 2020-12-16 20:19

    Just make buttons setVisibility(View.GONE) in your activity when that fragment is begin transaction.

    0 讨论(0)
  • 2020-12-16 20:20

    put your next fragment UI elements in Card View. define a LinearLayout or other view groups as root and inside this root create a Card view and put your other elements in Card View . when you inflate it in Card View then the hole of new fragment inflate on the previous fragment.

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parenter code hereent"
        android:layout_height="match_parent"
        android:orientation="vertical">
       <androidx.cardview.widget.CardView
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_marginBottom="-20dp"
                app:cardCornerRadius="20dp">
    
          ......... your UI Elements .......
          //, for example, define other LinearLayout inside the Card View 
              and put other elements inside it like TextView, Button and 
              so on...     
    
    
    
    
       </androidx.cardview.widget.CardView>
    </LinearLayout>
    
    0 讨论(0)
提交回复
热议问题