Android:滚动时ScrollView不会清除背景

时间:2018-07-26 18:43:56

标签: java android xml canvas scrollview

我有一个非常奇怪的问题,如下面的图片所示:

Before scrolling

After scrolling

滚动前捕获顶部图片,滚动后捕获底部图片。 Android不会清除背景以擦除初始视图。如果我接受黑色背景,则可以解决此问题(可以通过激活注释的代码来解决此问题 android:background =“#111100”> infragment.xml),但我不会这样做。

fragment_paavalikko.xml:

<div>
  <span>X</span>
  <span>O</span>
  <span>O</span>
</div>
<div>
  <span></span>
  <span>X</span>
  <span></span>
</div>
<div>
  <span></span>
  <span></span>
  <span>X</span>
</div>

activity_aktiviteetti1.xml:

<?xml version="1.0" encoding="utf-8"?>

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_height="fill_parent"
    android:layout_width="fill_parent"
    android:scrollbars="vertical"
    android:id="@+id/vScroll">
    <!--  android:background="#111100">  -->

    <HorizontalScrollView
        android:layout_height="fill_parent"
        android:layout_width="fill_parent"
        android:scrollbars="horizontal"
        android:id="@+id/hScroll">
        <!--  android:background="#111100">  -->

        <LinearLayout
            android:id="@+id/paavalikkoSisalto"
            android:layout_width="match_parent"
            android:layout_height="469dp"
            android:layout_alignParentLeft="true"
            android:layout_alignParentStart="true"
            android:layout_alignParentTop="true"
            android:orientation="horizontal" >

        </LinearLayout>

    </HorizontalScrollView>

</ScrollView>

Activity1.java:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    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"
    tools:context="com.mannonen.tasavalta.Aktiviteetti1" >

    <FrameLayout
        android:id="@+id/aktiviteetti1Sisalto"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </FrameLayout>

</RelativeLayout>

PaaValikko.java

package com.mannonen.tasavalta;

import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.support.v4.app.*;

public class Aktiviteetti1 extends FragmentActivity {

    // Used to load the 'native-lib' library on application startup.
    static {
        System.loadLibrary("native-lib");
    }

    PaaValikko fragmentti1;

    //aktiviteetin konstruktori
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_aktiviteetti1);

        //päävalikko on fragmentissa, joka pitää lisätä aktiviteettiin heti
        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction fragmentTransaction =  fragmentManager.beginTransaction();
        fragmentti1 = new PaaValikko();
        fragmentTransaction.add(R.id.aktiviteetti1Sisalto, fragmentti1);
        fragmentTransaction.commit();

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_aktiviteetti1, 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();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

    /**
     * A native method that is implemented by the 'native-lib' native library,
     * which is packaged with this application.
     */
    public native String stringFromJNI();
}

Muisti.java:

package com.mannonen.tasavalta;

import android.support.v4.app.*;

import java.io.*;
import android.os.Bundle;
import android.view.*;
import android.widget.*;


public class PaaValikko extends Fragment {

    private ScrollView vScroll;
    private HorizontalScrollView hScroll;
    private Muisti mMuisti;
    private LinearLayout[] mPalstat;
    private LinearLayout mJuuri;
    private TextView mBookmarks;
    private ToggleButton mLanguage;
    private ToggleButton mGraphics;
    private Button mCreateBookmark;
    private Button mHelp;
    private Button mAbout;
    private Button mBookmark1;
    private Button mBookmark2;
    private Button mBookmark3;
    private Button mBookmark4;
    private Button mBookmark5;
    private Button mBookmark6;
    private Button mBookmark7;
    private Button mBookmark8;
    private Button mBookmark9;
    private Button[] mTiedostot;
    private TextView m3D1;
    private TextView m3D2;
    private TextView m3D3;
    private TextView m3D4;
    private TextView m3D5;
    private TextView mStories1;
    private TextView mStories2;
    private TextView mStories3;
    private TextView mStories4;
    private TextView mStories5;
    private String[] mTiedostoNimet;
    private int mNimiLaskuri=0;
    private float mx, my;
    private View mView;

    //Tämä luokka käsittelee päävalikon vakionappien sekä
    //mahdollisten kirjanmerkkien onClick tapahtumat
    class VakioNappi implements View.OnClickListener {

