3 votes

les fragments et le traitement des changements d'orientation

J'ai une activité qui contient un fragment.

Je voudrais gérer moi-même le changement d'orientation, j'ai donc mis à jour le manifeste pour qu'il ressemble à ceci :

    <activity android:name="com.test.app" android:configChanges="orientation|keyboardHidden"/>

Puis j'ai mis à jour l'activité pour qu'elle ressemble à ceci :

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        updateLayout();
    }

y

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        updateLayout();
    }

    private void updateLayout() {
        setContentView(R.layout.my_layout);
    }

Je fais aussi cela avec le fragment :

    fragment.setRetainInstance(true);

Le problème que j'ai est que lorsque je fais l'orientation de l'écran, il échoue sur le setContentView() disant qu'il y a un id en double pour mon fragment. Je ne sais pas comment faire pour que cela ne se produise pas - des idées ?

tia.

1voto

Adam Points 6342

Je pense que c'est parce que vous lui avez dit de ne pas jeter votre ancienne mise en page, donc lorsque vous la faites pivoter, vous avez toujours votre ancienne vue (qui dans ce cas, est la même que la nouvelle vue, d'où les conflits d'ID).

Aussi, je ne suis pas sûr, mais je pense que ceci :

fragment.setRetainInstance(true);

n'est pas nécessaire ? Parce qu'ici, vous lui dites de NE PAS recréer votre activité lors des changements de configuration :

android:configChanges="orientation|keyboardHidden"

D'après mon expérience, le paramètre configChanges dans le XML est suffisant pour empêcher la recréation.

EDIT :

Mmmm je regarde à nouveau, comment utilisez-vous exactement Fragments ? Si le code posté ici provient de votre FragmentActivity, alors je m'attendrais à quelque chose comme ceci pour gonfler votre Fragment et l'ajouter à l'Activity :

class SomeActivity extends FragmentActivity
{
    ...
    @Override
    public void onCreate( Bundle savedInstance )
    {
    ...
        LayoutInflater inflater = getLayoutInflater();
        inflater.inflate( R.layout.some_fragment, root );
    ...
    }
}

Avec ce XML qui ressemble à quelque chose comme : quelque_fragment.xml

<?xml version="1.0" encoding="utf-8"?>
<fragment
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:name="com.someapp.fragments.SomeFragment">
</fragment>

Donc je suppose que je ne comprends pas bien comment vous utilisez les fragments. Mais en les utilisant de cette manière, avec le paramètre de configuration XML, je parviens à désactiver la recréation sur rotation.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X