Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/223.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android:尝试调用一个空对象引用的虚拟方法_Android_Android Canvas_Android Orientation_Android Bitmap_Android Savedstate - Fatal编程技术网

Android:尝试调用一个空对象引用的虚拟方法

Android:尝试调用一个空对象引用的虚拟方法,android,android-canvas,android-orientation,android-bitmap,android-savedstate,Android,Android Canvas,Android Orientation,Android Bitmap,Android Savedstate,我有一些问题。在我的代码中,我试图在屏幕旋转时重新绘制绘制在黑板上的图形。但我得到了空对象引用异常 在我的代码中,位图是一个位图数组列表 这是我的saveInstanceState代码 @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); bitArrayStore(j); outState.putParcelableArra

我有一些问题。在我的代码中,我试图在屏幕旋转时重新绘制绘制在黑板上的图形。但我得到了空对象引用异常

在我的代码中,位图是一个位图数组列表

这是我的saveInstanceState代码

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    bitArrayStore(j);
    outState.putParcelableArrayList("Bits", bitmaps);
    outState.putInt("j", j);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
    bitmaps=savedInstanceState.getParcelableArrayList("Bits");
    j = savedInstanceState.getInt("j");
    redraww();
}
这里是bitArrayStore()

这是我的onRestoreInstanceState代码

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    bitArrayStore(j);
    outState.putParcelableArrayList("Bits", bitmaps);
    outState.putInt("j", j);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
    bitmaps=savedInstanceState.getParcelableArrayList("Bits");
    j = savedInstanceState.getInt("j");
    redraww();
}
我的重画方法

public void redraww()
    {
        try{

            drawView.redraw(bitmaps, j);
        }catch (IndexOutOfBoundsException e){
            drawView.startNew();
        }

    }
redraw()方法(这里是我获取异常的地方,我已经记录了它)

图形在屏幕旋转时未重新绘制,而是出现此异常。我无法解决此问题。请帮忙

编辑:我的程序java代码

NewNote.java

public class NewNote extends AppCompatActivity implements View.OnClickListener {