        @Override
        public void onClick(View v) {

            int tag=(Integer) v.getTag();
            switch (tag)
            {
                case 2001:
                    v.setBackgroundColor(0xffff0000);
                    break;
                case 2002:
                    v.setBackgroundColor(0xffff0000);
                    break;
                case 2003:
                    v.setBackgroundColor(0xffff0000);
                    break;
                case 2004:
                    v.setBackgroundColor(0xffff0000);
                    break;
                case 2005:
                    v.setBackgroundColor(0xffff0000);
                    break;
                case 2006:
                    v.setBackgroundColor(0xffff0000);
                    break;
                case 2007:
                    v.setBackgroundColor(0xffff0000);
                    break;
                case 2008:
                    v.setBackgroundColor(0xffff0000);
                    break;
                case 2009:
                    v.setBackgroundColor(0xffff0000);
                    break;
                case 2010:
                    v.setBackgroundColor(0xffff0000);
                    break;
                case 2011:
                    v.setBackgroundColor(0xffff0000);
                    break;
                case 2012:
                    v.setBackgroundColor(0xffff0000);
                    break;
                case 2013:
                    v.setBackgroundColor(0xffff0000);
                    break;
                case 2014:
                    v.setBackgroundColor(0xffff0000);
                    break;
            }
        }

    }

    //Tämä luokka käsittelee päävalikon CAD -nappuloiden onClick tapahtumat
    class CADNappi implements View.OnClickListener {

        @Override
        public void onClick(View v) {
            int tag=(Integer) v.getTag();
            String tiedostoNimi=mTiedostoNimet[tag];
            v.setBackgroundColor(0xff0000ff);
        }

    }

    //Tämä luokka käsittelee päävalikon teksti -nappuloiden onClick tapahtumat
    class TekstiNappi implements View.OnClickListener {

        @Override
        public void onClick(View v) {
            int tag=(Integer) v.getTag();
            String tiedostoNimi=mTiedostoNimet[tag];
            v.setBackgroundColor(0xffff00ff);
        }

    }

