这个问题在看前面的是不是哪儿有什么逻辑问题
说你的addView()方法引用了一个空对象,说明你的ImageBarnnerViewGroup是空
是你看错了吧,没有拼错呀
xml的设置语言要仔细了,出错不好看
判空一下,或者看下一节中有解决方案:设置一下监听
安卓没那么简单的 学的越多 懂得越多。
往下看完之后可能就会错误消除了,之后老师会讲解之前出现的BUG
android:layout_height="wrap_content" //因为你将高度设置为包裹内容,那么图片有多高轮播图就有多高, //你可以设置为match_parent,这样就可以占满整个屏幕了
import android.content.Context; import android.graphics.Bitmap; import android.graphics.Color; import android.os.Build; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.util.AttributeSet; import android.view.Gravity; import android.view.ViewGroup; import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.LinearLayout; import com.example.administrator.asapplication.ImageVariable; import com.example.administrator.asapplication.R; import java.util.List; public class ImageBarnnerFramLayout extends FrameLayout implements ImageBarnnerViewGroup.ImageBarnnerViewGroupLisnner, ImageBarnnerViewGroup.ImageBarnnerLister{ private ImageBarnnerViewGroup imageBarnnerViewGroup; private LinearLayout linearLayout; private FramLayoutLisenner lisenner; public FramLayoutLisenner getLisenner() { return lisenner; } public void setLisenner(FramLayoutLisenner lisenner) { this.lisenner = lisenner; } public ImageBarnnerFramLayout(@NonNull Context context) { super(context); initImageBarnnerViewGroup(); initDotLinearLayout(); } public ImageBarnnerFramLayout(@NonNull Context context, @Nullable AttributeSet attrs) { super(context, attrs); initImageBarnnerViewGroup(); initDotLinearLayout(); } public ImageBarnnerFramLayout(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); initImageBarnnerViewGroup(); initDotLinearLayout(); } public void addBitmap( List<Bitmap> list){ for(int i = 0; i<list.size(); i++){ Bitmap bitmap = list.get(i); addBitmapToImageBarnnerViewGroup(bitmap); addDotToLinearlayout(); } } private void addBitmapToImageBarnnerViewGroup(Bitmap bitmap){ ImageView iv = new ImageView(getContext()); iv.setScaleType(ImageView.ScaleType.CENTER_CROP); iv.setLayoutParams(new ViewGroup.LayoutParams(ImageVariable.WIDTH, ImageVariable.HEIGHT/4)); iv.setImageBitmap(bitmap); imageBarnnerViewGroup.addView(iv); } private void addDotToLinearlayout(){ ImageView iv = new ImageView(getContext()); LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT); lp.setMargins(5, 5, 5 ,5); iv.setLayoutParams(lp); iv.setImageResource(R.drawable.dot_normal); linearLayout.addView(iv); } /** * 初始化我们自定义图片轮播图功能的核心类 */ private void initImageBarnnerViewGroup(){ imageBarnnerViewGroup = new ImageBarnnerViewGroup(getContext()); FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT); imageBarnnerViewGroup.setLayoutParams(lp); imageBarnnerViewGroup.setBarnnerViewGroupLisnner(this);//这里就是将Lisnner,传递给Framlayout imageBarnnerViewGroup.setLister(this); addView(imageBarnnerViewGroup); } /** * 初始化我们的底部圆点布局 */ private void initDotLinearLayout(){ linearLayout = new LinearLayout(getContext()); FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, 40); linearLayout.setLayoutParams(lp); linearLayout.setOrientation(LinearLayout.HORIZONTAL);//方向:水平居中 linearLayout.setGravity(Gravity.CENTER); linearLayout.setBackgroundColor(Color.RED);//轮播图圆点的背景颜色 addView(linearLayout); FrameLayout.LayoutParams layoutParams = (LayoutParams) linearLayout.getLayoutParams(); layoutParams.gravity = Gravity.BOTTOM; linearLayout.setLayoutParams(layoutParams); //版本3.0以后的用setAlpha(),3.0之前用的是setAlpha(),但是调用者不同 if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB){ linearLayout.setAlpha(0.5f); }else{ linearLayout.getBackground().setAlpha(100); } } @Override public void selectImage(int index) { int count = linearLayout.getChildCount(); for (int i = 0; i < count; i++) { ImageView iv = (ImageView) linearLayout.getChildAt(i); if( i == index){ iv.setImageResource(R.drawable.dot_select); }else { iv.setImageResource(R.drawable.dot_normal); } } } @Override public void clickImageIndex(int pos){ lisenner.clickImageIndex(pos); } public interface FramLayoutLisenner{ void clickImageIndex(int pos); } }
抄错了 不是children 而是childWidth 尴尬
应该是导入错了包 ,导入的包是这个import android.os.Handler;
也许可能
对于OOM,其实最重要的是注意不要Memory Leak。而Memory Leak是会有多个方面会引起的,比如Drawable, RemoteViews, Receiver, Cursor,InputStream, MediaPlayer等,此外,如果使用JNI也会因为C或C++的代码导致Memory Leak。
除了Memory Leak,大数据量的操作也会导致OOM,比如之前其他回答提到的Bitmap,还有ListAdapter,如果在getView时处理不当,也很容易导致OOM,所以在ListAdapter时应该尽量使用convertView。
最后,可以用android.os.StrictMode以及Eclipse的MAT工具来进行OOM和Memory Leak的检测。
作者:Billy Cui
链接:https://www.zhihu.com/question/19772290/answer/13325580
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
上次你的手指滑动界面 滚动是否已经结束
预先加载图片吧
//用户滑到了最右边图 else if (index > children - 1){ index = children - 1; }
看看你的这段代码是不是大于号写成了小于号
感觉你应该是测量那部分代码写错了或者漏写了;代码如下:
@Override //测量,先测量子视图的宽度和高度,然后求出ViewGroup的宽度和高度和 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { // TODO Auto-generated method stub super.onMeasure(widthMeasureSpec, heightMeasureSpec); //1.求出子视图的个数 children=getChildCount(); //2.求出子视图的宽和高 if(children==0){ setMeasuredDimension(0, 0); //重新设置宽高 }else{ measureChildren(widthMeasureSpec, heightMeasureSpec); //viewgroup的高度就是第一个子视图的高度,宽度就是所有子视图宽度之和 View view=getChildAt(0); //3.求出ViewGroup的宽和高 view_height=view.getMeasuredHeight(); view_width=view.getMeasuredWidth(); int width=view_width*children;//ViewGroup的总宽度 setMeasuredDimension(width, view_height); } }