    private DrawingView drawView;
    private ImageButton currPaint;
    private float smallBrush = 5, mediumBrush = 10, largeBrush = 30;
    String ucolor;
    int i = 0, j = 0;
    private boolean flag = false, flag1 = false;
    ArrayList<Bitmap> bitmaps;
    Bitmap[] bits;
    @Bind(R.id.colornsize)
    ViewGroup colorNsize;
    @Bind(R.id.eraserdrawer)
    ViewGroup eraserDrawer;
    @Bind(R.id.blue_paint)
    ImageButton bluePaint;
    @Bind(R.id.small_brush)
    ImageButton smallBtn;
    @Bind(R.id.medium_brush)
    ImageButton mediumBtn;
    @Bind(R.id.large_brush)
    ImageButton largeBtn;
    @Bind(R.id.small_eraser)
    ImageButton smallEraser;
    @Bind(R.id.medium_eraser)
    ImageButton mediumEraser;
    @Bind(R.id.large_eraser)
    ImageButton largeEraser;
    @Bind(R.id.bottom_drawer)
    ViewGroup btm;
    @Bind(R.id.previousbtn)
    ImageButton previousBtn;
    @Bind(R.id.nextbtn)
    ImageButton nextBtn;
    @Bind(R.id.framelayout)
    FrameLayout frameLayout;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.notespage_newnote);
        ButterKnife.bind(this);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);


        drawView = (DrawingView) findViewById(R.id.drawing);
        currPaint = bluePaint;
        currPaint.setImageResource(R.drawable.paint_pressed);
        smallBrush = getResources().getInteger(R.integer.small_size);
        mediumBrush = getResources().getInteger(R.integer.medium_size);
        largeBrush = getResources().getInteger(R.integer.large_size);
        drawView.setBrushSize(mediumBrush);
        bitmaps = new ArrayList<Bitmap>();
        bits = new Bitmap[40];
        drawView.setDrawingCacheEnabled(true);
        smallBtn.setOnClickListener(this);
        mediumBtn.setOnClickListener(this);
        largeBtn.setOnClickListener(this);
        smallEraser.setOnClickListener(this);
        mediumEraser.setOnClickListener(this);
        largeEraser.setOnClickListener(this);
        previousBtn.setOnClickListener(this);
        nextBtn.setOnClickListener(this);




        drawView.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                switch (event.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                        btm.setVisibility(View.GONE);
                        break;
                    case MotionEvent.ACTION_UP:
                        btm.setVisibility(View.VISIBLE);
                        break;
                    default:
                        return false;
                }

                return false;
            }
        });


    }


    public void paintClicked(View view) {
        //use chosen color
        drawView.setErase(false);
        drawView.setBrushSize(drawView.getLastBrushSize());
        if (view != currPaint) {
            //update color
            ImageButton imgView = (ImageButton) view;
            String color = view.getTag().toString();
            drawView.setColor(color);

            imgView.setImageDrawable(getResources().getDrawable(R.drawable.paint_pressed));
            currPaint.setImageDrawable(getResources().getDrawable(R.drawable.paint));
            currPaint = (ImageButton) view;
        }
        hideDrawer(colorNsize);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.newnote_menu, 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();

        //noinspection SimplifiableIfStatement
        if (id == R.id.clear_menuitem) {
            hideDrawer(colorNsize);
            hideDrawer(eraserDrawer);
            AlertDialog.Builder newDialog = new AlertDialog.Builder(this);
            newDialog.setTitle("Clear Board");
            newDialog.setMessage("Do you want to clear the board (you will lose the current drawing)?");
            newDialog.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                    drawView.startNew();
                    bitmaps.remove(j);
                    flag1 = true;

                    dialog.dismiss();
                }
            });
            newDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                    dialog.cancel();
                }
            });
            newDialog.show();

            return true;
        } else if (id == R.id.save_menuitem) {
            hideDrawer(colorNsize);
            hideDrawer(eraserDrawer);
            bitArrayStore(j);
            int k = 0;
            try {

                while (k <= bitmaps.size()) {


                    Bitmap m = null;

                    m = bitmaps.get(k);

                    String path = Environment.getExternalStorageDirectory().getAbsolutePath();
                    File file = new File(path + File.separator + "Pictures" + File.separator + k + "_image.png");
                    FileOutputStream ostream;
                    try {
                        file.createNewFile();
                        ostream = new FileOutputStream(file);
                        m.compress(Bitmap.CompressFormat.PNG, 100, ostream);
                        ostream.flush();
                        ostream.close();

                        final Snackbar snackbar = Snackbar.make(frameLayout, "Note Saved", Snackbar.LENGTH_LONG);
                        snackbar.setAction("Close", new View.OnClickListener() {
                            @Override
                            public void onClick(View v) {
                                snackbar.dismiss();
                            }
                        });
                        snackbar.show();

                    } catch (Exception e) {
                        e.printStackTrace();
                        Log.w("Skoolify", e);
                    }
                    k = k + 1;
                }
            } catch (IndexOutOfBoundsException e) {
                Log.w("Skoolify", "OutOFBonds");
            }
            return true;
        } else if (id == R.id.brush_menuitem) {
            if (colorNsize.getVisibility() == View.VISIBLE) {
                hideDrawer(colorNsize);
            } else {
                hideDrawer(eraserDrawer);
                showDrawer(colorNsize);
            }

            return true;
        } else if (id == R.id.eraser_menuitem) {
            if (eraserDrawer.getVisibility() == View.VISIBLE) {
                hideDrawer(eraserDrawer);
            } else {
                hideDrawer(colorNsize);
                showDrawer(eraserDrawer);
            }

            return true;
        }

        else if(id==R.id.delete_menuitem){
            hideDrawer(colorNsize);
            hideDrawer(eraserDrawer);
            AlertDialog.Builder newDialog = new AlertDialog.Builder(this);
            newDialog.setTitle("Discard the Notes");
            newDialog.setMessage("Do you want to discard the unsaved notes?");
            newDialog.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                    NewNote.this.finish();

                    dialog.dismiss();
                }
            });
            newDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                    dialog.cancel();
                }
            });
            newDialog.show();

        }

        return super.onOptionsItemSelected(item);
    }


    @Override
    public void onClick(View v) {
        if (v.getId() == R.id.small_brush) {
            drawView.setBrushSize(smallBrush);
            drawView.setLastBrushSize(smallBrush);
            drawView.setErase(false);
            hideDrawer(colorNsize);
        } else if (v.getId() == R.id.medium_brush) {
            drawView.setBrushSize(mediumBrush);
            drawView.setLastBrushSize(mediumBrush);
            drawView.setErase(false);
            hideDrawer(colorNsize);
        } else if (v.getId() == R.id.large_brush) {
            drawView.setBrushSize(largeBrush);
            drawView.setLastBrushSize(largeBrush);
            drawView.setErase(false);
            hideDrawer(colorNsize);
        } else if (v.getId() == R.id.small_eraser) {
            drawView.setErase(true);
            drawView.setBrushSize(smallBrush);
            hideDrawer(eraserDrawer);
        } else if (v.getId() == R.id.medium_eraser) {
            drawView.setErase(true);
            drawView.setBrushSize(mediumBrush);
            hideDrawer(eraserDrawer);
        } else if (v.getId() == R.id.large_eraser) {
            drawView.setErase(true);
            drawView.setBrushSize(largeBrush);
            hideDrawer(eraserDrawer);
        } else if (v.getId() == R.id.previousbtn) {
            hideDrawer(colorNsize);
            hideDrawer(eraserDrawer);
            try {
                bitArrayStore(j);
                drawView.startNew();
                j--;
                if (bitmaps.size() > j) {
                    drawView.redraw(bitmaps, j);
                }
            } catch (IndexOutOfBoundsException e) {
                j = 0;
                try {
                    drawView.redraw(bitmaps, j);
                }catch (IndexOutOfBoundsException e1){
                    drawView.startNew();
                }
            }
            flag = false;
        } else if (v.getId() == R.id.nextbtn) {
            hideDrawer(colorNsize);
            hideDrawer(eraserDrawer);
            if (j < 50) {
                bitArrayStore(j);
                if (flag == false) {
                    j++;
                }
                if (bitmaps.size() > j) {
                    drawView.startNew();
                    drawView.redraw(bitmaps, j);
                } else {
                    drawView.startNew();
                }
                flag = false;
            } else {
                Snackbar.make(v, "Reached page limit. Please save and start new note", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }

        }


    }


    public void bitArrayStore(int k) {

        if (drawView.canvasBitmap.sameAs(drawView.emptyBitmap)) {
            flag = true;
        } else {

            try {
                if (flag1 == false) {
                    drawView.buildDrawingCache();
                    drawView.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH);
                    bitmaps.set(k, Bitmap.createBitmap(drawView.getDrawingCache()));

                } else {
                    bitmaps.add(k, Bitmap.createBitmap(drawView.getDrawingCache()));
                    flag1 = false;
                }
            } catch (IndexOutOfBoundsException e) {
                bitmaps.add(k, Bitmap.createBitmap(drawView.getDrawingCache()));

            }
            drawView.destroyDrawingCache();

        }
    }

    public void redraww()
    {
        try{

            drawView.redraw(bitmaps, j);
        }catch (IndexOutOfBoundsException e){
            drawView.startNew();
        }

    }
    public void hideDrawer(ViewGroup viewgrp) {
        viewgrp.setVisibility(View.GONE);
    }

    public void showDrawer(ViewGroup viewgrp) {
        viewgrp.setVisibility(View.VISIBLE);
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        bitArrayStore(j);
        outState.putParcelableArrayList("Bits", bitmaps);
        outState.putInt("j", j);
        super.onSaveInstanceState(outState);
    }

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        bitmaps=savedInstanceState.getParcelableArrayList("Bits");
        j = savedInstanceState.getInt("j");
        redraww();

    }
}
public类NewNote扩展AppCompative活动实现View.OnClickListener{
私有DrawingView drawView;
私人图像处理;
私人浮动小刷子=5,中等刷子=10,大刷子=30;
彩色线;
int i=0,j=0;
私有布尔标志=false,标志1=false;
阵列列表位图;
位图[]位;
@绑定(R.id.colornsize)
视图组颜色化;
@绑定(R.id.橡皮擦绘图器)
视图组橡皮擦绘图器;
@绑定(R.id.蓝色油漆)
蓝漆;
@绑定(R.id.小刷)
图像按钮;
@绑定(R.id.中刷)
ImageButton mediumBtn;
@绑定(R.id.大刷)
图像按钮大;
@绑定(R.id.small_橡皮擦)
图像擦除器;
@绑定(R.id.medium\u橡皮擦)
图像按钮式中继器;
@绑定(R.id.large_橡皮擦)
图像按钮放大镜;
@绑定(右id底部抽屉)
视图组btm;
@绑定(R.id.previousbtn)
ImageButton-previousBtn;
@绑定(R.id.nextbtn)
图像按钮nextBtn;
@绑定(R.id.framelayout)
框架布局框架布局;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.notespage_newnote);
把(这个)绑起来;
Toolbar Toolbar=(Toolbar)findViewById(R.id.Toolbar);
设置支持操作栏(工具栏);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
drawView=(DrawingView)findViewById(R.id.drawing);
currPaint=蓝色颜料;
currPaint.setImageResource(R.drawable.paint_pressed);
smallBrush=getResources().getInteger(R.integer.small\u size);
mediumBrush=getResources().getInteger(R.integer.medium\u size);
largeBrush=getResources().getInteger(R.integer.large_size);
drawView.Size(mediumBrush);
位图=新的ArrayList();
位=新位图[40];
drawView.setDrawingCacheEnabled(true);
smallBtn.setOnClickListener(此);
mediumBtn.setOnClickListener(此);
largeBtn.setOnClickListener(此);
smallEraser.setOnClickListener(此);
mediumEraser.setOnClickListener(此);
largeEraser.setOnClickListener(此);
上一个btn.setOnClickListener(此);
nextBtn.setOnClickListener(此);
drawView.setOnTouchListener(新视图.OnTouchListener(){
@凌驾
公共布尔onTouch(视图v,运动事件){
开关(event.getAction()){
case MotionEvent.ACTION\u DOWN:
btm.setVisibility(View.GONE);
打破
case MotionEvent.ACTION\u UP:
btm.setVisibility(View.VISIBLE);
打破
违约:
返回false;
}
返回false;
}
});
}
已单击公共空视图(视图){
//使用选定的颜色
drawView.setErase(false);
setBrushSize(drawView.getLastBrushSize());
如果(视图!=currPaint){
//更新颜色
ImageButton imgView=(ImageButton)视图;
字符串颜色=view.getTag().toString();
drawView.setColor(颜色);
imgView.setImageDrawable(getResources().getDrawable(R.drawable.paint_pressed));
setImageDrawable(getResources().getDrawable(R.drawable.paint));
currPaint=(图像按钮)视图;
}
hideDrawer(彩色);
}
@凌驾
公共布尔onCreateOptions菜单(菜单){
getMenuInflater().充气(R.menu.newnote\u菜单,菜单);
返回true;
}
@凌驾
公共布尔值onOptionsItemSelected(菜单项项){
//处理操作栏项目单击此处。操作栏将
//自动处理Home/Up按钮上的点击,只要
//在AndroidManifest.xml中指定父活动时。
int id=item.getItemId();
//noinspection SimplifiableIf语句
if(id==R.id.clear\u menuitem){
hideDrawer(彩色);
hideDrawer(橡皮擦绘图器);
AlertDialog.Builder newDialog=新建AlertDialog.Builder(此);
newDialog.setTitle(“清除板”);
newDialog.setMessage(“是否要清除电路板(您将丢失当前图形)?”;
newDialog.setPositiveButton(“是”,新建DialogInterface.OnClickListener(){
public void onClick(DialogInterface dialog,int which){
drawView.startNew();
位图。删除(j);
flag1=真;
dialog.dismise();
}
});
newDialog.setNegativeButton(“取消”,新建DialogInterface.OnClickListener()){
public void onClick(DialogInterface dialog,int which){
dialog.cancel();
}
});
newDialog.show();
返回true;
}else if(id==R.id.save\u menuitem){
hideDrawer(彩色);
hideDrawer(橡皮擦绘图器);
bitArrayStore(j);
int k=0;
试一试{
虽然
public class NewNote extends AppCompatActivity implements View.OnClickListener {


    private DrawingView drawView;
    private ImageButton currPaint;
    private float smallBrush = 5, mediumBrush = 10, largeBrush = 30;
    String ucolor;
    int i = 0, j = 0;
    private boolean flag = false, flag1 = false;
    ArrayList<Bitmap> bitmaps;
    Bitmap[] bits;
    @Bind(R.id.colornsize)
    ViewGroup colorNsize;
    @Bind(R.id.eraserdrawer)
    ViewGroup eraserDrawer;
    @Bind(R.id.blue_paint)
    ImageButton bluePaint;
    @Bind(R.id.small_brush)
    ImageButton smallBtn;
    @Bind(R.id.medium_brush)
    ImageButton mediumBtn;
    @Bind(R.id.large_brush)
    ImageButton largeBtn;
    @Bind(R.id.small_eraser)
    ImageButton smallEraser;
    @Bind(R.id.medium_eraser)
    ImageButton mediumEraser;
    @Bind(R.id.large_eraser)
    ImageButton largeEraser;
    @Bind(R.id.bottom_drawer)
    ViewGroup btm;
    @Bind(R.id.previousbtn)
    ImageButton previousBtn;
    @Bind(R.id.nextbtn)
    ImageButton nextBtn;
    @Bind(R.id.framelayout)
    FrameLayout frameLayout;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.notespage_newnote);
        ButterKnife.bind(this);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);


        drawView = (DrawingView) findViewById(R.id.drawing);
        currPaint = bluePaint;
        currPaint.setImageResource(R.drawable.paint_pressed);
        smallBrush = getResources().getInteger(R.integer.small_size);
        mediumBrush = getResources().getInteger(R.integer.medium_size);
        largeBrush = getResources().getInteger(R.integer.large_size);
        drawView.setBrushSize(mediumBrush);
        bitmaps = new ArrayList<Bitmap>();
        bits = new Bitmap[40];
        drawView.setDrawingCacheEnabled(true);
        smallBtn.setOnClickListener(this);
        mediumBtn.setOnClickListener(this);
        largeBtn.setOnClickListener(this);
        smallEraser.setOnClickListener(this);
        mediumEraser.setOnClickListener(this);
        largeEraser.setOnClickListener(this);
        previousBtn.setOnClickListener(this);
        nextBtn.setOnClickListener(this);




        drawView.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                switch (event.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                        btm.setVisibility(View.GONE);
                        break;
                    case MotionEvent.ACTION_UP:
                        btm.setVisibility(View.VISIBLE);
                        break;
                    default:
                        return false;
                }

                return false;
            }
        });


    }


    public void paintClicked(View view) {
        //use chosen color
        drawView.setErase(false);
        drawView.setBrushSize(drawView.getLastBrushSize());
        if (view != currPaint) {
            //update color
            ImageButton imgView = (ImageButton) view;
            String color = view.getTag().toString();
            drawView.setColor(color);

            imgView.setImageDrawable(getResources().getDrawable(R.drawable.paint_pressed));
            currPaint.setImageDrawable(getResources().getDrawable(R.drawable.paint));
            currPaint = (ImageButton) view;
        }
        hideDrawer(colorNsize);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.newnote_menu, 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();

        //noinspection SimplifiableIfStatement
        if (id == R.id.clear_menuitem) {
            hideDrawer(colorNsize);
            hideDrawer(eraserDrawer);
            AlertDialog.Builder newDialog = new AlertDialog.Builder(this);
            newDialog.setTitle("Clear Board");
            newDialog.setMessage("Do you want to clear the board (you will lose the current drawing)?");
            newDialog.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                    drawView.startNew();
                    bitmaps.remove(j);
                    flag1 = true;

                    dialog.dismiss();
                }
            });
            newDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                    dialog.cancel();
                }
            });
            newDialog.show();

            return true;
        } else if (id == R.id.save_menuitem) {
            hideDrawer(colorNsize);
            hideDrawer(eraserDrawer);
            bitArrayStore(j);
            int k = 0;
            try {

                while (k <= bitmaps.size()) {


                    Bitmap m = null;

                    m = bitmaps.get(k);

                    String path = Environment.getExternalStorageDirectory().getAbsolutePath();
                    File file = new File(path + File.separator + "Pictures" + File.separator + k + "_image.png");
                    FileOutputStream ostream;
                    try {
                        file.createNewFile();
                        ostream = new FileOutputStream(file);
                        m.compress(Bitmap.CompressFormat.PNG, 100, ostream);
                        ostream.flush();
                        ostream.close();

                        final Snackbar snackbar = Snackbar.make(frameLayout, "Note Saved", Snackbar.LENGTH_LONG);
                        snackbar.setAction("Close", new View.OnClickListener() {
                            @Override
                            public void onClick(View v) {
                                snackbar.dismiss();
                            }
                        });
                        snackbar.show();

                    } catch (Exception e) {
                        e.printStackTrace();
                        Log.w("Skoolify", e);
                    }
                    k = k + 1;
                }
            } catch (IndexOutOfBoundsException e) {
                Log.w("Skoolify", "OutOFBonds");
            }
            return true;
        } else if (id == R.id.brush_menuitem) {
            if (colorNsize.getVisibility() == View.VISIBLE) {
                hideDrawer(colorNsize);
            } else {
                hideDrawer(eraserDrawer);
                showDrawer(colorNsize);
            }

            return true;
        } else if (id == R.id.eraser_menuitem) {
            if (eraserDrawer.getVisibility() == View.VISIBLE) {
                hideDrawer(eraserDrawer);
            } else {
                hideDrawer(colorNsize);
                showDrawer(eraserDrawer);
            }

            return true;
        }

        else if(id==R.id.delete_menuitem){
            hideDrawer(colorNsize);
            hideDrawer(eraserDrawer);
            AlertDialog.Builder newDialog = new AlertDialog.Builder(this);
            newDialog.setTitle("Discard the Notes");
            newDialog.setMessage("Do you want to discard the unsaved notes?");
            newDialog.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                    NewNote.this.finish();

                    dialog.dismiss();
                }
            });
            newDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                    dialog.cancel();
                }
            });
            newDialog.show();

        }

        return super.onOptionsItemSelected(item);
    }


    @Override
    public void onClick(View v) {
        if (v.getId() == R.id.small_brush) {
            drawView.setBrushSize(smallBrush);
            drawView.setLastBrushSize(smallBrush);
            drawView.setErase(false);
            hideDrawer(colorNsize);
        } else if (v.getId() == R.id.medium_brush) {
            drawView.setBrushSize(mediumBrush);
            drawView.setLastBrushSize(mediumBrush);
            drawView.setErase(false);
            hideDrawer(colorNsize);
        } else if (v.getId() == R.id.large_brush) {
            drawView.setBrushSize(largeBrush);
            drawView.setLastBrushSize(largeBrush);
            drawView.setErase(false);
            hideDrawer(colorNsize);
        } else if (v.getId() == R.id.small_eraser) {
            drawView.setErase(true);
            drawView.setBrushSize(smallBrush);
            hideDrawer(eraserDrawer);
        } else if (v.getId() == R.id.medium_eraser) {
            drawView.setErase(true);
            drawView.setBrushSize(mediumBrush);
            hideDrawer(eraserDrawer);
        } else if (v.getId() == R.id.large_eraser) {
            drawView.setErase(true);
            drawView.setBrushSize(largeBrush);
            hideDrawer(eraserDrawer);
        } else if (v.getId() == R.id.previousbtn) {
            hideDrawer(colorNsize);
            hideDrawer(eraserDrawer);
            try {
                bitArrayStore(j);
                drawView.startNew();
                j--;
                if (bitmaps.size() > j) {
                    drawView.redraw(bitmaps, j);
                }
            } catch (IndexOutOfBoundsException e) {
                j = 0;
                try {
                    drawView.redraw(bitmaps, j);
                }catch (IndexOutOfBoundsException e1){
                    drawView.startNew();
                }
            }
            flag = false;
        } else if (v.getId() == R.id.nextbtn) {
            hideDrawer(colorNsize);
            hideDrawer(eraserDrawer);
            if (j < 50) {
                bitArrayStore(j);
                if (flag == false) {
                    j++;
                }
                if (bitmaps.size() > j) {
                    drawView.startNew();
                    drawView.redraw(bitmaps, j);
                } else {
                    drawView.startNew();
                }
                flag = false;
            } else {
                Snackbar.make(v, "Reached page limit. Please save and start new note", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }

        }


    }


    public void bitArrayStore(int k) {

        if (drawView.canvasBitmap.sameAs(drawView.emptyBitmap)) {
            flag = true;
        } else {

            try {
                if (flag1 == false) {
                    drawView.buildDrawingCache();
                    drawView.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH);
                    bitmaps.set(k, Bitmap.createBitmap(drawView.getDrawingCache()));

                } else {
                    bitmaps.add(k, Bitmap.createBitmap(drawView.getDrawingCache()));
                    flag1 = false;
                }
            } catch (IndexOutOfBoundsException e) {
                bitmaps.add(k, Bitmap.createBitmap(drawView.getDrawingCache()));

            }
            drawView.destroyDrawingCache();

        }
    }

    public void redraww()
    {
        try{

            drawView.redraw(bitmaps, j);
        }catch (IndexOutOfBoundsException e){
            drawView.startNew();
        }

    }
    public void hideDrawer(ViewGroup viewgrp) {
        viewgrp.setVisibility(View.GONE);
    }

    public void showDrawer(ViewGroup viewgrp) {
        viewgrp.setVisibility(View.VISIBLE);
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        bitArrayStore(j);
        outState.putParcelableArrayList("Bits", bitmaps);
        outState.putInt("j", j);
        super.onSaveInstanceState(outState);
    }

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        bitmaps=savedInstanceState.getParcelableArrayList("Bits");
        j = savedInstanceState.getInt("j");
        redraww();

    }
}
public class DrawingView extends View {