    //Tätä metodia kutsutaan, kun fragmentti luodaan, joko dynaamisesti
    //tai xml-tiedostosta
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) {

        //Aktivoidaan tiedot kovalevyltä, jos jotain on olemassa
        ObjectInputStream sisaan=null;
        try {
            sisaan=new ObjectInputStream(
                new FileInputStream("Muisti.txt"));
            try {
                mMuisti=(Muisti)sisaan.readObject();
                sisaan.close();
            } catch ( OptionalDataException e) {
                mMuisti=new Muisti();
            } catch (ClassNotFoundException e) {
                mMuisti=new Muisti();
            } catch (IOException e) {
                mMuisti=new Muisti();
            }
        } catch (FileNotFoundException e) {
            mMuisti=new Muisti();
        } catch (StreamCorruptedException e) {
            mMuisti=new Muisti();
        } catch (IOException e) {
            mMuisti=new Muisti();
        }

        // xml tiedostosta luettavat jutut muodostavat View-luokan ilmentymän
        return inflater.inflate(R.layout.fragment_paavalikko, parent, false);
    }

    //Tätä kutsutaan pian onCreateView metodin jälkeen. Kaikkien asetusten
    //määrittäminen laitetaan tänne
    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {

        //Otetaan käyttöön xml-tiedostossa annettuja juttuja
        mJuuri=(LinearLayout) view.findViewById(R.id.paavalikkoSisalto);

        //Sitten horisontaaliseen juureen lisätään tarvittavat palstat
        mPalstat=new LinearLayout[mMuisti.annaPalstat()+1];
        for (int i=0; i<mMuisti.annaPalstat()+1; i++) {
            mPalstat[i]=new LinearLayout(view.getContext());
            mPalstat[i].setOrientation(LinearLayout.VERTICAL);
            mJuuri.addView(mPalstat[i]);
        }

        //Palstoihin lisätään vakiosisältö, eli otsikot ja painonapit.
        //Aloitetaan vasemmasta palstasta ja vakiosisältö ensin
        mBookmarks=new TextView(view.getContext());
        mBookmarks.setText("Bookmarks");
        mBookmarks.setTextSize(25);
        mPalstat[0].addView(mBookmarks);
        mLanguage=new ToggleButton(view.getContext());
        mLanguage.setTextOff("Finnish");
        mLanguage.setTextOn("English");
        mLanguage.setChecked(true);
        mLanguage.setTag(2001);
        mLanguage.setOnClickListener(new VakioNappi());
        mPalstat[0].addView(mLanguage);
        mGraphics=new ToggleButton(view.getContext());
        mGraphics.setTextOff("Use simple graphics");
        mGraphics.setTextOn("Use elaborate graphics");
        mGraphics.setChecked(true);
        mGraphics.setTag(2002);
        mGraphics.setOnClickListener(new VakioNappi());
        mPalstat[0].addView(mGraphics);
        mCreateBookmark=new Button(view.getContext());
        mCreateBookmark.setText("Create bookmark");
        mCreateBookmark.setTag(2003);
        mCreateBookmark.setOnClickListener(new VakioNappi());
        mPalstat[0].addView(mCreateBookmark);
        mHelp=new Button(view.getContext());
        mHelp.setText("Help");
        mHelp.setTag(2004);
        mHelp.setOnClickListener(new VakioNappi());
        mPalstat[0].addView(mHelp);
        mAbout=new Button(view.getContext());
        mAbout.setText("About");
        mAbout.setTag(2005);
        mAbout.setOnClickListener(new VakioNappi());
        mPalstat[0].addView(mAbout);

        //Sitten lisätään sisältöä muisti-luokan mukaisesti. Kirjanmerkit:
        if (mMuisti.onkoKirjanMerkkia(0)) {
            mBookmark1=new Button(view.getContext());
            mBookmark1.setText("Bookmark 1");
            mBookmark1.setTag(2006);
            mBookmark1.setOnClickListener(new VakioNappi());
            mPalstat[0].addView(mBookmark1);
        }
        if (mMuisti.onkoKirjanMerkkia(1)) {
            mBookmark2=new Button(view.getContext());
            mBookmark2.setText("Bookmark 2");
            mBookmark2.setTag(2007);
            mBookmark2.setOnClickListener(new VakioNappi());
            mPalstat[0].addView(mBookmark2);
        }
        if (mMuisti.onkoKirjanMerkkia(2)) {
            mBookmark3=new Button(view.getContext());
            mBookmark3.setText("Bookmark 3");
            mBookmark3.setTag(2008);
            mBookmark3.setOnClickListener(new VakioNappi());
            mPalstat[0].addView(mBookmark3);
        }
        if (mMuisti.onkoKirjanMerkkia(3)) {
            mBookmark4=new Button(view.getContext());
            mBookmark4.setText("Bookmark 4");
            mBookmark4.setTag(2009);
            mBookmark4.setOnClickListener(new VakioNappi());
            mPalstat[0].addView(mBookmark4);
        }
        if (mMuisti.onkoKirjanMerkkia(4)) {
            mBookmark5=new Button(view.getContext());
            mBookmark5.setText("Bookmark 5");
            mBookmark5.setTag(2010);
            mBookmark5.setOnClickListener(new VakioNappi());
            mPalstat[0].addView(mBookmark5);
        }
        if (mMuisti.onkoKirjanMerkkia(5)) {
            mBookmark6=new Button(view.getContext());
            mBookmark6.setText("Bookmark 6");
            mBookmark6.setTag(2011);
            mBookmark6.setOnClickListener(new VakioNappi());
            mPalstat[0].addView(mBookmark6);
        }
        if (mMuisti.onkoKirjanMerkkia(6)) {
            mBookmark7=new Button(view.getContext());
            mBookmark7.setText("Bookmark 7");
            mBookmark7.setTag(2012);
            mBookmark7.setOnClickListener(new VakioNappi());
            mPalstat[0].addView(mBookmark7);
        }
        if (mMuisti.onkoKirjanMerkkia(7)) {
            mBookmark8=new Button(view.getContext());
            mBookmark8.setText("Bookmark 8");
            mBookmark8.setTag(2013);
            mBookmark8.setOnClickListener(new VakioNappi());
            mPalstat[0].addView(mBookmark8);
        }
        if (mMuisti.onkoKirjanMerkkia(8)) {
            mBookmark9=new Button(view.getContext());
            mBookmark9.setText("Bookmark 9");
            mBookmark9.setTag(2014);
            mBookmark9.setOnClickListener(new VakioNappi());
            mPalstat[0].addView(mBookmark9);
        }

        //alustetaan mTiedostoNimet, joita voi olla enintään 2000 riippumatta siitä,
        //ovatko teksti- vai CAD-tiedostoja
        mTiedostoNimet=new String[2000];

        //Siirrytään seuraaviin palstoihin vasemmalta oikealle. 3D-palstoja
        //on enintään 5
        boolean luotu=false;
        int index1=0, index2=0;
        mTiedostot=new Button[mMuisti.annaTiedostojenMaara()];
        for (int i=0; i<mMuisti.annaTiedostojenMaara(); i++) {
            if (mMuisti.annaValikkoSijainti(i)==1 && mMuisti.annaOnko3D(i)) {

                //jos palstaan ei ole vielä lisätty, lisätään otsikko
                if (luotu!=true) {
                    index1++;
                    m3D1=new TextView(view.getContext());
                    m3D1.setText("3D 1");
                    m3D1.setTextSize(25);
                    mPalstat[index1].addView(m3D1);
                    luotu=true;
                }

                //luodaan sitten varsinainen valikkokohta
                mTiedostot[index2]=new Button(view.getContext());
                mTiedostot[index2].setText(mMuisti.annaTiedostonNimi(i));
                mTiedostot[index2].setEnabled(mMuisti.annaOnkoAsetettu(i));
                mTiedostot[index2].setTag(mNimiLaskuri);
                mNimiLaskuri++;
                mTiedostot[index2].setOnClickListener(new CADNappi());
                if (mMuisti.annaOnkoNakyva(i)) {
                    mTiedostot[index2].setVisibility(View.VISIBLE);
                } else {
                    mTiedostot[index2].setVisibility(View.INVISIBLE);
                }
                mPalstat[index1].addView(mTiedostot[index2]);
                index2++;
            }
        }
        luotu=false;
        for (int i=0; i<mMuisti.annaTiedostojenMaara(); i++) {
            if (mMuisti.annaValikkoSijainti(i)==2 && mMuisti.annaOnko3D(i)) {

                 //jos palstaan ei ole vielä lisätty, lisätään otsikko
                if (luotu!=true) {
                    index1++;
                    m3D2=new TextView(view.getContext());
                    m3D2.setText("3D 2");
                    m3D2.setTextSize(25);
                    mPalstat[index1].addView(m3D2);
                    luotu=true;
                }

                //luodaan sitten varsinainen valikkokohta
                mTiedostot[index2]=new Button(view.getContext());
                mTiedostot[index2].setText(mMuisti.annaTiedostonNimi(i));
                mTiedostot[index2].setEnabled(mMuisti.annaOnkoAsetettu(i));
                mTiedostot[index2].setTag(mNimiLaskuri);
                mTiedostoNimet[mNimiLaskuri]=mMuisti.annaTiedostonNimi(i);
                mNimiLaskuri++;
                mTiedostot[index2].setOnClickListener(new CADNappi());
                if (mMuisti.annaOnkoNakyva(i)) {
                    mTiedostot[index2].setVisibility(View.VISIBLE);
                } else {
                    mTiedostot[index2].setVisibility(View.INVISIBLE);
                }
                mPalstat[index1].addView(mTiedostot[index2]);
                index2++;
            }
        }
        luotu=false;
        for (int i=0; i<mMuisti.annaTiedostojenMaara(); i++) {
            if (mMuisti.annaValikkoSijainti(i)==3 && mMuisti.annaOnko3D(i)) {

                //jos palstaan ei ole vielä lisätty, lisätään otsikko
                if (luotu!=true) {
                    index1++;
                    m3D3=new TextView(view.getContext());
                    m3D3.setText("3D 3");
                    m3D3.setTextSize(25);
                    mPalstat[index1].addView(m3D3);
                    luotu=true;
                }

                //luodaan sitten varsinainen valikkokohta
                mTiedostot[index2]=new Button(view.getContext());
                mTiedostot[index2].setText(mMuisti.annaTiedostonNimi(i));
                mTiedostot[index2].setEnabled(mMuisti.annaOnkoAsetettu(i));
                mTiedostot[index2].setTag(mNimiLaskuri);
                mTiedostoNimet[mNimiLaskuri]=mMuisti.annaTiedostonNimi(i);
                mNimiLaskuri++;
                mTiedostot[index2].setOnClickListener(new CADNappi());
                if (mMuisti.annaOnkoNakyva(i)) {
                    mTiedostot[index2].setVisibility(View.VISIBLE);
                } else {
                    mTiedostot[index2].setVisibility(View.INVISIBLE);
                }
                mPalstat[index1].addView(mTiedostot[index2]);
                index2++;
            }
        }
        luotu=false;
        for (int i=0; i<mMuisti.annaTiedostojenMaara(); i++) {
            if (mMuisti.annaValikkoSijainti(i)==4 && mMuisti.annaOnko3D(i)) {

                //jos palstaan ei ole vielä lisätty, lisätään otsikko
                if (luotu!=true) {
                    index1++;
                    m3D4=new TextView(view.getContext());
                    m3D4.setText("3D 4");
                    m3D4.setTextSize(25);
                    mPalstat[index1].addView(m3D4);
                    luotu=true;
                }

                //luodaan sitten varsinainen valikkokohta
                mTiedostot[index2]=new Button(view.getContext());
                mTiedostot[index2].setText(mMuisti.annaTiedostonNimi(i));
                mTiedostot[index2].setEnabled(mMuisti.annaOnkoAsetettu(i));
                mTiedostot[index2].setTag(mNimiLaskuri);
                mTiedostoNimet[mNimiLaskuri]=mMuisti.annaTiedostonNimi(i);
                mNimiLaskuri++;
                mTiedostot[index2].setOnClickListener(new CADNappi());
                if (mMuisti.annaOnkoNakyva(i)) {
                    mTiedostot[index2].setVisibility(View.VISIBLE);
                } else {
                    mTiedostot[index2].setVisibility(View.INVISIBLE);
                }
                mPalstat[index1].addView(mTiedostot[index2]);
                index2++;
            }
        }
        luotu=false;
        for (int i=0; i<mMuisti.annaTiedostojenMaara(); i++) {
            if (mMuisti.annaValikkoSijainti(i)==5 && mMuisti.annaOnko3D(i)) {

                //jos palstaan ei ole vielä lisätty, lisätään otsikko
                if (luotu!=true) {
                    index1++;
                    m3D5=new TextView(view.getContext());
                    m3D5.setText("3D 5");
                    m3D5.setTextSize(25);
                    mPalstat[index1].addView(m3D5);
                    luotu=true;
                }

                //luodaan sitten varsinainen valikkokohta
                mTiedostot[index2]=new Button(view.getContext());
                mTiedostot[index2].setText(mMuisti.annaTiedostonNimi(i));
                mTiedostot[index2].setEnabled(mMuisti.annaOnkoAsetettu(i));
                mTiedostot[index2].setTag(mNimiLaskuri);
                mTiedostoNimet[mNimiLaskuri]=mMuisti.annaTiedostonNimi(i);
                mNimiLaskuri++;
                mTiedostot[index2].setOnClickListener(new CADNappi());
                if (mMuisti.annaOnkoNakyva(i)) {
                    mTiedostot[index2].setVisibility(View.VISIBLE);
                } else {
                    mTiedostot[index2].setVisibility(View.INVISIBLE);
                }
                mPalstat[index1].addView(mTiedostot[index2]);
                index2++;
            }
        }
        luotu=false;
/*

A part of code removed to save space

                        */
    }
}

我需要刷新白色或灰色背景。我已经使用模拟器在Android Studio上测试了此代码,并使用设备在Eclipse上测试了此代码,并且两者都存在问题。

我该怎么办?

2 个答案:

答案 0 :(得分:1)

这里的问题是,您在透明背景的滚动视图后面查看一个片段,有太多代码要看,但是如果您不打算调用fragmentManager.add两次,那么您必须搜索是否只读取同一个片段你想要的。

如果要使用添加(不能使用替换),则必须为不透明的内容设置滚动视图的背景颜色。

在方向更改时,片段将保留,因此您需要将代码更改为if (savedInstance != null) fragment.add,否则它将在方向更改的顶部添加另一个代码

答案 1 :(得分:0)

问题是由于onCreate方法中缺少if子句造成的:

谢谢马科斯,没有您的帮助,我找不到此错误!

案例已关闭。