Mon application est structurée avec un tiroir de navigation et 4 fragments. L'ancienne version de cette application utilise des activités, j'ai donc besoin de transformer les activités en fragments.Android force Fragment redessiner lorsque l'écran change d'orientation
Pour l'instant tout fonctionne bien mais dans un Fragment
j'ai 80 Buttons
que l'utilisateur peut définir la couleur de texte et le fond et la méthode qui appellent DialogActivity
est dans le seul MainActivity
qui gèrent l'ensemble Fragments
et onActivityResults
appelé par Dialogs à l'intérieur Fragments
pour gérer changement d'utilisateur.
Le problème se produit lorsque l'orientation de l'écran passe en mode paysage. Si je presse Buttons
et définir le texte et la couleur fonctionne avec le portrait mais si un changement d'orientation de l'écran avec le paysage je reçois quelque chose comme "ombre" comme fond et les boutons que j'ai ne change pas leurs propriétés quand je clique eux, mais si je fais tourner à nouveau l'écran, les boutons modifiés sont devenus visibles. Les choses étranges est que dans le fond Fragment je vois les boutons avec les bonnes mises à jour, mais pas dans le haut ... (je poste une photo, c'est difficile à expliquer)
Les anciens boutons que je change restent modifiés car je l'enregistrer à la DB, mais avec le paysage, je ne peux pas mettre à jour les autres boutons che ...
CODE:
MainActivity.java
public class MainActivity extends AppCompatActivity
implements NavigationView.OnNavigationItemSelectedListener {
static String clickedButtonViewId;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
drawer.setDrawerListener(toggle);
toggle.syncState();
NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
navigationView.setNavigationItemSelectedListener(this);
if (findViewById(R.id.content_frame) != null){
getSupportFragmentManager().beginTransaction()
.add(R.id.content_frame, new OrarioFragment()).commit();
}
}
@Override
public void onBackPressed() {
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
if (drawer.isDrawerOpen(GravityCompat.START)) {
drawer.closeDrawer(GravityCompat.START);
} else {
super.onBackPressed();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
@SuppressWarnings("StatementWithEmptyBody")
@Override
public boolean onNavigationItemSelected(MenuItem item) {
// Handle navigation view item clicks here.
int id = item.getItemId();
FragmentManager fragmentManager = getSupportFragmentManager();
if (id == R.id.nav_orario) {
fragmentManager.beginTransaction()
.replace(R.id.content_frame, new OrarioFragment())
.commit();
} else if (id == R.id.nav_calendario) {
fragmentManager.beginTransaction()
.replace(R.id.content_frame, new CalendarioFragment())
.commit();
} else if (id == R.id.nav_voti) {
fragmentManager.beginTransaction()
.replace(R.id.content_frame, new VotiFragment())
.commit();
} else if (id == R.id.nav_registrazioni) {
fragmentManager.beginTransaction()
.replace(R.id.content_frame, new RegistrazioniFragment())
.commit();
} else if (id == R.id.nav_share) {
} else if (id == R.id.nav_send) {
}
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
drawer.closeDrawer(GravityCompat.START);
return true;
}
public void addMateria(View v){
/* Prendo il nome della risorsa cosi nel ricompilare il progetto non perdo *
* tutti i riferimenti ai bottoni salvati nel database */
clickedButtonViewId = getResources().getResourceEntryName(v.getId());
//StartActivityForResult perche mi aspetto la materia inserita dall'altra activity
Intent myIntent = new Intent(MainActivity.this, ActivityAddMateria.class);
startActivityForResult(myIntent, 1);
//onStop();
}
//Take back data from ActivityAddMateria
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if(requestCode == 1) {
if (resultCode == RESULT_OK) {
MySQLiteHelper db = new MySQLiteHelper(this);
//Cambio subito il Button
int resId = getResources().getIdentifier(clickedButtonViewId, "id", getPackageName());
final Button clickedtextView = (Button) findViewById(resId);
String result = data.getStringExtra("result"); //Take the materia from Dialog
int color = data.getIntExtra("color", 1); //Take the color from Dialog
//Controllo se il Button è già presente nel db se presente aggiorno se non presente inserisco
boolean modifica = db.Exists(clickedButtonViewId);
//Se voglio ripristinare il bottone di default
if (color == getResources().getColor(R.color.blue_orario)) {
//Ripristino la grafica di Default
Drawable style = setButtonColor(color);
clickedtextView.setBackground(style);
clickedtextView.setText("New");
//Se la materia è nel database la cancello
if (modifica) {
db.deleteSingleMateria(clickedButtonViewId);
}
} else {
//Quando inserisco un normale bottone colorato
if (!modifica) {
//Materia da inserire in un nuovo spazio
db.addMateriaToDb(new Materia(clickedButtonViewId, result, color));
} else {
//Materia già presente nel Button quindi aggiorno la materia
db.updateMateria(new Materia(clickedButtonViewId, result, color));
Toast.makeText(getApplicationContext(), "Materia modificata!",
Toast.LENGTH_LONG).show();
}
//Inserisco la materia nel DB dei voti_media
db.addMateriaVotiFromOrario(new MaterieVoti(result, 0.0));
clickedtextView.setText(result);
//clickedtextView.setBackgroundColor(color);
//clickedtextView.getBackground().setColorFilter(color, PorterDuff.Mode.MULTIPLY);
Drawable style = setButtonColor(color);
clickedtextView.setBackground(style);
}
}
if (resultCode == RESULT_CANCELED) {
//Nessuna materia inserita
}
}
}//onActivityResult
EDIT
Ok, j'ai trouvé le problème.
Dans le MainActivity j'ai cette ligne de code pour la force le premier fragment à afficher
if (findViewById(R.id.content_frame) != null){
getSupportFragmentManager().beginTransaction()
.add(R.id.content_frame, new OrarioFragment()).commit();
}
Et lorsque l'orientation de l'écran changer le MainActivity est recréée et si la charge le même fragment sur le vieux fragment parce que J'utilise .add()
Alors, comment puis-je définir le fragment à afficher lorsque l'application commence à éviter ce problème?
Je me trompe dans la gestion du tiroir?
Montrez votre code. – Bryan
@Brian a ajouté le code, si besoin en plus juste dire :) – Dario
Pouvez-vous partager votre mise en page aussi? – JRG