代码之家  ›  专栏  ›  技术社区  ›  Matheo26

活动回收显示错误

  •  0
  • Matheo26  · 技术社区  · 8 年前

    我需要制作一个使用同一抽屉的Android应用程序。我在网上找到了一个教程,这是我的源代码:

    我的AppBaseActivity:

    <?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;
    
    import android.content.Context;
    import android.content.Intent;
    import android.os.Bundle;
    import android.view.KeyEvent;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.support.design.widget.NavigationView;
    import android.support.v4.view.GravityCompat;
    import android.support.v4.widget.DrawerLayout;
    import android.support.v7.app.ActionBarDrawerToggle;
    import android.support.v7.app.AppCompatActivity;
    import android.support.v7.widget.Toolbar;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.view.ViewGroup;
    import android.view.inputmethod.InputMethodManager;
    import android.widget.EditText;
    import android.widget.FrameLayout;
    
    import assistance.R;
    import assistance.main.SearchActivity;
    import assistance.main.SettingsActivity;
    
    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);
        }
    
        @Override
        public void setContentView(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 setContentView(View view){
            if (vue!=null){
                ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(
                        ViewGroup.LayoutParams.MATCH_PARENT,
                        ViewGroup.LayoutParams.MATCH_PARENT
                );
                vue.addView(view, lp);
            }
        }
    
        @Override
        public void setContentView(View view, ViewGroup.LayoutParams params){
            if (vue!=null) {
                vue.addView(view,params);
            }
        }
    
        @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;
        }
    }
    

    XML主要活动:

    <?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 android.graphics.Color;
    import android.os.Bundle;
    import android.support.v4.content.ContextCompat;
    import android.support.v7.widget.LinearLayoutManager;
    import android.support.v7.widget.RecyclerView;
    
    import com.github.mikephil.charting.animation.Easing;
    import com.github.mikephil.charting.charts.CombinedChart;
    import com.github.mikephil.charting.components.AxisBase;
    import com.github.mikephil.charting.components.Description;
    import com.github.mikephil.charting.components.XAxis;
    import com.github.mikephil.charting.components.YAxis;
    import com.github.mikephil.charting.data.BarData;
    import com.github.mikephil.charting.data.BarDataSet;
    import com.github.mikephil.charting.data.BarEntry;
    import com.github.mikephil.charting.data.CombinedData;
    import com.github.mikephil.charting.data.Entry;
    import com.github.mikephil.charting.data.LineData;
    import com.github.mikephil.charting.data.LineDataSet;
    import com.github.mikephil.charting.formatter.IAxisValueFormatter;
    
    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);
            super.setContentView(R.layout.content_main);
            //...
        }
    
    }
    

    最后是XML搜索活动:

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

    和java搜索活动:

    package assistance.main;
    
    import android.content.Context;
    import android.content.Intent;
    import android.os.Bundle;
    import android.support.v7.widget.LinearLayoutManager;
    import android.support.v7.widget.RecyclerView;
    import android.view.KeyEvent;
    import android.view.View;
    import android.view.inputmethod.InputMethodManager;
    import android.widget.EditText;
    
    import assistance.R;
    import assistance.utils.AppBaseActivity;
    
    import java.util.ArrayList;
    
    public class SearchActivity extends AppBaseActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            super.setContentView(R.layout.content_search);
            //...
        }
    
    }
    

    我在每个活动上都有抽屉,但当我从主活动打开另一个活动时,我有一个问题:在主活动的framelayout中添加的所有元素都留在屏幕上,在新元素之前。。。

    有人帮我吗?

    Main activity:

    Search activity:

    1 回复  |  直到 5 年前
        1
  •  0
  •   Sharath kumar    8 年前

    不要重写setContentView()方法。相反,创建一个不同的方法来加载视图。

    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 
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addView(R.layout.content_main);
        //... 
    } 
    

    编辑:

    <include
            layout="@layout/app_bar_main"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    
    推荐文章