Matheo26

Extends et FrameLayout

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

Share this post


Link to post
Share on other sites

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...

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.