web-dev-qa-db-fra.com

Android remplace le fragment actuel par un autre fragment

Je viens de commencer avec la conception de fragments pour HoneyComb. J'ai créé deux fragments. Lorsque je clique sur un bouton dans le fragment de gauche, un nouveau fragment est créé dans le côté droit. En attendant, lorsque je clique sur un bouton du fragment de droite (c'est-à-dire, DetialsFragment dans mon code ci-dessous doit être remplacé par un autre fragment .

<?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:orientation="horizontal" >
    <fragment class="com.fragment.example.Titles"
        Android:id="@+id/titles" Android:layout_weight="1"
        Android:layout_width="0px"
        Android:layout_height="match_parent" />
    <FrameLayout Android:id="@+id/details" Android:layout_weight="1"
        Android:layout_width="0px"
        Android:layout_height="match_parent" />

</LinearLayout>

FragmentExample.Java

public class FragmentExample extends Activity {
/** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
}

Titres.Java

public class Titles extends Fragment {
    public FragmentTransaction ft;
    @Override
    public View onCreateView(LayoutInflater inflater,
        ViewGroup container, Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.main1, null);
        Button button1 = (Button)v.findViewById(R.id.button1);
        button1.setText("santhosh");
        button1.setOnClickListener(new OnClickListener() {



            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                 DetailsFragment details = (DetailsFragment)
                            getFragmentManager().findFragmentById(R.id.details);
                    if (details == null || details.getShownIndex() != 1) {
                        // Make new fragment to show this selection.
                        details = DetailsFragment.newInstance(1);

                        // Execute a transaction, replacing any existing
                        // fragment with this one inside the frame.
                        ft
                                = getFragmentManager().beginTransaction();
                        ft.add(R.id.details, details, "detail");
                        ft.setTransition(
                                FragmentTransaction.TRANSIT_FRAGMENT_FADE);
                        ft.commit();
                    }
            }

        });
        return v;
    }
}

DétailsFragment.Java

public class DetailsFragment extends Fragment {
    /**
     * Create a new instance of DetailsFragment, initialized to
     * show the text at 'index'.
     */
    Titles title = new Titles();
    String[] titles = {"Title1", "Title2", "Title3", "Title4"};
    public static DetailsFragment newInstance(int index) {
        DetailsFragment f = new DetailsFragment();

        // Supply index input as an argument.
        Bundle args = new Bundle();
        args.putInt("index", index);
        f.setArguments(args);

        return f;
    }

    public int getShownIndex() {
        return getArguments().getInt("index", 0);
    }

    @Override
    public View onCreateView(LayoutInflater inflater,
        ViewGroup container, Bundle savedInstanceState) {
        if (container == null) {
            // Currently in a layout without a container, so no
            // reason to create our view.
            return null;
        }
        Button button = new Button(getActivity());
        button.setText("Next");
        button.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
            }
        });
        return button;
    }
}
42
Santhosh_pulliman

Ensuite, si votre bouton est affiché et que l'événement click est déclenché, vous pouvez appeler les éléments suivants dans votre événement click:

final FragmentTransaction ft = getFragmentManager().beginTransaction(); 
ft.replace(R.id.details, new NewFragmentToReplace(), "NewFragmentTag"); 
ft.commit(); 

et si vous souhaitez revenir à DetailsFragment en cliquant en arrière, assurez-vous d’ajouter la transaction ci-dessus à la pile arrière, c.-à-d. 

ft.addToBackStack(null);

Ou est-ce que je manque quelque chose? Certaines personnes peuvent également suggérer que votre activité obtienne l'événement click pour le bouton et qu'il soit chargé de remplacer les fragments dans votre volet d'informations.

88
PJL

Vous pouvez essayer ci-dessous le code. c’est une méthode très facile pour Push new fragment from old fragment.

private int mContainerId;
private FragmentTransaction fragmentTransaction;
private FragmentManager fragmentManager;
private final static String TAG = "DashBoardActivity";

public void replaceFragment(Fragment fragment, String TAG) {

    try {
        fragmentTransaction = fragmentManager.beginTransaction();
        fragmentTransaction.replace(mContainerId, fragment, tag);
        fragmentTransaction.addToBackStack(tag);
        fragmentTransaction.commitAllowingStateLoss();

    } catch (Exception e) {
        // TODO: handle exception
    }

}
1
Jignesh Goyani

Utilisez Android.support.v4.app pour FragmentManager & FragmentTransaction dans votre code, cela a fonctionné pour moi.

DetailsFragment detailsFragment = new DetailsFragment();
Android.support.v4.app.FragmentManager fragmentManager = getSupportFragmentManager();
Android.support.v4.app.FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.details,detailsFragment);
fragmentTransaction.commit();
1
Madhu Jayarama

c'est très simple comment remplacer par Fragment.

DataFromDb changeActivity = new DataFromDb();
    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
    transaction.replace(R.id.changeFrg, changeActivity);
    transaction.commit();
0
Alan