Matheo26 Posté(e) 17 octobre 2017 Share Posté(e) 17 octobre 2017 Bonjour tout le monde, Dans le cadre d'un développement Android, j'ai besoin de concevoir une application qui utilise le même drawer sur chaque activité. J'ai donc suivi un tutoriel sur Internet afin de créer une activité de base avec mon drawer, et me servir de cette activité pour mes autres écrans. Voici mon activité de base : <?xml version="1.0" encoding="utf-8"?> <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true" tools:openDrawer="start"> <FrameLayout layout="@layout/app_bar_main" android:id="@+id/vue" android:paddingTop="?attr/actionBarSize" android:layout_width="match_parent" android:layout_height="match_parent" /> <include layout="@layout/app_bar_main" android:layout_width="match_parent" android:layout_height="match_parent" /> <android.support.design.widget.NavigationView android:id="@+id/nav_view" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_gravity="start" android:fitsSystemWindows="true" app:headerLayout="@layout/nav_header_main" app:menu="@menu/activity_main_drawer" /> </android.support.v4.widget.DrawerLayout> package assistance.utils; [...] public abstract class AppBaseActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener { private FrameLayout vue; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); super.setContentView(R.layout.app_base_activity); vue = (FrameLayout) findViewById(R.id.vue); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); super.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.addDrawerListener(toggle); toggle.syncState(); toolbarSearch = (EditText) findViewById(R.id.toolbarSearch); toolbarSearch.setOnFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View view, boolean b) { //... } }); toolbarSearch.setOnKeyListener(new View.OnKeyListener() { @Override public boolean onKey(View view, int i, KeyEvent keyEvent) { Intent intent = new Intent(getBaseContext(), SearchActivity.class); view.getContext().startActivity(intent); return false; } }); NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view); navigationView.setNavigationItemSelectedListener(this); } public void addView(int layoutResID){ if (vue!=null){ LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE); ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT ); View stubView = inflater.inflate(layoutResID, vue, false); vue.addView(stubView, lp); } } @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) { super.getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); return super.onOptionsItemSelected(item); } @SuppressWarnings("StatementWithEmptyBody") @Override public boolean onNavigationItemSelected(MenuItem item) { int id = item.getItemId(); if (id == R.id.nav_manage) { startActivity(new Intent(this,SettingsActivity.class)); } DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); drawer.closeDrawer(GravityCompat.START); return true; } } Ici, mon activité principale : <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" app:layout_behavior="@string/appbar_scrolling_view_behavior" tools:context="assistance.main.MainActivity"> <TextView android:padding="5dp" android:text="Evolution du chiffre d'affaires" android:background="@drawable/layout_rubrique_title" android:layout_width="match_parent" android:textStyle="bold" android:textSize="16dp" android:layout_height="wrap_content" /> <com.github.mikephil.charting.charts.CombinedChart android:id="@+id/chart" android:layout_marginTop="5dp" android:layout_marginBottom="5dp" android:layout_marginLeft="5dp" android:layout_marginRight="5dp" android:layout_width="match_parent" android:layout_height="200dp" /> <TextView android:padding="5dp" android:text="Affaires en cours" android:background="@drawable/layout_rubrique_title" android:layout_width="match_parent" android:textStyle="bold" android:textSize="16dp" android:layout_height="wrap_content" /> <android.support.v7.widget.RecyclerView android:layout_width="match_parent" android:layout_height="match_parent" android:scrollbars="vertical" android:id="@+id/opportunites" /> </LinearLayout> package assistance.main; [...] import java.util.ArrayList; import java.util.List; import assistance.R; import assistance.utils.AppBaseActivity; public class MainActivity extends AppBaseActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addView(R.layout.content_main); //... } } Et pour finir une autre activité (search) que j'ouvre à partir de mon drawer : <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/content_search" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" app:layout_behavior="@string/appbar_scrolling_view_behavior" tools:context="assistance.main.SearchActivity" > <ScrollView android:id="@+id/seaRecords" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.v7.widget.RecyclerView android:layout_width="match_parent" android:layout_height="wrap_content" android:scrollbars="vertical" android:id="@+id/seaResultats" /> </ScrollView> </RelativeLayout> package assistance.main; [...] public class SearchActivity extends AppBaseActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addView(R.layout.content_search); //... } } Mon drawer s'affiche bien sur chaque activité. Lorsque je lance mon appli l'écran s'affiche correctement sur l'activité principale (voir Screenshot_20171017-093659). En revanche, quand j'ouvre ma seconde activité à partir de mon drawer, un phénomène étrange va se produire. Comme si toutes les vues qui ont été ajoutées à ma FrameLayout dans mon écran principale restaient en mémoire en plus des éléments ajoutés dans mon activité Search. Résultat : les 2 écrans se superposent... Est-ce que quelqu'un a une idée d'où peut venir ce problème ? Merci pour vos retours :-) Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Matheo26 Posté(e) 17 octobre 2017 Auteur Share Posté(e) 17 octobre 2017 Trouvé ! Une ligne avait été oubliée dans mon "app_bar_main.xml" : <include layout="@layout/content_main" /> Du coup sur chaque écran le contenu de mon écran principal était repris, d'où la redondance... Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Recommended Posts
Rejoignez la conversation
Vous pouvez poster maintenant et vous enregistrez plus tard. Si vous avez un compte, connectez-vous maintenant pour poster.