0

尝试在ViewFlipper. 我想按需添加和删除视图,所以我必须调用而不是使用 XML ViewGroup.addView()。在某些时候,我想通过移除除最后一个之外的所有孩子来清理容器。这是一个演示:

public class MainActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        LinearLayout root = new LinearLayout(this);
        root.setOrientation(LinearLayout.VERTICAL);

        final ViewFlipper flipper = new ViewFlipper(this);

        Animation in = new TranslateAnimation(-200, 0, 0, 0);
        in.setDuration(300);
        Animation out = new TranslateAnimation(0, 200, 0, 0);
        out.setDuration(300);
        flipper.setInAnimation(in);
        flipper.setOutAnimation(out);

        // clean it up
        out.setAnimationListener(new AnimationListener(){

            @Override
            public void onAnimationEnd(Animation animation) {
                flipper.post(new Runnable(){
                    public void run() {
                        flipper.removeViews(0, flipper.getChildCount() - 1);
                    }
                });
            }

            @Override
            public void onAnimationRepeat(Animation animation) {}

            @Override
            public void onAnimationStart(Animation animation) {}
        });

        Button button = new Button(this);
        button.setText("Click me");
        button.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                View a = makeView();
                flipper.addView(a);
                flipper.showNext();
            }
        });

        root.addView(button);
        root.addView(flipper);
        setContentView(root);
    }

    int i = 0;

    public View makeView() {
        TextView tv = new TextView(MainActivity.this);
        tv.setText("TextView#" + i++);
        tv.setTextSize(30);
        return tv;
    }
}

有时我想删除除了最后一个添加的所有孩子,以节省内存,因为这些孩子将永远不会再被使用(也许我可以回收它们,但那是另一回事了)。我在动画侦听器中使用了一个简单的可运行计划View.post(),并且每 3 次就有一次工件。

UsingView.post(Runnable)必需的,因为如果您直接在动画侦听器中删除子项,NullPointerException则会被抛出,因为(至少在 Honeycomb+ 上,它使用显示列表来绘制层次结构)。

注意:我正在为 2.1+ 开发,所以 Honeycomb 动画包不适合。

4

1 回答 1

3

出现这些“工件”是因为在您的情况下,您尝试删除除顶部视图之外的所有视图,从而使当前显示的子项的索引无序。ViewFlipper意志试图弥补这一点,但从表面上看并没有成功。但是你仍然可以做你想做的事,而不会出现这样的视觉问题:

flipper.post(new Runnable() {
    public void run() {

        if (flipper.getChildCount() < 4) // simulate a condition
            return;

        flipper.setInAnimation(null);
        flipper.setOutAnimation(null);

        while (flipper.getChildCount() > 1)
            flipper.removeViewAt(0);

        flipper.setInAnimation(in);
        flipper.setOutAnimation(out);

        assert  flipper.getChildCount() == 1;
    }
});

这应该只在ViewFlipper. 看看代码是否解决了问题。

于 2012-10-13T09:04:03.960 回答