    //drawing path
    private Path drawPath;
    //drawing and canvas paint
    private Paint drawPaint, canvasPaint;
    //initial color
    private int paintColor = 0xFF0000c4;
    //canvas
    private Canvas drawCanvas;
    //canvas bitmap
    public Bitmap canvasBitmap, emptyBitmap;
    private float brushSize, lastBrushSize;
    private boolean erase = false;


    public DrawingView(Context context, AttributeSet attrs) {
        super(context, attrs);
        setupDrawing();
    }

    private void setupDrawing() {
        brushSize = getResources().getInteger(R.integer.small_size);
        lastBrushSize = brushSize;
        drawPath = new Path();
        drawPaint = new Paint();
        drawPaint.setColor(paintColor);
        drawPaint.setAntiAlias(true);
        drawPaint.setStrokeWidth(20);
        drawPaint.setStyle(Paint.Style.STROKE);
        drawPaint.setStrokeJoin(Paint.Join.ROUND);
        drawPaint.setStrokeCap(Paint.Cap.ROUND);
        canvasPaint = new Paint(Paint.DITHER_FLAG);
    }

    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
//view given size
        super.onSizeChanged(w, h, oldw, oldh);
        canvasBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
        drawCanvas = new Canvas(canvasBitmap);
        emptyBitmap = Bitmap.createBitmap(canvasBitmap.getWidth(), canvasBitmap.getHeight(), canvasBitmap.getConfig());
    }

    @Override
    protected void onDraw(Canvas canvas) {
//draw view
        canvas.drawBitmap(canvasBitmap, 0, 0, canvasPaint);
        canvas.drawPath(drawPath, drawPaint);

    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
//detect user touch
        float touchX = event.getX();
        float touchY = event.getY();
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                drawPath.moveTo(touchX, touchY);
                break;
            case MotionEvent.ACTION_MOVE:
                drawPath.lineTo(touchX, touchY);
                break;
            case MotionEvent.ACTION_UP:
                drawCanvas.drawPath(drawPath, drawPaint);
                drawPath.reset();
                break;
            default:
                return false;
        }
        invalidate();
        return true;
    }

    public void setColor(String newColor) {
//set color
        invalidate();
        paintColor = Color.parseColor(newColor);
        drawPaint.setColor(paintColor);
    }

    public void setBrushSize(float newSize) {
//update sizefloat pixelAmount = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
        float pixelAmount = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
                newSize, getResources().getDisplayMetrics());
        brushSize = pixelAmount;
        drawPaint.setStrokeWidth(brushSize);
    }

    public void setLastBrushSize(float lastSize) {
        lastBrushSize = lastSize;
    }

    public float getLastBrushSize() {
        return lastBrushSize;
    }

    public void setErase(boolean isErase) {
//set erase true or false
        erase = isErase;
        if (erase) drawPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
        else drawPaint.setXfermode(null);
    }

    public void startNew() {
        drawCanvas.drawColor(0, PorterDuff.Mode.CLEAR);
        invalidate();


//        Bitmap b= BitmapFactory.decodeFile("/storage/emulated/0/Pictures/image.png");
//        drawCanvas.drawBitmap(b, 0, 0, null);
//
//        invalidate();

    }


    public void redraw(ArrayList<Bitmap> bits, int i) {
        try {

                drawCanvas.drawBitmap(bits.get(i), 0, 0, canvasPaint);
                invalidate();


        }catch (NullPointerException e){
            Log.w("DrawingApp","Exception");
        }
    }


}
protected void onCreate(Bundle savedInstanceState){
      if(savedInstanceState != null){
            bitmaps=savedInstanceState.getParcelableArrayList("Bits");
            j = savedInstanceState.getInt("j");
     }

     // go ahead with your object initialization. Once your `drawCanvas` is ready and initialized, then call `redraww`.
}
//view given size
        super.onSizeChanged(w, h, oldw, oldh);
        canvasBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
        drawCanvas = new Canvas(canvasBitmap);
        emptyBitmap = Bitmap.createBitmap(canvasBitmap.getWidth(), canvasBitmap.getHeight(), canvasBitmap.getConfig());
@Override
    public void onWindowFocusChanged(boolean hasFocus) {
        if (hasFocus) {
            if (flag2 == true) {
                redraww();
            }
        }
    }