绘图在片段之间切换时删除

时间:2013-03-13 12:53:40

标签: android

我在标签主机中添加了2个片段。在第二个片段中我可以做一些绘图。当我在这两个片段之间切换时,我的第二个片段中的绘图被删除了。我不知道为什么?

这是第二个片段。

public class DrawingFragment extends BaseFragment  implements android.view.View.OnClickListener {
    private Context     context = null;
    private Bitmap backGroundBitmap =  null;
    private DrawingViewHolder viewHolder = null;

    /**
     * 
     */
    @Override
    public void onAttach(Activity arg0) {
        super.onAttach(arg0);
        this.context=arg0;
    }
    public DrawingFragment() {

    }
     public DrawingFragment(Bitmap bitmap) {
         this.backGroundBitmap  = bitmap;
     }
    @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            View view = inflater.inflate(R.layout.drawing_dialog, container,false);
            viewHolder = new DrawingViewHolder();
            viewHolder.initUiContents(view);
            return view;
        }
    /**
     * 
     * @author Qandil
     *
     */
    private class DrawingViewHolder{
        private Button btnDoneDrawing       = null;
        private Button btnEraserDrawing     = null;
        private Button btnPencilDrawing     = null;
        private Button btnDeleteDrawing     = null;
        private LinearLayout llDrawingMain  = null;
        private DrawView    drawingView     = null;

        private void initUiContents(View view){
            btnDoneDrawing = (Button) view.findViewById(R.id.btn_drawing_done);
            btnEraserDrawing = (Button) view.findViewById(R.id.btn_drawing_eraser);
            btnPencilDrawing = (Button) view.findViewById(R.id.btn_drawing_pencil);
            btnDeleteDrawing = (Button) view.findViewById(R.id.btn_drawing_delete);
            llDrawingMain = (LinearLayout) view.findViewById(R.id.ll_drawing_dialog_main);
            drawingView = (DrawView)view.findViewById(R.id.custom_dv2);
            btnDoneDrawing.setOnClickListener(DrawingFragment.this);
            btnEraserDrawing.setOnClickListener(DrawingFragment.this);
            btnPencilDrawing.setOnClickListener(DrawingFragment.this);
            btnDeleteDrawing.setOnClickListener(DrawingFragment.this);
            Drawable dr = new BitmapDrawable(backGroundBitmap);
            llDrawingMain.setBackgroundDrawable(dr);
        }

    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.btn_drawing_done:
            ((CaseActivity) getActivity()).popFragments();
            break;
        case R.id.btn_drawing_delete:
            ((CaseActivity) getActivity()).popFragments();
            break;

            default:
                break;
        }
    }
    /* (non-Javadoc)
     * @see android.support.v4.app.Fragment#onDestroyView()
     */
    @Override
    public void onDestroyView() {
        super.onDestroyView();
    }


    /* (non-Javadoc)
     * @see android.support.v4.app.Fragment#onDetach()
     */
    @Override
    public void onDetach() {
        super.onDetach();
    }
}

drawing_dialog.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/ll_drawing_dialog_main"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <LinearLayout
        android:id="@+id/ll_drawing_dialog"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:background="@drawable/img_draw_photo_bg"
        android:orientation="vertical" >

        <RelativeLayout
            android:id="@+id/top_bar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@drawable/img_top_bar" >

            <TextView
                android:id="@+id/tv_draw_picture"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerInParent="true"
                android:text="@string/tv_draw_picture"
                android:textColor="#ffffff"
                android:textSize="18sp"
                android:textStyle="bold" />
        </RelativeLayout>

        <LinearLayout
            android:id="@+id/ll_header_drawing_dialog"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:background="@drawable/img_top_bar"
            android:gravity="center" >

            <Button
                android:id="@+id/btn_drawing_done"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:background="@drawable/img_drawing_done" />

            <Button
                android:id="@+id/btn_drawing_eraser"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="50dp"
                android:background="@drawable/img_drawing_eraser" />

            <Button
                android:id="@+id/btn_drawing_pencil"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="50dp"
                android:background="@drawable/img_drawing_pencil" />

            <Button
                android:id="@+id/btn_drawing_delete"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="50dp"
                android:background="@drawable/img_drawing_dlt" />
        </LinearLayout>

        <RelativeLayout
            android:id="@+id/rlt_drawing_component"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent" >
 <view
                                android:id="@+id/custom_dv2"
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                class="com.avhl.view.activity.DrawView"
                                android:background="#00000000" />
        </RelativeLayout>
    </LinearLayout>

</LinearLayout>

DrawView.java

public class DrawView extends View{
    private Bitmap cache;
    private Queue<PointF> points;
    private PointF from;
    private Context context;
    private Paint paint ;

    public DrawView(Context context,AttributeSet attr) {
        super(context,attr);
          this.context=context;

          points = new ConcurrentLinkedQueue<PointF>();
          paint = new Paint();
          paint.setAntiAlias(true);
          paint.setStrokeWidth(8);
          paint.setColor(Color.GRAY);
          paint.setDither(true);                    // set the dither to true
          paint.setStyle(Paint.Style.FILL_AND_STROKE);       // set to STOKE
          paint.setStrokeJoin(Paint.Join.ROUND);    // set the join to round you want
          paint.setStrokeCap(Paint.Cap.ROUND);      // set the paint cap to round too
          setFocusable(true);
          setFocusableInTouchMode(true);
    }
    /***
     * on touch event
     */
    @Override
    public boolean onTouchEvent(MotionEvent evt) {
        setPressed(true);
         int pointerIndex = ((evt.getAction() & MotionEvent.ACTION_POINTER_ID_MASK)
                 >> MotionEvent.ACTION_POINTER_ID_SHIFT);
               int pointerId = evt.getPointerId(pointerIndex);
        if(pointerId==0){
        switch (evt.getAction()) {
        case MotionEvent.ACTION_DOWN: 
            from = new PointF(evt.getX(), evt.getY()); 
            break;
        case MotionEvent.ACTION_MOVE: 
            points.add(new PointF(evt.getX(), evt.getY()));
            invalidate();
            break;
        case MotionEvent.ACTION_UP: 
            break;
        default: 
            from = null;
        }
        }else{
            return false;
        }
        return true;
    }
/**
 * 
 * @param systemCanvas
 */
    @Override
    public void onDraw(Canvas systemCanvas) {
        int w = getWidth();
        int h = getHeight();
        if (w == 0 || h == 0)
            return;
        if (cache == null)
            cache = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
        // Draw on the cache
        Canvas canvas = new Canvas(cache);
            drawPoints(points, canvas, paint);
        // Draw the cache with the system canvas
        systemCanvas.drawBitmap(cache, 0, 0, paint);
    }

    /*
     * for drawing line or dot
     */
    private void drawPoints(Queue<PointF> points, Canvas canvas, Paint paint) {
        if (from == null)
            return;
        PointF to;
        while ((to = points.poll()) != null) {
            canvas.drawLine(from.x, from.y, to.x, to.y, paint);
            from = to;
        }

   }
}   

在MianActivity中,我只需通过调用更改的选项卡上的ft.replace()替换我的第一个片段的DrawingFragment选项卡。

1 个答案:

答案 0 :(得分:1)

您可以尝试在片段onCreate中调用Fragment.setRetainInstance(true)。这样可以确保重用相同的片段实例,而不是创建新的片段实例。

如果没有一些代码来展示你在做什么,很难更有帮助