2010-06-19 4 views
2

EDIT: Ce problème peut être lié à BaseAdapter causing ListView to go out of order when scrolledAndroid GridView Inverser Après manipulation Orientation Changement


Mon écran principal de l'application utilise un GridView pour afficher une grille d'icônes. Chaque icône a une image, un nom et une intention. J'ai l'ensemble d'activités pour gérer les changements d'orientation afin que je puisse changer l'arrière-plan. La méthode onCreate met en place GridView avec 3 icônes de test qui ne font rien et une icône de préférences qui ouvre un PreferencesActivity:

super.onCreate(savedInstanceState); 
setContentView(R.layout.main); 

GridView gv = (GridView) findViewById(R.id.main_grid); 
if (getResources().getConfiguration().orientation == 
     Configuration.ORIENTATION_LANDSCAPE) 
    gv.setBackgroundResource(R.drawable.main_bg_horiz); 
else 
    gv.setBackgroundResource(R.drawable.main_bg); 

ArrayList<Icon> icons = new ArrayList<Icon>(); 
icons.add(new Icon("Test 1", R.drawable.test1, null)); 
icons.add(new Icon("Test 2", R.drawable.test2, null)); 
icons.add(new Icon("Test 3", R.drawable.test3, null)); 
icons.add(new Icon("Preferences", R.drawable.perferences, new Intent(this, 
     AlertPreferences.class))); 
IconAdapter ia = new IconAdapter(icons); 
gv.setAdapter(ia); 
gv.setOnItemClickListener(new OnItemClickListener() { 
    @Override 
    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3){ 
     Intent i = ((IconAdapter)arg0.getAdapter()).getItem(arg2).getIntent(); 
     if (i != null) 
      HomeActivity.this.startActivity(i); 
    } 
}); 

Et le onConfigurationChanged est très simple:

super.onConfigurationChanged(newConfig);  
GridView gv = (GridView) findViewById(R.id.main_grid); 

if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) 
    gv.setBackgroundResource(R.drawable.main_bg_horiz); 
else 
    gv.setBackgroundResource(R.drawable.main_bg); 

L'arrière-plan très bien, mais le code introduit un nouveau problème avec le GridView. Quelle que soit l'orientation que je commence l'application dans cela fonctionne très bien. Cependant, lorsque je change d'orientation, l'ordre des icônes dans le GridView s'inverse. Et quand je ramène l'écran à l'orientation dans laquelle il a commencé, tout redevient normal. Que se passe t-il ici?

Répondre

0

Essayez de séparer la logique où vous configurez l'interface utilisateur:

GridView gv; 

public void onCreate(Bundle savedInstanceState){ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    configureYourUIHere();  
} 

public void configureYourUIHere(){ 
    gv = (GridView) findViewById(R.id.main_grid); 
    if (getResources().getConfiguration().orientation == 
      Configuration.ORIENTATION_LANDSCAPE) 
     gv.setBackgroundResource(R.drawable.main_bg_horiz); 
    else 
     gv.setBackgroundResource(R.drawable.main_bg); 

    ArrayList<Icon> icons = new ArrayList<Icon>(); 
    icons.add(new Icon("Test 1", R.drawable.test1, null)); 
    icons.add(new Icon("Test 2", R.drawable.test2, null)); 
    icons.add(new Icon("Test 3", R.drawable.test3, null)); 
    icons.add(new Icon("Preferences", R.drawable.perferences, new Intent(this, 
      AlertPreferences.class))); 
    IconAdapter ia = new IconAdapter(icons); 
    gv.setAdapter(ia); 
    gv.setOnItemClickListener(new OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3){ 
      Intent i = ((IconAdapter)arg0.getAdapter()).getItem(arg2).getIntent(); 
      if (i != null) 
       HomeActivity.this.startActivity(i); 
     } 
    }); 
} 

public void onConfigurationChanged(Configuration newConfig){ 
    super.onConfigurationChanged(newConfig);  
    configureYourUIHere(); 
} 
+0

Rated trop tôt. J'ai passé un peu plus de temps à tester et j'ai trouvé que je pouvais encore causer le problème si j'appuyais sur le bouton Préférences (donc l'activité des préférences apparaît), faire pivoter l'écran, puis appuyer sur le bouton Retour. Il doit y avoir une meilleure solution que de devoir tout réinitialiser à chaque fois que l'écran est pivoté ou qu'il a pu être pivoté. –

+0

En fait, Android appelle les méthodes 'onDestroy' et' onCreate' lorsque l'orientation change, vous devez donc réinitialiser l'interface utilisateur. Dans ce cas précis, ce que vous pouvez faire c'est essayer de gérer cette 'rotation' par vous-même, plutôt que de laisser le système d'exploitation le faire. Vous pouvez le faire en ajoutant ceci à la référence d'activité sur le manifeste: 'android: configChanges =" keyboardHidden | orientation "' – Cristian

+0

J'ai déjà cette ligne dans mon manifeste. Je ne peux pas non plus les supprimer et les laisser aller à 'onCreate' à chaque fois parce que même si cela n'a pas d'importance dans cette activité spécifique, j'en ai d'autres similaires. –