La façon standard de déclarer des fragments dans un fichier de mise en page XML est
<LinearLayout ...>
<fragment class="com.example.SomeFragment"
</LinearLayout>
où SomeFragment est une classe Java définie comme
class SomeFragment extends Fragment {
...
}
Disons que j'ai 3 fragments; fragment1, fragment2 et fragment3. Lorsque l'utilisateur lance l'application, je lui montre fragment1, et lorsqu'il clique sur un bouton, je remplace le fragment1 par fragment2, etc.
Quelle est la meilleure approche pour définir les 3 fragments dans un seul fichier xml de mise en page?
Vous devez utiliser un FrameLayout pour cela, de cette façon, vous n'avez pas à spécifier la classe de fragment dans le XML et de cette façon, il n'est pas limité à une seule classe.
<FrameLayout
Android:id="@+id/contentFragment"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent"
Android:layout_weight="1" />
et que vous pouvez définir le fragment dans le code comme celui-ci
Fragment fragment = new YourFragment();
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction transaction = fm.beginTransaction();
transaction.replace(R.id.contentFragment, fragment);
transaction.commit();
Je donne un exemple pour basculer entre deux dispositions dans des fragments:
Déclarez d'abord une mise en page avec deux fragments: (cela dépend du nombre de fragments que vous voulez dans votre mise en page)
fragment_layout_example.xml
<LinearLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:orientation="horizontal" >
<FrameLayout
Android:id="@+id/fragment_container"
Android:layout_width="0dip"
Android:layout_height="match_parent"
Android:layout_weight="1" />
<fragment
Android:id="@+id/Fragment2"
Android:layout_width="0dip"
Android:layout_height="match_parent"
Android:layout_weight="1"
class="com.example.SecondFragment" >
<!-- Preview: layout=@layout/details -->
</fragment>
</LinearLayout>
La disposition ci-dessus affichera deux fragments Fragment1 et Fragment2. Pour Fragment1, j'avais déclaré le conteneur car le contenu du conteneur allait changer au moment de l'exécution. Donc pas déclaré la classe Fragment
ici. pour en savoir plus sur ce chèque
http://developer.Android.com/training/basics/fragments/fragment-ui.html
Créez ensuite une classe FragmentExampleActivity qui étend Activity
. Dans le cas où vous utilisez Fragment en mode de compatibilité descendante, étendez FragmentActivity
public class FragmentExampleActivity extends FragmentActivity{
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.fragment_layout_example);
// Check that the activity is using the layout version with
// the fragment_container FrameLayout
if (findViewById(R.id.fragment_container) != null) {
// However, if we're being restored from a previous state,
// then we don't need to do anything and should return or else
// we could end up with overlapping fragments.
if (savedInstanceState != null) {
return;
}
// Create an instance of Fragment1
Fragment1 firstFragment = new Fragment1();
// In case this activity was started with special instructions from an Intent,
// pass the Intent's extras to the fragment as arguments
firstFragment.setArguments(getIntent().getExtras());
// Add the fragment to the 'fragment_container' FrameLayout
getSupportFragmentManager().beginTransaction()
.add(R.id.fragment_container, firstFragment).commit();
}
}
}
Pour créer une disposition pour deux fragments, créez deux classes qui étendent Fragment
public class Fagment1 extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
//set the layout you want to display in First Fragment
View view = inflater.inflate(R.layout.fragment1,
container, false);
return view;
}
}
De la même manière, créez la classe Fragment pour le deuxième fragment et définissez la disposition
Maintenant, si vous souhaitez basculer la disposition de votre fragment dans Fragment1 vers une autre disposition en cliquant sur un bouton, créez une autre classe, dites Fragment3.Java et définissez la disposition que vous souhaitez changer et écrivez le code ci-dessous dans Fragment1.Java
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
Button showFragment3=(Button)getView().findViewById(R.id.Button1);
showFragment3.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager
.beginTransaction();
Fragment3 fragment3 = new Fragment3();
fragmentTransaction.replace(R.id.Fragment1, fragment3);
//provide the fragment ID of your first fragment which you have given in
//fragment_layout_example.xml file in place of first argument
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
}
});
}
Maintenant, pour revenir sur le premier fragment, vous pouvez cliquer sur le bouton Retour. Mais si vous voulez revenir en cliquant sur le bouton, écrivez le code ci-dessous dans Fragment3.Java
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
Button showFragment1 = (Button) getView().findViewById(
R.id.Button2);
showFragment1 .setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
getFragmentManager().popBackStack();
}
});
}
Merci! J'espère que cela vous aidera ...