精华内容
参与话题
问答
  • View.GONE 和 removeView的区别

    千次阅读 2015-01-06 17:32:50
    gone 和 removeView 的区别: removeView 是将该布局从内存中移除 但是gone是依然还在占用内存 最佳实践: 如果需要多次显隐切换 使用view.gone 如果该view根本不会再用到 建议直接rem

    invisible和gone的区别:

    在于invisible只是不可见,但是依然占位,gone表示将控件去除,显示的效果就像没有这个控件存在。


    gone 和 removeView 的区别:

    removeView 是将该布局从内存中移除

    但是gone是依然还在占用内存


    最佳实践:

    如果需要多次显隐切换 使用view.gone

    如果该view根本不会再用到 建议直接removeView

    展开全文
  • removeView(view)不能移除控件问题

    万次阅读 2012-07-24 10:12:28
    开发中遇到了一个低级错误,viewGroup.remove(view)不能移除控件,检查后发现原来是viewGroup和view不是直接的父子关系 parentview.removeView(childView)即可

    开发中遇到了一个低级错误,viewGroup.remove(view)不能移除控件,检查后发现原来是viewGroup和view不是直接的父子关系

    parentview.removeView(childView)即可

    展开全文
  • 实现View的添加和移除动画

    万次阅读 2017-04-03 13:22:30
    本篇博客将主要介绍如何使用LayoutTransition实现View的添加和移除动画,当然了,这里面有一些坑需要我们自己注意一下!!

    在上一篇的博客中,主要介绍了如何使用GridLayoutAnimationController来实现GridView的item初始加载的动画,但是不论是LayoutAnimationController还是GridLayoutAnimationController都是只在item第一次加载显示去起作用,之后就不会再有动画效果了,当然你可以在适配器里手动添加动画,这个就不介绍了!!

    本篇博客将主要介绍如何使用LayoutTransition实现View的添加和移除动画,当然了,这里面有一些坑需要我们自己注意一下!!

    首先看一下不设置CHANGE_DISAPPEARING和CHANGE_APPEARING动画的效果图:
    这里写图片描述这里写图片描述

    这里我说的没有设置只是没有设置自定义的动画效果,在系统源码中,如果开发者没有设置动画,系统会使用默认的动画,一会看一下源码就清楚了!!!

    再看一下所有动画都设置的效果图:

    这里写图片描述这里写图片描述

    跟上面的一对比还是可以明显感觉出来差别的,这在里就不多说了,先看一下代码吧!!

    主布局文件:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout 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:orientation="vertical">
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            android:weightSum="2">
    
            <Button
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:onClick="addViewToParent"
                android:text="@string/add_view" />
    
            <Button
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:onClick="removeViewFromParent"
                android:text="@string/remove_view" />
        </LinearLayout>
    
        <LinearLayout
            android:id="@+id/view_container"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical">
    
        </LinearLayout>
    
    </LinearLayout>
    

    java文件:

    package com.example.addandremoveanimation;
    
    import android.animation.Animator;
    import android.animation.AnimatorSet;
    import android.animation.LayoutTransition;
    import android.animation.ObjectAnimator;
    import android.animation.PropertyValuesHolder;
    import android.annotation.SuppressLint;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.view.animation.AnimationSet;
    import android.view.animation.BounceInterpolator;
    import android.widget.Button;
    import android.widget.LinearLayout;
    
    public class MainActivity extends AppCompatActivity {
    
        private LinearLayout mViewContainer;
        private int mViewCount = 0;
        private boolean isTransitionFinish = true;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            mViewContainer = (LinearLayout) findViewById(R.id.view_container);
            LayoutTransition mLayoutTransition = new LayoutTransition();
            mLayoutTransition.setAnimator(LayoutTransition.APPEARING, getAppearingAnimation());
            mLayoutTransition.setDuration(LayoutTransition.APPEARING, 200);
            mLayoutTransition.setStartDelay(LayoutTransition.APPEARING, 0);//源码中带有默认300毫秒的延时,需要移除,不然view添加效果不好!!
    
            mLayoutTransition.setAnimator(LayoutTransition.DISAPPEARING, getDisappearingAnimation());
            mLayoutTransition.setDuration(LayoutTransition.DISAPPEARING, 200);
    
            mLayoutTransition.setAnimator(LayoutTransition.CHANGE_APPEARING,getAppearingChangeAnimation());
            mLayoutTransition.setDuration(200);
    
            mLayoutTransition.setAnimator(LayoutTransition.CHANGE_DISAPPEARING,getDisappearingChangeAnimation());
            mLayoutTransition.setDuration(200);
    
            mLayoutTransition.enableTransitionType(LayoutTransition.CHANGE_DISAPPEARING);
            mLayoutTransition.setStartDelay(LayoutTransition.CHANGE_DISAPPEARING, 0);//源码中带有默认300毫秒的延时,需要移除,不然view添加效果不好!!
            mLayoutTransition.addTransitionListener(new LayoutTransition.TransitionListener() {
                @Override
                public void startTransition(LayoutTransition transition, ViewGroup container, View view, int transitionType) {
                    Log.i("zyq","LayoutTransition:startTransition");
                }
    
                @Override
                public void endTransition(LayoutTransition transition, ViewGroup container, View view, int transitionType) {
                    Log.i("zyq","LayoutTransition:endTransition");
                    isTransitionFinish = true;
                }
            });
            mViewContainer.setLayoutTransition(mLayoutTransition);
        }
    
        private Animator getAppearingAnimation() {
            AnimatorSet mSet = new AnimatorSet();
            mSet.playTogether(ObjectAnimator.ofFloat(null, "ScaleX", 2.0f, 1.0f),
                    ObjectAnimator.ofFloat(null, "ScaleY", 2.0f, 1.0f),
                    ObjectAnimator.ofFloat(null, "Alpha", 0.0f, 1.0f),
                    ObjectAnimator.ofFloat(null,"translationX",400,0));
            return mSet;
        }
    
        private Animator getDisappearingAnimation() {
            AnimatorSet mSet = new AnimatorSet();
            mSet.playTogether(ObjectAnimator.ofFloat(null, "ScaleX", 1.0f, 0f),
                    ObjectAnimator.ofFloat(null, "ScaleY", 1.0f, 0f),
                    ObjectAnimator.ofFloat(null, "Alpha", 1.0f, 0.0f),ObjectAnimator.ofFloat(null,"translationX",0,400));
            return mSet;
        }
    
        private Animator getDisappearingChangeAnimation(){
            PropertyValuesHolder pvhLeft = PropertyValuesHolder.ofInt("left", 0, 0);
            PropertyValuesHolder pvhTop = PropertyValuesHolder.ofInt("top", 0, 0);
            PropertyValuesHolder pvhRight = PropertyValuesHolder.ofInt("right", 0, 0);
            PropertyValuesHolder pvhBottom = PropertyValuesHolder.ofInt("bottom", 0, 0);
            PropertyValuesHolder scaleX = PropertyValuesHolder.ofFloat("scaleX",1.0f,0f,1.0f);
            PropertyValuesHolder scaleY = PropertyValuesHolder.ofFloat("scaleY",1.0f,0f,1.0f);
            PropertyValuesHolder rotate = PropertyValuesHolder.ofFloat("rotation",0,0,0);
            return ObjectAnimator.ofPropertyValuesHolder((Object)null,pvhLeft, pvhTop, pvhRight, pvhBottom,scaleX,scaleY,rotate);
        }
    
        private Animator getAppearingChangeAnimation(){
            PropertyValuesHolder pvhLeft = PropertyValuesHolder.ofInt("left", 0, 0);
            PropertyValuesHolder pvhTop = PropertyValuesHolder.ofInt("top", 0, 0);
            PropertyValuesHolder pvhRight = PropertyValuesHolder.ofInt("right", 0, 0);
            PropertyValuesHolder pvhBottom = PropertyValuesHolder.ofInt("bottom", 0, 0);
            PropertyValuesHolder scaleX = PropertyValuesHolder.ofFloat("scaleX",1.0f,3f,1.0f);
            PropertyValuesHolder scaleY = PropertyValuesHolder.ofFloat("scaleY",1.0f,3f,1.0f);
            return ObjectAnimator.ofPropertyValuesHolder((Object)null,pvhLeft, pvhTop, pvhRight, pvhBottom,scaleX,scaleY);
        }
    
        @SuppressLint("StringFormatInvalid")
        public void addViewToParent(View view) {
            if (isTransitionFinish){
                isTransitionFinish = false;
                View view1 = LayoutInflater.from(this).inflate(R.layout.xxxx, mViewContainer, false);
                ((Button) view1).setText(getString(R.string.add_view_content, mViewCount));
                mViewContainer.addView(view1,0);
                mViewCount++;
            }
        }
    
        public void removeViewFromParent(View view) {
            if(isTransitionFinish){
                if (mViewCount >= 1) {
                    isTransitionFinish = false;
                    mViewContainer.removeViewAt((0));
                    mViewCount--;
                }
            }
        }
    }
    

    这里有几点需要说明一下:

    • 添加view和移除view造成其他view改变的动画是有默认的延迟时间,延迟了300毫秒!!不要小看这300毫秒,有时候多了这300毫秒会让你的动画效果看起来很怪异!!
    • 在使用CHANGE_DISAPPEARING和CHANGE_APPEARING动画的时候,构造animator必须使用带PropertyValuesHolder的实例化方法,而且在PropertyValuesHolder的实例化方法中,动画的开始值和结束值都不会正真影响view在完成动画后的显示效果(什么意思,就是这个view在动画结束之后,该是多大还是多大,不会因为在动画中scale的改变而改变,有兴趣的可以自己亲自试验一下),不然动画不生效。除此之外,还有一个更恶心的规定,那就是必须要有
            PropertyValuesHolder pvhLeft = PropertyValuesHolder.ofInt("left", 0, 1);
            PropertyValuesHolder pvhTop = PropertyValuesHolder.ofInt("top", 0, 1);
            PropertyValuesHolder pvhRight = PropertyValuesHolder.ofInt("right", 0, 1);
            PropertyValuesHolder pvhBottom = PropertyValuesHolder.ofInt("bottom", 0, 1);

    这几个属性的动画,感觉都是Layout改变的动画,而自己需要控制的属性动画中,PropertyValuesHolder中的可变长度必须大于2,不然动画不生效!!!
    就像这样:

            PropertyValuesHolder scaleX = PropertyValuesHolder.ofFloat("scaleX",1.0f,3f,1.0f);
            PropertyValuesHolder scaleY = PropertyValuesHolder.ofFloat("scaleY",1.0f,3f,1.0f);

    value参数的个数小于两个的时候,此属性的动画不生效,TMD,规矩还真多!!

    • 在使用CHANGE_DISAPPEARING和CHANGE_APPEARING需要注意,这个动画之所以会生效是因为由于添加或者移除view造成了其他view的位置的改变了,如果其他view的位置并没有因为添加这个view而改变的话,那么恭喜你中奖了,动画也不生效!!这个大家知道就行了,也没有看很多app使用这种动画!!!

    暂时我所了解的限制就是这么多,以后有新的发现会及时补充的,谢谢大家的支持,本次关于LayoutTransition就介绍到这里!!!

    在下一篇动画系列博客中,将介绍如何实现activity之间切换效果,希望大家多多关注!!!

    这是我的微信公众号,如果可以的话,希望您可以帮忙关注一下,这将是对我最大的鼓励了,谢谢!!
    公众号

    代码地址:
    https://github.com/zhuyuqiang2017/Animation

    展开全文
  • android删除一个view中的子view

    千次阅读 2016-06-30 20:30:57
    android系统中已经提供了一些删除父控件中的方法。 如:.removeAllViews(); .removeViews(start, count); .removeViewsInLayout(start, count);...但是有时这些并不是太满足需求,自己写删除子view的方法: ...

    android系统中已经提供了一些删除父控件中的方法。

    如:.removeAllViews();
    .removeViews(start, count);
    .removeViewsInLayout(start, count);

    ....

    但是有时这些并不是太满足需求,自己写删除子view的方法:

    View view = null;(mContentLayout是父控件
    for(int index = mContentLayout.getChildCount();index > 0;index --){
    view = mContentLayout.getChildAt(index);
    if(view != null && view instanceof RecyclerView){
    } else {
    mContentLayout.removeView(view);
    }
    }

    注意:如果索引从index = 0开始删除的话,方法执行完之后,子view还存在,不能删除。(参考removeAllViews系统源码)


    展开全文
  • 最近在项目中碰到一个需求,在编辑一个红包详情页面的时候,需要动态的添加使用条件,并且可以删除,最后提交数据的时候需要获取到条件里面的数据。网上搜了一些答案没有比较满意的解决方法,所以写下此文...
  • 对话框show问题,需要removeView,

    千次阅读 2012-11-13 16:02:40
    报的提示错误: ... You must call removeView() on the child's parent first. 解决方法有两种 1.动态生成EditText et1 = new EditText(this);builder.setView(et1); 2. 放在另一
  • Android中 RemoveView的使用和举例 —— 最全面的APP通知栏适配 [下载完整演示代码,下载完整演示代码,下载完整演示代码](https://github.com/benchegnzhou/AndroidDevelomentArtDemo) 目录 1. ...
  • 转载自:https://blog.csdn.net/hxqneuq2012/article/details/52588536正所谓没有遇到过类似于not attached to window manager、Android removeView view must not be null的开发者不是好工程师,今天我们就来看看...
  • 比如ImgaeView如果有图片,用removeView方法从其父布局中removeView移除之后,好像会一直占用内存,再次addView添加就报OOM。
  • 1、addView窗体泄漏问题:android.view.WindowLeaked android.view.WindowLeaked一般会发生在Activity与Dialog的显示。 (1)dialog、PopupWindown窗体 原因:我们知道Android的每一个Activity都有个...
  • Animation导致removeView无效(源码分析)继续入自定义View的坑,最近实现一个效果的时候,需要动态添加和删除View,所以就要用到ViewGroup中的removeView和addView,按理来说应该很简单,但是我遇到了一个问题,...
  • 前言 想要做一个浮窗文字提示,尝试用WindowManager做,但是发现调用removeView()失败 //获取方式 WindowManager wm =(WindowManager)context.getApplicationContext().getSystemService(WIND...
  • 我以前一直以为,一个View被removeView了之后,就会被回收。其实不是这样的。如果有人引用它。它还是会存在的。removeView和View被回收没有必然的关系。一个View被removeView之后,还可以再次addView到容器中。来自...
  • android removeView

    2011-03-02 18:19:31
    .addview() 完,如果不执行removeView会怎样?
  • 简单的removeView和AddView测试

    千次阅读 2016-08-11 17:18:13
    平时我们在Activity类中的onCreate()方法内,加载布局是这么写的。 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_...
  • 首先,Android中的Fragment是什么? ... 场景: 现有两个Fragment(e.g:LoginFragment、HomeFragment)需要在Android程序运行的时候进行动态加载、切换,这种情况下,比较容器出现的一个问题就是: ...
  • 转载请注明出处:http://blog.csdn.net/crazy1235/article/details/51471280问题描述:Caused by: java.lang.IllegalStateException: The specified child already... You must call removeView() on the child's paren
  • Android的layoutInflate.inflate ()方法讲解,每个参数对应什么状况。为什么会有he specified child already has a parent. You must call removeView()。
  • 利用ionic3 开发的app,在浏览器中运行时,从自己封装的popover中跳转至下一个页面时页面报错:removeView was not found; 原因:页面上调用了两次dismiss()方法。检查代码,多写了一次关闭view的代码。 ...
  • ViewPager里的ViewGroup.removeView(View view);与ViewGroup.removeViewAt有什么区别,为什么在自定义的PagerAdapter里destroyItem方法中,用前者没有错误,用后者,则会出现the specified child already have a ...

空空如也

1 2 3 4 5 ... 20
收藏数 21,829
精华内容 8,731
热门标签
关键字:

removeview