Aller au contenu

Extends et FrameLayout


Matheo26

Recommended Posts

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 :-)

 

 

 

 

 

Screenshot_20171017-093659.png

Screenshot_20171017-093612.png

Lien vers le commentaire
Partager sur d’autres sites

Rejoignez la conversation

Vous pouvez poster maintenant et vous enregistrez plus tard. Si vous avez un compte, connectez-vous maintenant pour poster.

Invité
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

×
×
  • Créer...